Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 [ 72 ] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

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 Демон создает однострочный файл, в который записывает свой идентификатор процесса. Этот файл открывается или создается, а затем делается попытка заблокировать его на запись целиком. Если блокировку установить не удается.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 [ 72 ] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.