Книга: UNIX: взаимодействие процессов

Пример: имеют ли приоритет запросы на запись перед запросами на чтение?

Пример: имеют ли приоритет запросы на запись перед запросами на чтение?

Следующий вопрос, на который мы попытаемся дать ответ, таков: есть ли приоритет у запросов на блокировку записи перед запросами на блокировку чтения, если все они находятся в очереди? Некоторые решения задачи читателей и писателей предусматривают это.

В листинге 9.7 приведен текст нашей тестовой программы, а на рис. 9.3 — временная диаграмма ее выполнения.

Листинг 9.7. Есть ли у писателей приоритет перед читателями

//lock/test3.c
1  #include "unpipc.h"
2  int
3  main(int argc, char **argv)
4  {
5   int fd;
6   fd = Open("test1.data", O_RDWR | O_CREAT, FILE_MODE);
7   Write_lock(fd, 0, SEEK_SET, 0); /* родительский процесс блокирует весь файл на запись */
8   printf("ls: parent has write lockn", Gf_time());
9   if (Fork() == 0) {
10   /* первый дочерний процесс */
11   sleep(1);
12   printf("ls: first child tries to obtain write lockn", Gf_time());
13   Writew_lock(fd, 0, SEEK_SET, 0); /* здесь процесс будет заблокирован */
14   printf("%s: first child obtains write lockn", Gf_time());
15   sleep(2);
16   Un_lock(fd, 0, SEEK_LET, 0);
17   printf("ls: first child releases write lockn", Gf_time());
18   exit(0);
19  }
20  if (Fork() == 0) {
21   /* второй дочерний процесс */
22   sleep(3);
23   printf("ls: second child tries to obtain read lockn", Gf_time());
24   Readw_lock(fd, 0, SEEK_SET, 0);
25   printf(%s: second child obtains read lockn", Gf_time());
26   sleep(4);
27   Un_lock(fd, 0, SEEK_SET, 0);
28   printf("ls: second child releases read lockn", Gf_time());
29   exit(0);
30  }
31  /* родительский процесс */
32  sleep(5);
33  Un_lock(fd, 0, SEEK_SET, 0);
34  printf("ls: parent releases write lockn", Gf_time());
35  exit(0);
36 }

Родительский процесс создает файл и устанавливает блокировку на запись

6-8 Родительский процесс создает файл и блокирует его целиком на запись.

Первый дочерний процесс

9-19 Порождается первый процесс, который ждет одну секунду, а затем запрашивает блокировку на запись для всего файла. Мы знаем, что при этом процесс будет заблокирован, поскольку родительский процесс установил блокировку и снимет ее только через пять секунд, и мы хотим, чтобы этот запрос был помещен в очередь.

Второй дочерний процесс

20-30 Порождается второй процесс, который ждет три секунды, а затем запрашивает блокировку на чтение на весь файл. Этот запрос будет также помещен в очередь.

И в Solaris 2.6, и в Digital Unix 4.0B мы видим, что блокировка на запись предоставляется первому процессу, как изображено на рис. 9.3. Но это еще не означает, что у запросов на запись есть приоритет перед запросами на чтение, поскольку, возможно, ядро предоставляет блокировку в порядке очереди вне зависимости от того, на чтение она или на запись. Чтобы проверить это, мы создаем еще одну тестовую программу, практически идентичную приведенной в листинге 9.7, но в ней блокировка на чтение запрашивается через одну секунду, а блокировка на запись — через три секунды. Эти две программы иллюстрируют, что Solaris и Digital Unix обрабатывают запросы в порядке очереди вне зависимости от типа запроса. Однако в BSD/OS 3.1 приоритет имеют запросы на чтение. 


Рис. 9.3. Есть ли у писателей приоритет перед читателями

Вот вывод программы из листинга 9.7, на основании которого была составлена временная диaгрaммa на рис. 9.3:

alpha % test3
16:34:02.810285: parent has write lock
16:34:03.848166: first child tries to obtain write lock
16:34:05.861082: 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

Оглавление книги


Генерация: 3.856. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз