Вход/Регистрация
UNIX: взаимодействие процессов
вернуться

Стивенс Уильям Ричард

Шрифт:
Первый дочерний процесс

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

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

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

Родительский процесс блокирует ресурс 5 секунд

31-35 Родительский процесс ждет пять секунд, снимает блокировку и завершает работу.

На рис. 9.2 приведена временная диаграмма выполнения программы в Solaris 2.6, Digital Unix 4.0B и BSD/OS 3.1. Как видно, блокировка чтения предоставляется второму дочернему процессу немедленно, несмотря на наличие в очереди запроса на блокировку записи. Существует вероятность, что запрос на запись так и не будет выполнен, если будут постоянно поступать новые запросы на чтение. Ниже приведен результат выполнения программы, в который были добавлены пустые строки для улучшения читаемости:

alpha % test2

16:32:29.674453: parent has read lock

16:32:30.709197: first child tries to obtain write lock

16:32:32.725810: second child tries to obtain read lock

16:32:32.728739: second child obtains read lock

16:32:34.722282: parent releases read lock

16:32:36.729738: second child releases read lock

16:32:36.735597: first child obtains write lock

16:32:38.736938: first child releases write lock

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

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

В листинге 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 lock\n", Gf_time);

9 if (Fork == 0) {

10 /* первый дочерний процесс */

11 sleep(1);

12 printf("ls: 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", Gf_time);

15 sleep(2);

16 Un_lock(fd, 0, SEEK_LET, 0);

17 printf("ls: first child releases write lock\n", Gf_time);

18 exit(0);

19 }

20 if (Fork == 0) {

21 /* второй дочерний процесс */

22 sleep(3);

23 printf("ls: second child tries to obtain read lock\n", Gf_time);

24 Readw_lock(fd, 0, SEEK_SET, 0);

25 printf(%s: second child obtains read lock\n", Gf_time);

26 sleep(4);

27 Un_lock(fd, 0, SEEK_SET, 0);

28 printf("ls: second child releases read lock\n", Gf_time);

29 exit(0);

30 }

31 /* родительский процесс */

32 sleep(5);

33 Un_lock(fd, 0, SEEK_SET, 0);

  • Читать дальше
  • 1
  • ...
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: