Главная страница Взаимодействие нетривиальных процессов 8 printfCs: parent has write lock\n . Gf time()); 9 if (ForkO == 0) { 10 /* первый дочерний процесс */ 11 sleep(l): 12 printf( *s: first child tries to obtain write lock\n . Gf time()); 13 Writew lock(fd. 0. SEEK SET. 0): /* здесь процесс будет заблокирован */ 14 printf( *s: first child obtains write lock\n . GfJimeO): 15 sleep(2): 16 Un lock(fd, 0, SEEKJET. 0); 17 printf( *s: first child releases write lock\n , GfJimeO); 18 exit(O); 19 } 20 if (ForkO == 0) { 21 /* второй дочерний процесс */ 22 sleep(3); 23 printfCs: second child tries to obtain read lock\n , GfJimeO); 24 Readw lock(fd, 0. SEEKJET. 0): 25 printf( *s: second child obtains read lock\n . GfJimeO): 26 sleep(4); 27 Un lock(fd. 0. SEEKJET. 0): 28 printfCs: second child releases read lock\n , GfJimeO): 29 exit(O): 30 } 31 /* родительский процесс */ 32 sleep(5): 33 Un lock(fd, 0, SEEKJET, 0): 34 printf( *s: parent releases write lock\n . GfJimeO); 35 exit(O): 36 } Родительский процесс создает файл и устанавливает блокировку на запись 6-8 Родительский процесс создает файл и блокирует его целиком на запись. Первый дочерний процесс 9-19 Порождается первый процесс, который ждет одну секунду, а затем запрашивает блокировку на запись для всего файла. Мы знаем, что при этом процесс будет заблокирован, поскольку родительский процесс установил блокировку и снимет ее только через пять секунд, и мы хотим, чтобы этот запрос был помещен в очередь. Второй дочерний процесс 20-30 Порождается второй процесс, который ждет три секунды, а затем запрашивает блокировку на чтение на весь файл. Этот запрос будет также помещен в очередь. И в Solaris 2.6, и в Digital Unix 4.0В мы видим, что блокировка на запись предоставляется первому процессу, как изображено на рис. 9.3. Но это еще не означает, что у запросов на запись есть приоритет перед запросами на чтение, поскольку, возможно, ядро предоставляет блокировку в порядке очереди вне зависимости от того, на чтение она или на запись. Чтобы проверить это, мы создаем еще одну тестовую программу, практически идентичную приведенной в листинге 9.7, но в ней блокировка на чтение запращивается через одну секунду, а блокировка на запись - через три секунды. Эти две программы иллюстрируют, что Solaris и Digital Unix обрабатывают запросы в порядке очереди вне зависимости от типа запроса. Однако в BSD/OS 3.1 приоритет имеют запросы на чтение. родительский процесс дочерний процесс № 1 дочерний процесс № 2 9-10-11- получает блокировку на запись освобождает ресурс попытка установить блокировку на запись попытка установить блокировку на чтение получает блокировку на запись получает блокировку на чтение освобождает ресурс освобождает ресурс время Рис. 9.3. Есть ли у писателей приоритет перед читателями Вот вывод программы из листинга 9.7, на основании которого была составлена временная диаграмма на рис. 9.3: alpha % testa 16:34:02.810285 16:34:03.848166 16:34:05,861082 parent has write lock first child tries to obtain write lock second child tries to obtain read lock 16;34:07.858393; parent releases write lock 16:34:07.865222: first child obtains write lock 16:34:09.865987: first child releases write lock 16:34:09.872823: second child obtains read lock 16:34:13,873822; second child releases read lock 9.7. Запуск единственного экземпляра демона Часто блокировки записей используются для обеспечения работы какой-либо программы (например, демона) в единственном экземпляре. Фрагмент кода, приведенный в листинге 9.8, должен выполняться при запуске демона. Листинг 9.8. Гарантия выполнения единственного экземпляра программы lock/onedaemon.c 1 linclude unpipc.h 2 Idefine PATH PIOFILE pidfile 3 int 4 maindnt argc. char **argv) 6 int pidfd; 7 char lineEMAXLINE]; 8 /* открытие или создание файла с идентификатором процесса */ 9 pidfd = Open(PATH PIOFILE, 0 ROWR 0 CREAT. FILE MOOE); 10 /* попытка блокирования всего файла на запись */ И if (write lock(pidfd. 0. SEEKJET. 0) < 0) { 12 if (errno == EACCES errno == EAGAIN) 13 err quit( unable to lock *s. is *s already running? . 14 PATH PIOFILE. argv[0]): 15 else 16 err sys( unable to lock *s . PATH PIOFILE); 17 } 18 /* запись идентификатора; файл остается открытым, чтобы он был заблокирован */ 19 snprintfdine. sizeofdine). *ld\n . (long) getpidO): 20 Ftruncate(pidfd. 0): 21 Write(pidfd. line, strlendine)): 22 /* основной текст программы демона... */ 23 paused: 24 } Открытие и блокирование файла -17 Демон создает однострочный файл, в который записывает свой идентификатор процесса. Этот файл открывается или создается, а затем делается попытка заблокировать его на запись целиком. Если блокировку установить не удается.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |