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

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

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

Запустив эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ptr, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ процСссами. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ значСния счСтчика ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ процСссов:

solaris % incr2 /tmp/temp.110000

child: 0     запускаСтся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс

child: 1

…

child: 128

child: 129

parent: 130  Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс приостанавливаСтся, запускаСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс

parent: 131

…

parent: 636

parent: 637

child: 638   Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс приостанавливаСтся, запускаСтся Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс

child: 639

…

child: 1517

child: 1518

parent: 1519 Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс приостанавливаСтся, запускаСтся Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс

parent: 1520

…

parent: 19999 послСдняя строка Π²Ρ‹Π²ΠΎΠ΄Π°

solaris % od –D /tmp/temp.1

0000000 0000020000

0000004

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ использовалось ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° Π΅Π³ΠΎ содСрТимоС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ od ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика (20000) Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Ρ‹Π»ΠΎ сохранСно Π² Ρ„Π°ΠΉΠ»Π΅.

На рис. 12.6 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° схСма, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π°ΡΡΡ ΠΎΡ‚ рис. 12.4. Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ раздСляСмая ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ сСмафор Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ ΠΌΡ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΌ Π² ядрС, Π½ΠΎ для сСмафоров Posix это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ зависимости ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΆΠΈΠ²ΡƒΡ‡Π΅ΡΡ‚ΡŒΡŽ, Π½ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π΅ мСньшС ТивучСсти ядра. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ продСмонстрировали Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 10.15. 

Рис. 12.6. Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСссы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ сСмафор 


ΠœΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ процСссов ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ собствСнныС ΠΊΠΎΠΏΠΈΠΈ указатСля ptr, Π½ΠΎ ΠΎΠ±Π΅ ΠΊΠΎΠΏΠΈΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти β€” счСтчик, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΎΠ±ΠΎΠΈΠΌΠΈ процСссами.

ИзмСним ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² листингС 12.2 Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ использовались сСмафоры Posix, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹Π΅ Π² памяти (вмСсто ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ…). РазмСстим Ρ‚Π°ΠΊΠΎΠΉ сСмафор Π² раздСляСмой области памяти. Новая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 12.3.

Листинг 12.3. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ΠΈ сСмафор Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² раздСляСмой памяти

//shm/incr3.c

1  #include "unpipc.h"


2  struct shared {

3   sem_t mutex; /* Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅: сСмафор, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π² памяти */

4   int count; /* ΠΈ счСтчик */

5  } shared;


6  int

7  main(int argc, char **argv)

8  {

9   int fd, i, nloop;

10  struct shared *ptr;

11  if (argc != 3)

12   err_quit("usage: incr3 <pathname> <#loops>");

13  nloop = atoi(argv[2]);

14  /* ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΡƒΠ»Π΅ΠΌ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ */

15  fd = Open(argv[1], O_RDWR | O_CREAT, FILE_MODE);

16  Write(fd, &shared, sizeof(struct shared));

17  ptr = Mmap(NULL, sizeof(struct shared), PROT_READ | PROT_WRITE,

18   MAP_SHARED, fd, 0);

19  Close(fd);

20  /* инициализация сСмафора, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ процСссами */

21  Sem_init(&ptr->mutex, 1, 1);

22  setbuf(stdout, NULL); /* stdout Π½Π΅ буфСризуСтся */

23  if (Fork() == 0) { /* Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс */

24   for (i = 0; i < nloop; i++) {

25    Sem_wait(&ptr->mutex);

26    printf("child: %d\n", ptr->count++);

27    Sem_post(&ptr->mutex);

28   }

29   exit(0);

30  }

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

32  for (i = 0; i < nloop; i++) {

33   Sem_wait(&ptr->mutex);

34   printf("parent: %d\n", ptr->count++);

35   Sem_post(&ptr->mutex);

36  }

37  exit(0);

38 } 

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры, хранящСйся Π² раздСляСмой памяти

2-5 ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ цСлочислСнный счСтчик ΠΈ сСмафор, Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ, Π² ΠΎΠ΄Π½Ρƒ структуру. Π­Ρ‚Π° структура Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² раздСляСмой памяти.

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ

14-19 БоздаСтся Ρ„Π°ΠΉΠ» для отобраТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инициализируСтся структурой с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΠΎΠΈΡ… ΠΏΠΎΠ»Π΅ΠΉ. ΠŸΡ€ΠΈ этом инициализируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ счСтчик, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСмафор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ sem_init. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю структуру нулями, Ρ‡Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ цСлочислСнноС ΠΏΠΎΠ»Π΅.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ сСмафора

20-21 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ сСмафор, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Π² памяти, вмСсто ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ. Для Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ sem_init. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСмафор ΠΌΠΎΠ³ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколькими процСссами.

На рис. 12.7 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° модификация рис. 12.6, Π³Π΄Π΅ сСмафор пСрСмСстился ΠΈΠ· ядра Π² Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ. 

Рис. 12.7. И сСмафор, ΠΈ счСтчик Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ хранятся Π² раздСляСмой памяти

12.4. НСимСнованноС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² 4.4BSD

Наши ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· листингов 12.2 ΠΈ 12.3 Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ, Π½ΠΎ Π½Π°ΠΌ приходится ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки), Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ open, Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½ΡƒΠ»ΠΈ Π² Ρ„Π°ΠΉΠ» Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ write (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ). Если mmap ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ области раздСляСмой памяти Ρ‡Π΅Ρ€Π΅Π· fork, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ эту схСму, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойства Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

1. Π’ вСрсии 4.4BSD прСдоставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ отобраТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. ΠŸΡ€ΠΈ этом ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹. ВмСсто этого ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„Π»Π°Π³ΠΈ MAP_SHARED | MAP_ANON ΠΈ дСскриптор fd = –1. Π‘Π΄Π²ΠΈΠ³, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ offset, игнорируСтся. ΠŸΠ°ΠΌΡΡ‚ΡŒ автоматичСски инициализируСтся нулями. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 12.4.

2. Π’ вСрсии SVR4 имССтся Ρ„Π°ΠΉΠ» /dev/zero, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΈ дСскриптор ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ mmap. Π­Ρ‚ΠΎ устройство Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ считывания, Π° вСсь направляСмый Π½Π° Π½Π΅Π³ΠΎ Π²Ρ‹Π²ΠΎΠ΄ сбрасываСтся. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 12.5. (Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… рСализациях, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… ΠΎΡ‚ BSD, Ρ‚Π°ΠΊΠΆΠ΅ поддСрТиваСтся устройство /dev/zero, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² SunOS 4.1.x ΠΈ BSD/OS 3.1.)

Π’ листингС 12.4 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‡Π°ΡΡ‚ΡŒ листинга 12.2, которая измСняСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ использованию Π½Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ отобраТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² 4.4BSD.

Листинг 12.4. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² 4.4BSD

//shm/incr_map_anon.с

3  int

4  main(int argc, char **argv)

5  {

6   int i, nloop;

7   int *ptr;

8   sem_t *mutex;

9   if (argc != 2)

10   err_quit("usage: incr_map_anon <#loops>");

11  nloop = atoi(argv[1]);

12  /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ */

13  ptr = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE,

14   MAP_SHARED | MAP_ANON, –1, 0);

6-11 АвтоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ fd ΠΈ zero большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, задававший имя создаваСмого Ρ„Π°ΠΉΠ»Π°.

12-14 Π€Π°ΠΉΠ» большС Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ. ВмСсто этого указываСтся Ρ„Π»Π°Π³ MAP_ANON ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ mmap, Π° пятый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (дСскриптор) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ –1.

12.5. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² SVR4 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ /dev/zero

Π’ листингС 12.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‡Π°ΡΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΡ€Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π²ΡˆΠ°Ρ измСнСния ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с листингом 12.2 ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ использованию отобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ /dev/zero.

Листинг 12.5. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ памяти Π² SVR4 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ /dev/zero

//shm/incr_dev_zero.c

3  int

4  main(int argc char **argv)

5  {

6   int fd, i, nloop;

7   int *ptr;

8   sem_t *mutex;

9   if (argc != 2)

10   err_quit("usage: incr_dev_zero <#loops>");

11  nloop = atoi(argv[1]);

12  /* ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ /dev/zero ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ */

13  fd = Open("/dev/zero", O_RDWR);

14  ptr = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

15  Close(fd);

6-11 АвтоматичСская пСрСмСнная zero большС Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, задававший имя создаваСмого Ρ„Π°ΠΉΠ»Π°.

12-15 ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» /dev/zero ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ дСскриптор Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mmap. ΠžΠ±Π»Π°ΡΡ‚ΡŒ памяти Π±ΡƒΠ΄Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° нулями.

12.6. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ

Когда Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ отобраТаСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ области (Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° mmap), ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, совпадаСт с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Ρ„Π°ΠΉΠ»Π°. НапримСр, Π² листингС 12.3 Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ структуры shared Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ write ΠΈ это ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° области ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π΅Π³ΠΎ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Однако эти Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ области памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½, β€” ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

Для Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния особСнностСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mmap Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ Π² листингС 12.6.

Листинг 12.6. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°: Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° совпадаСт с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ области памяти

//shra/test1.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd, i;