Московский государственный технический университет им. Н.Э. Баумана
Опубликован: 28.06.2006 | Доступ: свободный | Студентов: 12463 / 343 | Оценка: 4.54 / 3.83 | Длительность: 22:03:00
ISBN: 978-5-9556-0055-0
Лекция 14:

Взаимодействие процессов и потоков

Ожидающие таймеры

Эти объекты предназначены для выполнения операций через заданные промежутки времени или в заданное время. Таймеры бывают периодическими или однократными, также их разделяют на таймеры с ручным сбросом и синхронизирующие:

#include <windows.h>
#include <stdio.h>

int main()
{
  HANDLE    		hTimer = NULL;
  LARGE_INTEGER 	liDueTime;
  hTimer = CreateWaitableTimer(NULL, TRUE, "WaitableTimer");
  /* задать срабатывание через 5 секунд */
  liDueTime.QuadPart=-50000000;
  SetWaitableTimer( hTimer, &liDueTime, 0, NULL, NULL, 0 );
  WaitForSingleObject( hTimer, INFINITE );
  return 0;
}

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

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

Процессы

Процессы в Windows определяют адресное пространство, которое будет использоваться всеми потоками, работающими в этом процессе. В отличие от UNIX-подобных систем системного вызова типа fork в Windows не предусмотрено - новый процесс создается заново, с выделением для него адресного пространства, проецирования на него компонент системы, образа исполняемого файла, необходимых динамических библиотек и других компонент. Эта операция требует чуть больше ресурсов, чем в UNIX-подобных системах, однако выполняется достаточно быстро - диспетчер памяти позволяет просто проецировать на адресное пространство компоненты из других процессов с режимом "копирование при записи".

Основные механизмы взаимодействия процессов могут быть разделены на несколько групп:

  • Использование объектов ядра для взаимной синхронизации. Рассмотрено при обсуждении взаимной синхронизации потоков. При использовании именованных объектов или передаче описателей объектов ядра другим процессам рассмотренные средства могут использоваться для межпроцессной синхронизации.
  • Проецирование файлов в адресное пространство процесса (File Mapping). Один из базовых механизмов, рассматривается ниже.
  • Использование файловых объектов. Каналы (Pipes), почтовые ящики (Mailslots) и сокеты (Sockets). Еще один базовый механизм; чаще применяется для организации межузлового взаимодействия, за исключением анонимных каналов (unnamed pipes, anonymous pipes), которые используются для межпроцессного взаимодействия в рамках одного узла. В данном курсе эти механизмы не затрагиваются.
  • Механизмы, ориентированные на обмен оконными сообщениями (буфер обмена, DDE, сообщение WM_COPYDATA и др.). В своей основе используют механизм проецирования файлов для передачи данных между адресными пространствами процессов. В данном курсе эти механизмы не затрагиваются.
  • Вызов удаленных процедур (Remote Procedure Call, RPC). Является надстройкой, использующей проецирование для реальной передачи данных. Позволяет описать процедуры, реализованные в других процессах, и обращаться к ним как к обычным процедурам, локальным для данного процесса. RPC инкапсулирует вопросы нахождения реальной процедуры, выполняющей необходимую работу, передачу данных в эту процедуру и получение от нее ответа. RPC позволяет организовать не только межпроцессное взаимодействие, но также межузловое с передачей данных по сети. В данном курсе не рассматривается.
  • COM. Является еще более высокоуровневой абстракцией, в данном курсе также не рассматривается.
Анастасия Булинкова
Анастасия Булинкова
Рабочим названием платформы .NET было