Переключение контекста потока задач

Я читал и читал, что если я использую задачи вместо потоков в .Net, они не будут восприимчивы к переключениям контекста, с которыми возникают проблемы с потоками.

Однако, читая вокруг, я также заметил, что задачи все равно используют потоки под прикрытием.

Так что я немного смущен, любые разъяснения приветствуются.


person TheWommies    schedule 04.12.2011    source источник
comment
Возможно, вам следует опубликовать найденный вами URL-адрес, который дал вам неверную информацию.   -  person John Saunders    schedule 05.12.2011


Ответы (2)


То, что вы прочитали, неверно.

Task является частью TPL. TPL использует более продвинутый планировщик, чем пул потоков CLR. Например, планировщик TPL использует ссылку WorkStealingQueues.

Несколько фактов:

  • Делаете ли вы Task.Factory.StartNew или ThreadPool.QueueUserWorkItem, оба будут использовать один и тот же пул потоков (.NET 4.0)
  • Независимо от того, используете ли вы Task или «сырые» потоки, каждый квант времени вызовет переключение контекста.
  • Кроме того, если поток с более высоким приоритетом станет доступным для выполнения, это вызовет переключение контекста.
  • Task вызовет столько же переключений контекста, сколько и обычный поток.

Обратите внимание, что переключение контекста происходит только в том случае, если не хватает процессоров для одновременной обработки потоков.

Некоторые ссылки для ознакомления:

person ebb    schedule 05.12.2011

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

