<<
>>

Управление процессами вWindows ХР

Windows ХР поддерживает несколько процессов, которые могут взаимодействовать и синхронизироваться. Каждый процесс содержит по крайней мере один программный поток, который, в свою очередь, содержит по крайней мере один легковесный поток, или волокно (fiber).
Процессы, программные потоки и волокна в совокупности представляют собой инструменты поддержания параллелизма в одно- и многопроцессорных системах.

Новые процессы создаются с помощью функции CreateProcess API. Эта функция имеет 10 аргументов, у каждого из которых есть множество параметров. Очевидно, что такая система гораздо сложнее соответствующей схемы UNIX, где функция fork вообще не имеет аргументов, а у ехес их всего три: указатели на имя выполняемого файла, на массив параметров командной строки и на строку описания конфигурации. Ниже перечислены 10 аргументов функции CreateProcess:

+ указатель на имя исполняемого файла;

♦ сама командная строка (без синтаксического разбора);

+ указатель на дескриптор безопасности данного процесса;

+ указатель на дескриптор безопасности исходного программного потока;

+ бит, который сообщает, наследует ли новый процесс описатели родительского процесса;

+ различные флаги (например, ошибки, приоритета, отладки, консолей);

+ указатель на строки описания конфигурации;

+ указатель на имя рабочего каталога нового процесса;

+ указатель на структуру, которая описывает исходное окно на экране;

+ указатель на структуру, которая возвращает 18 значений вызывающей процедуре.

В \¥тс1о1\У8 ХР нет никакой иерархии родительских дочерних процессов.

Все процессы создаются равными. Однако поскольку одним из 18 параметров, возвращаемых исходному процессу, является описатель нового процесса (который дает возможность контролировать новый процесс), здесь существует внутренняя иерархия в том смысле, что определенные процессы содержат описатели других процессов.
Эти описатели нельзя просто непосредственно передавать другим процессам, но процесс может сделать определенный описатель доступным для другого процесса, а затем передать ему этот описатель, так что внутренняя иерархия процессов не может сохраняться долго.

Каждый процесс в \\'гтс1о1\У8 ХР создается с одним программным потоком, но позднее этот процесс может создать еще несколько таких потоков. Создать программный поток проще, чем процесс, поскольку вызов Сгеа1еТИгеас1 имеет всего 6 параметров вместо 10: дескриптор безопасности, размер стека, начальный адрес, пользовательский параметр, начальное состояние потока (готов к работе или блокирован) и идентификатор потока. Поскольку созданием потоков занимается ядро, оно располагает информацией обо всех программных потоках (иными словами, их реализация не ограничивается пользовательским пространством, как в некоторых других системах).

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

Создавать программные потоки в \\Тпс1о1\У8 ХР довольно расточительно, поскольку для этого требуется войти в ядро, а затем выйти из него. Чтобы избежать этого, в \\'гтс1о1\У8 ХР предусмотрены волокна, которые похожи на программные потоки, но выполняются и синхронизируются в пользовательском пространстве программой, которая их создает. Каждый программный поток может иметь несколько волокон, точно так же как процесс может иметь несколько программных потоков, только в данном случае, когда волокно блокируется, оно встает в очередь заблокированных волокон и выбирает другое волокно для работы в своем и программном потоке.

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

Ядро управляет процессами и программными потоками, но не управляет волокнами. Волокна могут пригодиться, например, в том случае, когда программы, которые имеют собственные программные потоки, переносятся в Windows ХР.

Процессы могут взаимодействовать друг с другом разными способами: через каналы, именованные каналы, почтовые слоты, сокеты, удаленные вызовы процедур, общие файлы. Каналы бывают двух видов: байтов и сообщений. Тип выбирается во время создания. Каналы байтов работают так же, как в UNIX. Каналы сообщений сохраняют границы сообщений, поэтому четыре записи по 128 байт считываются из канала как четыре сообщения по 128 байт (а не как одно сообщение размером 512 байт, как в случае с каналами байтов). Кроме того, существуют именованные каналы, которые тоже бывают двух видов. Именованные каналы могут использоваться в сети, а обычные каналы — нет.

Почтовые слоты (mailslot) — это атрибут исключительно Windows ХР (в UNIX их нет). Они во многом похожи на каналы, хотя не во всем. Во-первых, они односторонние, а каналы — двухсторонние. Их можно использовать в сети, но они не гарантируют доставку. Наконец, они поддерживают широковещательную рассылку сообщений нескольким получателям, а не только одному.

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

