Поиск

Потоки и многозадачность

Поток является единицей обработки данных, а многозадачность — это одновременное исполнение нескольких потоков. Существует два вида многозадачности — совместная (cooperative) и вытесняющая (preemptive). Самые ранние версии Microsoft Windows поддерживали совместную многозадачность. Это означало, что каждый поток отвечал за возврат управления процессору, чтобы тот смог обработать другие потоки. Тот, кто раньше работал с другими ОС [в моем случае это IBM System/38 (CPF) и OS/2], может рассказать историю, как в один прекрасный день он "подвесил" компьютер, забыв поместить вызов PeekMessage, чтобы обеспечить обслуживание процессором других потоков в системе. Типичный ответ был: "Что поделаешь!"

Однако Microsoft Windows NT и (позже) Windows 95, Windows 98 и Windows 2000 стали поддерживать вытесняющую многозадачность, которую поддерживала OS/2. При этом процессор отвечает за выдачу каждому потоку определенного количества времени, в течение которого поток может выполняться, — кванта времени (timeslice). Далее процессор переключается между разными потоками, выдавая каждому потоку его квант времени, а программист может не заботится о том, как и когда возвращать управление, в результате чего могут работать и другие потоки. Поскольку .NET будет работать только в ОС с вытесняющей многозадачностью, то именно ей я уделю основное внимание.

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