О многозадачности Windows
О многозадачности Windows Что ответит неискушенный пользователь персонального компьютера, не понаслышке знакомый как с отечественными ЕС18xx, так и с современными вычислительными системами, на вопрос: "А чем же все-таки отличается операционная система Microsoft Windows от MS DOS (той же самой Microsoft)"?
Скорее всего, мы услышим о замечательном графическом интерфейсе, об удобстве "щелканья и перетаскивания" мышью, о длинных именах файлов, о мультимедийных возможностях, об Internet. Возможно, кто-то вспомнит о том, что Windows позволяет запускать несколько программ одновременно и дает возможность оперативно переключаться между ними.
Темой этой статьи является рассмотрение той особенности Windows, которая скрыта от глаз, но является свойством, которое ставит эту операционную систему в один ряд с такими продуктами, как UNIX и OS/2. Мы будем говорить о многозадачности.
Раньше, когда "мониторы были маленькие, а дискеты — большие", первоочередной задачей операционной системы (ОС) персональной ЭВМ (ПЭВМ) являлось обеспечение хранения информации на внешних носителях. Функции, отвечающие за управление периферийными устройствами и обеспечивающие среду выполнения программ, находились на элементарном уровне развития.
Но времена меняются, появляются все более быстрые процессоры и все более емкая память, что позволяет, наконец, разработчикам ОС ПЭВМ позаботиться об удобствах пользователей, а не бездушного железа. Одним словом, восторженная публика встречает линейку операционных систем Windows.
Наряду с шокирующим по тем временам внешним отличием от операционных систем предыдущего поколения (рабочий стол с пиктограммами действовал на пользователей, привыкших к черной бездне экрана в DOS или, в лучшем случае, к голубизне NC, как чайное ситечко на Эллочку-людоедку), Windows предоставляла мощные механизмы, которые оценили, прежде всего, программисты.
Переходя к рассмотрению многозадачности, разберемся с ее основными понятиями, общими для множества многозадачных ОС.
Приложение, выполняемое в среде многозадачной ОС, называется процессом. Другими словами, процесс (process) — это программа, загруженная в память и подготовленная к исполнению. Windows позволяет выполнять несколько процессов одновременно, причем каждый процесс имеет свое собственное виртуальное адресное пространство, защищенное от посягательств других процессов (то есть от воздействия выполняющихся в это же время программ).
Если бы история Windows прервалась на третьей версии, то к сказанному почти нечего было бы добавить. Кстати, в Windows 3.1 ответственность за реализацию многозадачности во многом возлагалась на совесть приложений. Суть этого высказывания заключается в том, что операционная система после передачи управления приложению терпеливо ожидала разрешения продолжить выполнять свои диспетчерские функции. При этом "недобросовестная" программа могла монополизировать ресурсы центрального процессора и не пожелать делиться ими с "конкурентами".
Но 95-й год прошлого века ознаменовался выходом одноименной версии Windows. Новый продукт претерпел серьезную переработку, не был забыт и механизм реализации многозадачности.
Теперь базовой единицей многозадачности является не процесс, а нить (thread) — исполняемая часть кода приложения. Каждый процесс начинается единственной нитью, но во время работы приложения по мере необходимости могут создаваться дополнительные нити. Каждая нить может выполнять любую часть программного кода приложения, все нити имеют доступ к виртуальному адресному пространству своего процесса, к его глобальным переменным и ресурсам ОС. В свою очередь, любая нить может запустить дочернюю нить или процесс.
В отличие от Windows 3.1, последующие версии реализуют механизм вытесняющей многозадачности. Инициатива полностью принадлежит ОС: именно ОС разделяет время центрального процессора между нитями. По истечении выделенной порции времени нить останавливается, и управление передается конкурирующей нити. Для обеспечения переключения между нитями каждая нить поддерживает набор структур, в которых сохраняются машинные регистры, стек, окружение нити. При получении управления нить восстанавливает свое окружение и продолжает выполнять работу с того места, где была прервана в прошлый раз.
Квант времени, предоставляемый отдельной нити операционной системой, достаточно мал (порядка 20 мс), и столь быстрое переключение между нитями создает впечатление их одновременного выполнения. Тем не менее, на однопроцессорных системах каждая нить отрывает свою долю из общего времени центрального процессора, что приводит к замедлению каждой нити в отдельности.
Вряд ли имеет смысл долго говорить о возможностях, которые предоставляет многозадачность. В общем случае многопроцессный подход может оказаться полезным в ситуации, когда функции системы размещены в отдельных исполняемых модулях, но могли бы быть объединены в одном приложении. В документации по WIN32 API рекомендуется использовать многонитевой подход для создания отдельной нити, отвечающей за интерфейс с пользователем, при "конкурентном" выполнении нескольких задач, для управления многооконными приложениями. И все же каждому программисту самому предстоит решать, где в его области применить возможность параллельного исполнения участков кода.
Отметим только, что наряду с очевидными в некоторых случаях преимуществами, многозадачность имеет и свои отрицательные стороны. Для хранения структур с информацией о состояниях нитей и процессов расходуется память, большое количество выполняемых нитей загружают центральный процессор, во избежание конфликтов необходимо заботиться о синхронизации выполнения нитей.
В завершение разговора о многозадачности нельзя не затронуть некоторые смежные вопросы.
С одной стороны, все выглядит просто замечательно: приложение выполняется, нисколько не заботясь о своих соседях, использует память по своему усмотрению. С другой стороны, в ряде случаев может возникнуть необходимость обмена информацией между параллельно выполняющимися процессами. Как быть?
К счастью, разработчики ОС Windows предусмотрели специальные средства "межпроцессного" взаимодействия, как то "дыры" pipes, "почтовые щели" mailslots, файлы, объекты синхронизации (некоторые из этих объектов удобно использовать для блокировки выполнения нити до наступления события, другие применяются для защиты разделяемых ресурсов от одновременного использования).
Приступая к работе над программой и принимая решение об использовании в ней многозадачности, следует убедиться, а нет ли альтернативного подхода к решению проблемы? Дело в том, что WIN32 предоставляет некоторые дополнительные возможности выполнения множества задач без организации многонитевого процесса.
Так, например, асинхронный ввод/вывод (overlapped I/O) позволяет одной нити инициировать множество требующих времени запросов ввода/вывода, которые выполняются конкурентно.
Интересной возможностью является способность Windows останавливать выполнение нити до наступления одного или нескольких событий. Примерами таких событий могут служить изменение содержимого каталога на диске (создания/удаления файла) или изменение свойств файла, консольный ввод, завершение процесса или нити. Поэтому, перед тем как бросаться в бой и создавать нить или процесс с помощью функций CreateThread () или CreateProcess (), стоит оценить возможности "ждущих" функций WaitForSingleObject () и WaitForMultipleObjects (), которые позволяют организовать мониторинг над событиями проще и с более экономным использованием времени центрального процессора.
Подводя итог, вспомним, о чем говорилось в этой статье. Рост возможностей персональных вычислительных систем послужил толчком к развитию ОС ПЭВМ, в том числе позволил полноценно реализовать в них механизм многозадачности (ОС больших ЭВМ уже давно были ориентированы на выполнение множества задач и, кроме того, множеством пользователей). На примере ОС Windows были рассмотрены понятия процесса и нити, вытесняющей и не вытесняющей многозадачности, затронуты вопросы практического использования многозадачных возможностей этой ОС при разработке программ.
Игорь Орещенков
(c) компьютерная газета
Скорее всего, мы услышим о замечательном графическом интерфейсе, об удобстве "щелканья и перетаскивания" мышью, о длинных именах файлов, о мультимедийных возможностях, об Internet. Возможно, кто-то вспомнит о том, что Windows позволяет запускать несколько программ одновременно и дает возможность оперативно переключаться между ними.
Темой этой статьи является рассмотрение той особенности Windows, которая скрыта от глаз, но является свойством, которое ставит эту операционную систему в один ряд с такими продуктами, как UNIX и OS/2. Мы будем говорить о многозадачности.
Раньше, когда "мониторы были маленькие, а дискеты — большие", первоочередной задачей операционной системы (ОС) персональной ЭВМ (ПЭВМ) являлось обеспечение хранения информации на внешних носителях. Функции, отвечающие за управление периферийными устройствами и обеспечивающие среду выполнения программ, находились на элементарном уровне развития.
Но времена меняются, появляются все более быстрые процессоры и все более емкая память, что позволяет, наконец, разработчикам ОС ПЭВМ позаботиться об удобствах пользователей, а не бездушного железа. Одним словом, восторженная публика встречает линейку операционных систем Windows.
Наряду с шокирующим по тем временам внешним отличием от операционных систем предыдущего поколения (рабочий стол с пиктограммами действовал на пользователей, привыкших к черной бездне экрана в DOS или, в лучшем случае, к голубизне NC, как чайное ситечко на Эллочку-людоедку), Windows предоставляла мощные механизмы, которые оценили, прежде всего, программисты.
Переходя к рассмотрению многозадачности, разберемся с ее основными понятиями, общими для множества многозадачных ОС.
Приложение, выполняемое в среде многозадачной ОС, называется процессом. Другими словами, процесс (process) — это программа, загруженная в память и подготовленная к исполнению. Windows позволяет выполнять несколько процессов одновременно, причем каждый процесс имеет свое собственное виртуальное адресное пространство, защищенное от посягательств других процессов (то есть от воздействия выполняющихся в это же время программ).
Если бы история Windows прервалась на третьей версии, то к сказанному почти нечего было бы добавить. Кстати, в Windows 3.1 ответственность за реализацию многозадачности во многом возлагалась на совесть приложений. Суть этого высказывания заключается в том, что операционная система после передачи управления приложению терпеливо ожидала разрешения продолжить выполнять свои диспетчерские функции. При этом "недобросовестная" программа могла монополизировать ресурсы центрального процессора и не пожелать делиться ими с "конкурентами".
Но 95-й год прошлого века ознаменовался выходом одноименной версии Windows. Новый продукт претерпел серьезную переработку, не был забыт и механизм реализации многозадачности.
Теперь базовой единицей многозадачности является не процесс, а нить (thread) — исполняемая часть кода приложения. Каждый процесс начинается единственной нитью, но во время работы приложения по мере необходимости могут создаваться дополнительные нити. Каждая нить может выполнять любую часть программного кода приложения, все нити имеют доступ к виртуальному адресному пространству своего процесса, к его глобальным переменным и ресурсам ОС. В свою очередь, любая нить может запустить дочернюю нить или процесс.
В отличие от Windows 3.1, последующие версии реализуют механизм вытесняющей многозадачности. Инициатива полностью принадлежит ОС: именно ОС разделяет время центрального процессора между нитями. По истечении выделенной порции времени нить останавливается, и управление передается конкурирующей нити. Для обеспечения переключения между нитями каждая нить поддерживает набор структур, в которых сохраняются машинные регистры, стек, окружение нити. При получении управления нить восстанавливает свое окружение и продолжает выполнять работу с того места, где была прервана в прошлый раз.
Квант времени, предоставляемый отдельной нити операционной системой, достаточно мал (порядка 20 мс), и столь быстрое переключение между нитями создает впечатление их одновременного выполнения. Тем не менее, на однопроцессорных системах каждая нить отрывает свою долю из общего времени центрального процессора, что приводит к замедлению каждой нити в отдельности.
Вряд ли имеет смысл долго говорить о возможностях, которые предоставляет многозадачность. В общем случае многопроцессный подход может оказаться полезным в ситуации, когда функции системы размещены в отдельных исполняемых модулях, но могли бы быть объединены в одном приложении. В документации по WIN32 API рекомендуется использовать многонитевой подход для создания отдельной нити, отвечающей за интерфейс с пользователем, при "конкурентном" выполнении нескольких задач, для управления многооконными приложениями. И все же каждому программисту самому предстоит решать, где в его области применить возможность параллельного исполнения участков кода.
Отметим только, что наряду с очевидными в некоторых случаях преимуществами, многозадачность имеет и свои отрицательные стороны. Для хранения структур с информацией о состояниях нитей и процессов расходуется память, большое количество выполняемых нитей загружают центральный процессор, во избежание конфликтов необходимо заботиться о синхронизации выполнения нитей.
В завершение разговора о многозадачности нельзя не затронуть некоторые смежные вопросы.
С одной стороны, все выглядит просто замечательно: приложение выполняется, нисколько не заботясь о своих соседях, использует память по своему усмотрению. С другой стороны, в ряде случаев может возникнуть необходимость обмена информацией между параллельно выполняющимися процессами. Как быть?
К счастью, разработчики ОС Windows предусмотрели специальные средства "межпроцессного" взаимодействия, как то "дыры" pipes, "почтовые щели" mailslots, файлы, объекты синхронизации (некоторые из этих объектов удобно использовать для блокировки выполнения нити до наступления события, другие применяются для защиты разделяемых ресурсов от одновременного использования).
Приступая к работе над программой и принимая решение об использовании в ней многозадачности, следует убедиться, а нет ли альтернативного подхода к решению проблемы? Дело в том, что WIN32 предоставляет некоторые дополнительные возможности выполнения множества задач без организации многонитевого процесса.
Так, например, асинхронный ввод/вывод (overlapped I/O) позволяет одной нити инициировать множество требующих времени запросов ввода/вывода, которые выполняются конкурентно.
Интересной возможностью является способность Windows останавливать выполнение нити до наступления одного или нескольких событий. Примерами таких событий могут служить изменение содержимого каталога на диске (создания/удаления файла) или изменение свойств файла, консольный ввод, завершение процесса или нити. Поэтому, перед тем как бросаться в бой и создавать нить или процесс с помощью функций CreateThread () или CreateProcess (), стоит оценить возможности "ждущих" функций WaitForSingleObject () и WaitForMultipleObjects (), которые позволяют организовать мониторинг над событиями проще и с более экономным использованием времени центрального процессора.
Подводя итог, вспомним, о чем говорилось в этой статье. Рост возможностей персональных вычислительных систем послужил толчком к развитию ОС ПЭВМ, в том числе позволил полноценно реализовать в них механизм многозадачности (ОС больших ЭВМ уже давно были ориентированы на выполнение множества задач и, кроме того, множеством пользователей). На примере ОС Windows были рассмотрены понятия процесса и нити, вытесняющей и не вытесняющей многозадачности, затронуты вопросы практического использования многозадачных возможностей этой ОС при разработке программ.
Игорь Орещенков
(c) компьютерная газета
Компьютерная газета. Статья была опубликована в номере 20 за 2001 год в рубрике разное :: мелочи жизни