person David Schwartz    schedule 04.12.2011
comment
Переключение контекста не свойственно потокам? Мир изменился с тех пор, как я был молод. - person John Saunders; 05.12.2011
comment
Нет, они не. Если у вас есть четыре готовых к запуску потока и четыре ядра, каждое ядро ​​может выполнять один и тот же поток в течение того же времени, что и процесс. Единственный раз, когда вы получаете дополнительное переключение контекста с потоками, это когда поток, который работает, больше не может выполнять работу, даже если есть еще работа. Если это произойдет, это потому, что ваш код создал эту ситуацию. (Задачи избегают этого, позволяя уже работающему потоку выполнять всю необходимую работу.) - person David Schwartz; 05.12.2011
comment
Или, может быть, когда ОС решит, что хочет сделать что-то еще вместо того, чтобы запускать ваши четыре потока? - person John Saunders; 05.12.2011
comment
Конечно, но этот переключатель контекста не имеет ничего общего с многопоточностью. Это произошло бы так же, если бы было запущено четыре разных процесса. - person David Schwartz; 05.12.2011
comment
Потоки — это единственные вещи, которые переключают контекст. Потоки внутри процесса могут переключать контекст, но процесс этого не делает. И где в обсуждение вошли процессы? Вопрос о потоках и задачах. - person John Saunders; 05.12.2011
comment
Я не знаю, намеренно ли вы пытаетесь меня неправильно понять, но контекст вопроса - многопоточность и приводит ли это к дополнительным переключениям контекста. Я думаю, что вы намеренно выделяете мое первое предложение и игнорируете тот факт, что это ответ на вопрос, который уточняется в следующих сразу за ним предложениях. - person David Schwartz; 05.12.2011
comment
Я читал и читал, что если я использую задачи вместо потоков в .Net, они не будут восприимчивы к переключениям контекста, с которыми возникают проблемы с потоками. Вы думали, когда он сказал «Задачи», он имел в виду процессы? Он спрашивает о двух разных методах многопоточности в .NET, а не о многопоточности и не многопоточности. - person John Saunders; 05.12.2011
comment
Я это понимаю. Вот почему я написал, что задачи используют потоки таким образом, что любой запущенный поток может взять на себя любую задачу, которую нужно выполнить, избегая дорогостоящих переключений контекста, которые происходят при неправильном использовании потоков. - person David Schwartz; 05.12.2011
comment
Хорошо, теперь я тебя понимаю. Вам очень нужно уточнить. Вы имеете в виду, что нет никаких переключений контекста, присущих процессу переключения между задачами. Вы не имеете в виду, что операционная система никогда не вытесняет поток. Конечно, вытеснение присуще потокам, но можно избежать переключений контекста при переключении с одной части работы на другую, используя задачи для инкапсуляции этой работы вместо необработанных потоков. - person John Saunders; 05.12.2011
comment
Упреждающее прерывание не присуще потокам, оно свойственно упреждающей многозадачной ОС. Ничто в использовании потоков не требует какого-либо вытеснения, которое не произошло бы в противном случае. - person David Schwartz; 05.12.2011
comment
С уважением, есть ли какая-нибудь операционная система, о которой кто-то заботится, которая не использует вытеснение? Ваше заявление несколько академично. - person John Saunders; 05.12.2011
comment
Единственный раз, когда вы получаете дополнительное переключение контекста с потоками, это когда поток, который работает, больше не может выполнять работу, даже если есть еще работа. Извините, я этого не понимаю. Не могли бы вы пояснить, конечно, если вы пишете код, и в вашем потоке больше нет работы, вы его убиваете? - person TheWommies; 05.12.2011
comment
@AllenHo Я не уверен, как мне сделать это яснее, чем я уже сделал. Если поток выполняется и больше нечего делать, переключение контекста является обязательным, хотя бы по какой-либо другой причине, чтобы переключиться на бездействующий процесс системы. Если поток работает, и осталось сделать больше работы, и этот поток может выполнить эту работу, то дополнительного переключения контекста не будет — поток выполнит любую работу, которую он должен выполнить дальше. Единственный раз, когда вы получаете дополнительное переключение контекста, это когда поток завершает выполнение некоторой работы, есть еще работа, которую нужно сделать, и этот поток не может ее выполнить. (Таким образом, вы переключаетесь на нить, которая может.) - person David Schwartz; 05.12.2011
comment
@JohnSaunders Я не упоминал об упреждении. Но в любом случае это неважно. Если только люди, разрабатывавшие вашу ОС, не идиоты (а они таковыми не являются), они позволили бы одной вещи преобладать над другой только в том случае, если бы это было выгодно. Так что жаловаться на переключение контекста из-за упреждения глупо — они повышают производительность. Единственная проблема здесь — это плохие переключения контекста. (На самом деле, еще одно преимущество потоков заключается в том, что они облегчают вытеснение, позволяя переключать контекст там, где это выгодно.) - person David Schwartz; 07.02.2012
comment
@DavidSchwartz: возможно, операционные системы изменились с тех пор, как я был молод, и никто не удосужился мне сказать. Раньше переключение контекста происходило всякий раз, когда в состоянии Ready было больше потоков, чем было процессоров для их запуска. В этом случае каждому потоку Ready будет разрешено выполняться в течение квантового периода, после чего произойдет переключение контекста на другой поток Ready. Возможно, справедливость считалась полезной. - person John Saunders; 07.02.2012
comment
@JohnSaunders Верно, но в этих переключениях контекста нет необходимости. Они преднамеренно реализованы операционной системой, потому что они улучшают работу лучше. Жаловаться на хорошие переключения контекста иррационально, а пытаться минимизировать их — самоубийственно. Проблема заключается в плохих переключениях контекста, которые происходят только при обстоятельствах, которые я объяснил. (Когда есть работа, которую необходимо выполнить, но выполняемый в данный момент поток не может продвигаться вперед, требуется переключение контекста, чтобы система могла продвигаться вперед, даже если переключение контекста было бы вредным.) - person David Schwartz; 08.02.2012
comment
@DavidSchwartz: не обязательно? Сделать его лучше? Они делают это возможным! - person John Saunders; 08.02.2012
comment
@JohnSaunders Правильно, они не нужны. Система в целом может продолжать развиваться и без них. Но в любом случае это хорошие переключатели контекста. Вы не хотели бы избежать или минимизировать их. Проблема здесь в плохих переключениях контекста, которые ухудшают ситуацию, так что это не имеет значения. - person David Schwartz; 08.02.2012
comment
Рад видеть, что они оба перестали лезть друг в друга!! Ребята, вам нужны номера друг друга? - person Mukus; 09.12.2012