2013-12-19 4 views
0

Мне было интересно, когда .Net, скорее всего, переключится с потока на другой? Насколько я понимаю, мы не можем предсказать, когда это произойдет именно так, но разве в этом есть интеллект? Например, когда поток выполняется, он попытается дождаться возврата метода или завершения цикла до переключения?C# Когда произойдет переключение потоков?

+1

В отсутствие системных вызовов или других прерываний вы можете ожидать, что поток будет переключен планировщиком ОС. Это происходит порядка десятков миллисекунд. –

ответ

5

Я не эксперт в .NET, но в общем планировании обрабатывается ядром.

  1. Либо квант времени вашего потока истек (нити/процессы только получить определенное количество времени CPU)

  2. Ваш поток заблокировал для IO.

  3. Некоторые другие неясные причины, такие как ожидание сообщения IPC, сетевой пакет или что-то в этом роде.

Нити могут быть выгружены в любой точке вдоль пути выполнения, будь то в цикле или возврате из функции. Это вообще не обрабатывается базовой виртуальной машиной (.NET или JVM), но контролируется ОС.

+1

Я забыл упомянуть, конечно, виртуальная машина может вызвать YIELD() (или что-то еще) для ручной перепланирования, но на самом деле нет причин для этого. – zhiayang

0

Конечно, есть «интеллект», своего рода :). Набор рабочих потоков может изменяться только при прерывании:

Фактическое аппаратное прерывание от периферийного устройства, например. диск, сетевой адаптер, КБ, мышь, таймер.

Программное прерывание (т.е. системный вызов), который может изменять состояние потока/s. Это включает вызовы сна и вызовы для ожидания/сигнала на межпоточных синхронизирующих объектах, а также вызовы ввода-вывода, которые запрашивают данные, которые не доступны сразу.

Если нет прерывания, ОС не может изменить набор работающих потоков, потому что он не введен. ОС не знает или не заботится о циклах, вызовах функций/методов (кроме тех, которые делают системные вызовы, как указано выше), gotos или любых других механизмов управления потоком пользовательского уровня.

0

Я прочитал ваш вопрос сейчас, это не может быть rellevant больше, но после прочтения выше ответов, я хочу просто, чтобы убедиться:

Нить управляется (или, как я знаю) по к которому они принадлежат. Нет ничего общего с операционной системой (и это основная причина, по которой работа с многопоточными файлами происходит быстрее, чем работа с многопроцессорными процессами, поскольку обмен данными между потоками и переключение между ними происходит быстрее, чем контекстный переключатель, который возникает между процесс с помощью Краткосрочного планировщика). (ПРИМЕЧАНИЕ: существуют потоки потоков USER_MODE и потоки KERNEL_MODE: каждый из них может иметь оба из них или только из них. В любом случае поток, работающий в среде пользовательского приложения, рассматривается как поток USER_MODE и управляется процессом, к которому он принадлежит.)

Я пишу? Спасибо !!!

Смежные вопросы