Таненбаум Э.- Архитектура компьютера. стр.388

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

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

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

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

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

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

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

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


⇐ Предыдущая страница| |Следующая страница ⇒