Удаленные вызовы процедур позволяют процессу А дать процессу В команду совершить вызов процедуры в адресном пространстве В от имени А и возвратить результат процессу А. Здесь существуют различные ограничения на параметры вызова. Например, передача указателя другому процессу не имеет никакого смысла.

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

Тогда все записи, порожденные одним процессом, появятся в адресном пространстве других процессов. Применяя такой механизм, можно легко реализовать общий (разделяемый) буфер, который мы описывали в примере с процессом-производителем и процессом-потребителем.

Windows ХР предоставляет множество механизмов синхронизации (семафоры, мьютексы, критические секции, события). Все эти механизмы работают не с процессами, а с программными потоками, поэтому когда поток блокируется на семафоре, это никак не влияет на другие программные потоки этого процесса — они просто продолжают работать.

Семафор создается с помощью функции CreateSemaphore API, которая может установить его на определенное значение и определить его максимальное значение. Семафоры являются объектами ядра, поэтому они имеют дескрипторы безопасности и описатели. Описатель семафора можно продублировать с помощью функции DuplicateHandle и передать другому процессу, поэтому один семафор может обеспечить синхронизацию нескольких процессов. Поддерживаются также функции up и down, хотя они имеют другие названия: ReleaseSemaphore (для up) и WaitForSingleObject (для down). Можно определить для функции WaitForSingleObject предельное время простоя, и тогда вызывающий программный поток в конце концов может быть разблокирован, даже если семафор сохраняет значение 0 (однако таймеры способствуют возникновению условий гонок).Мьютексы тоже являются объектами ядра, но они проще семафоров, поскольку у них нет счетчиков. Они, по сути, представляют собой объекты с функциями API для блокирования (WaitForSingleObject) и разблокирования (ReleaseMutex). Описатели мьютексов, как и описатели семафоров, можно дублировать и передавать другим процессам, так что программные потоки разных процессов могут иметь доступ к одному и тому же мьютексу.

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

Поскольку критические секции не являются объектами ядра, у них нет описателей и дескрипторов безопасности, поэтому их нельзя передавать другим процессам. Блокирование и разблокирование осуществляется с помощью функций EnterCri ti cal Section и LeaveCri ti cal Section соответственно. Так как эти функции API выполняются исключительно в пользовательском пространстве, они работают гораздо быстрее, чем мьютексы.

Последний механизм связан с использованием объектов ядра, которые называются событиями. Если программному потоку нужно дождаться того или иного события, он вызывает WaitForSingleObject. С помощью функции SetEvent можно разблокировать один ожидающий программный поток, а с помощью функции PulseEvent — все ожидающие. Существует несколько видов событий, которые имеют по несколько параметров.

События, мьютексы и семафоры можно определенным образом назвать и сохранить в файловой системе, как именованные каналы. Можно синхронизировать работу двух и более процессов путем открытия одного и того же события, мьютекса или семафора. В этом случае им не нужно создавать объект, а затем дублировать описатели, хотя такой подход тоже возможен.

<< | >>
Источник: Таненбаум Э.. Архитектура компьютера. 5-е изд. 2007

Еще по теме Управление процессами вWindows ХР:

  1. Поведенческая основа процесса управления.
  2. Сущность процесса управления в организациях.
  3. РАЗДЕЛ III. СОЦИОЛОГИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ПРОЦЕССОВ УПРАВЛЕНИЯ СОЦИАЛЬНОЙ СФЕРОЙ
  4. Психологические особенности управления инновационным процессом в правоохранительных органах.
  5. Психологические особенности управления инновационным процессом в правоохранительных органах.
  6. Статья 1040. Обращение взыскания на имущество, переданное в управление, по требованию кредитора установщика управления
  7. Очерк 2: Берт «Процесс — вот мое достояние. Именно процесс создает успех»
  8. § 3. Право управления предприятием как особый вид абсолютных прав. Право полного и ограниченного управления (п. 1774-1776)
  9. УПРАВЛЕНИЕ ВРЕМЕНЕМ VERSUS УПРАВЛЕНИЕ СОБОЙ
  10. § 4. Правопреемство как следствие приобретения права управления предприятием. Условия отчуждения и приобретения права управления предприятием (п. 1777-1782)
  11. Задания, мешающие когнитивному процессу (ЗМКП), и задания, помогающие когнитивному процессу (ЗПКП)