Чтобы объяснить больше, предположим, что у нас есть двухъядерный ЦП без гиперпоточности, это означает, что он может обрабатывать только 2 потока одновременно, ну, теперь предположим, что у нас есть сетевое приложение, которое запускает два фоновых сетевых потока, каждый из которых ожидает входящих соединений обрабатывать, поэтому эти потоки должны работать все время, теперь, почему процессы и потоки другой ОС все еще работают ?! как мне кажется, они не могут быть обработаны, потому что два потока полностью истощают процессорный процессор, потому что они ожидают сетевых подключений и, следовательно, они должны быть готовы каждую наносекунду для соединений ... Как это происходит и работает? Как процессор может обрабатывать много и много потоков одновременно без какого-либо заметного зависания ?! (Я знаю, иногда окна становятся медленными и сумасшедшими, если одновременно запускается много тяжелых программ, но это не общая проблема)

Благодарю.

3 ответа3

5

Ответ относительно прост: когда поток ожидает события ввода-вывода, он возвращает оставшуюся часть своего времени ОС, которая затем может запланировать другой поток. По завершении ввода-вывода с высокой задержкой поток помечается как готовый к выполнению.

Это в значительной степени возможно, потому что большинство операций ввода-вывода управляется прерываниями, а не многократной проверкой, чтобы увидеть, завершился ли запрос ввода-вывода (известный как опрос).

2

Если вы используете совместную многозадачность и у вас плохая программа: тогда да, вы правы.

Однако в реальном мире должно произойти следующее:

  1. Совместная многозадачность: я не продолжаю использовать процессор вечно. Вместо этого он либо даст другой программе шанс через некоторое время, либо когда он заблокирован.
    Ответ Павла описывает последнее.

  2. Упреждающая многозадачность (используется практически везде): ОС (не программа) на короткое время отдает ЦП программе, а затем отнимает ее. Это может быть так же просто, как запуск таймера и один раз, когда истечет время, остановив процесс и передав его следующему шагу / программе, которая ожидает.


В вашем случае подумайте об этом как о офисе с двумя работниками и тремя (или более) задачами. (Позволяет называть их задача-A, задача-B и задача-C).

Первая сработала проверяет приказы супервайзеров, в которых говорится:

  • Установите таймер на 10 минут. Когда это закончится, перестаньте работать над текущей задачей, поместите ее в конец списка TODO и продолжайте читать этот документ.
  • Затем удалите первый элемент из верхней части списка TODO и начните работать над ним.
  • Повторение.

Работник 1 устанавливает таймер и получает первое задание из списка TODO (в данном случае это задание A).

Работник 2 делает то же самое: он устанавливает таймер и получает то, что сейчас находится сверху списка TODO. Так как рабочий 1 удалил задачу-А из нее, рабочий 2 теперь начинает выполнение задачи-Б.

Десять минут спустя таймер отключается. Работник 1 прекращает работу над заданием A и получает инструкции супервизора. В них указано, что текущая задача находится внизу списка TODO. Продолжая инструкции супервизора, он теперь перезапускает таймер и начинает работать над тем, что сейчас находится наверху списка TODO (который является задачей C).

Работник 2 делает то же самое, останавливает задачу B и начинает с верхней части списка TODO (в данном примере это задача A).

И т.д.

Это несколько упрощено. Но это должно дать вам представление о том, как два шага (рабочие) могут работать 100% времени в трех или более задачах.

В реальных планировщиках есть еще много вещей. Например, прерывания (сравните это с звонком телефона в середине задачи и как с этим справиться), умное планирование (передача одной и той же задачи одному и тому же работнику, вероятно, приведет к тому, что она будет выполнена быстрее, так как работник уже знаком с ней), I/O (если работнику нужна книга из библиотеки (библиотек), он не будет ждать, пока не истечет таймер, но сразу же продолжит выполнение следующей задачи и т.д. И т.д.

0

ОС остается стабильной практически так же, как она остается стабильной, когда на разных процессорах работают несколько потоков. Снаружи ядра ЦП наблюдается очень небольшая очевидная разница в поведении между двумя LP в одном ядре и одним LP в каждом из двух разных ядер. В обоих случаях должны использоваться все те же «безопасные для многих процессоров» методы программирования, такие как семафоры.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .