Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 54

Автор Уильям БтивСнс

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… пытаСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° запись (ΠΈ блокируСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс установил Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ для всСго Ρ„Π°ΠΉΠ»Π°), Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ процСсс сСкунду спустя пытаСтся ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. ВрСмСнная Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° этих запросов ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 9.2, Π° Π² листингС 9.6 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. 

Рис. 9.2. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ возмоТности установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈΠ²ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° запись


Листинг 9.6. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ возмоТности установки Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π½Π° запись

//lock/test2.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   Read_lock(fd, 0, SEEK_SET, 0); /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ вСсь Ρ„Π°ΠΉΠ» Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ */

8   printf("%s: parent has read lock\n", Gf_time());

9   if (Fork() == 0) {

10   /* ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

11   sleep(1);

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", Gf_time());

15   sleep(2);

16   Un_lock(fd, 0, SEEK_SET, 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("%s: 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("%s: second child releases read lock\n", Gf_time());

29   exit(0);

30  }

31  /* Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс */

32  sleep(5);

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

34  printf("%s: parent releases read lock\n", Gf_time());

35  exit(0);

36 }

Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅

6-8 Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ» ΠΈ устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ для всСго Ρ„Π°ΠΉΠ»Π° Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ read_lock (которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² случаС нСдоступности рСсурса), Π° Π½Π΅ readw_lock (которая ΠΆΠ΄Π΅Ρ‚ Π΅Π³ΠΎ освобоТдСния), ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ эта Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ установлСна Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gf_time [24, с. 404], ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс

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);

34  printf("ls: parent releases write lock\n", 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

9.7. Запуск СдинствСнного экзСмпляра Π΄Π΅ΠΌΠΎΠ½Π°

Часто Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для обСспСчСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏpoΠ³Ρ€aΠΌΠΌΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½Π°) Π² СдинствСнном экзСмплярС. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 9.8, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ запускС Π΄Π΅ΠΌΠΎΠ½Π°.

Листинг 9.8. Гарантия выполнСния СдинствСнного экзСмпляра ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

//lock/onedaemon.c

1  #include "unpipc.h"

2  #define PATH_PIDFILE "pidfile"


3  int

4  main(int argc, char **argv)

5  {

6   int pidfd;

7   char line[MAXLINE];