Продолжение. Начало смотрите в "Многозадачность в WinNT"
Попытаюсь развить свою мысль, начатую в предыдущем сообщении. Для переключения задач в Windows 3.X использовался механизм, называемый корпоративной многозадачностью. Заключался он в следующем: обработав очередное сообщение, приложение передает управление операционной системе, которая может передать управление другому приложению. Недостатки этого механизма очевидны: если обработка сообщения затягивается или, неважно по какой причине, в программе образовался бесконечный цикл, то ОС не может переключиться на другую задачу.
В Windows 4.X и в Windows NT реализован принципиально другой вид многозадачности, в котором операционная система действительно контролирует и управляет процессами, потоками и их переключением. Способность операционной системы прервать выполняемый поток практически в любой момент времени и передать управление другому ожидающему потоку определяется термином preemptive multitasking — преимущественная, или вытесняющая, многозадачность.
Реализация ее выглядит так: все существующие в данный момент потоки, часть из которых может принадлежать одному и тому же процессу, претендуют на процессорное время и, с точки зрения пользователя должны выполняться одновременно. Для создания этой иллюзии система через определенные промежутки времени забирает управление, анализирует свою очередь сообщений, распределяет сообщения по другим очередям в пространстве процессов и, если считает нужным, переключает потоки.
Так вот интерес (затруднение), вызвал механизм, помогающий забрать управление с любой задачи пользователя.
Проведём эксперимент: зациклим свою программу, одним из известных способов (я, например, делал это так: jmp $) и запустим в среде Windows NT (в моём случае это Windows NT 5.0). Система тормозит (окно диспетчера задач прорисовывается около минуты), но не виснет. То есть шанс есть завершить зависшую задачу.
С уважением Грызун А.Н.
gryzun@rbcmail.ru