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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма UNIXΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 80

Автор АндрСй РобачСвский

> snode f5e91c18

SNODE TABLE SIZE = 256

HASH-SLOT MAJ/MIN   REALVP COMMONVP NEXTR SIZE COUNT FLAGS

-          24,26  f5f992e8 f636b27c     0    0     0 up ас

ПолС s_realvp (REALVP) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° vnode Ρ„Π°ΠΉΠ»Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ufs). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅ поиск Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈ исслСдовании Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ монтирования.

> vnode f5f992e8

VCNT VFSMNTED     VFSP STREAMP VTYPE RDEV     VDATA VFILOCKS VFLAG

   2        0 f0286570       0     с 24,26 f5f992e0        0 -

> ui f5f992e0

 UFS INODE TABLE SIZE = 1671

SLOT MAJ/MIN  INUMB RCNT LINE UID GID SIZE MODE    FLAGS

  -   32,24  317329    2    1 286   7    0 c---620 rf

> ! ncheck. -i 317329

/dev/dsk/c0t3d0s0:

317329 /devices/pseudo/ [email protected]:26

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ имя ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° устройства (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС β€” это псСвдотСрминал), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ производится Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ доступа ΠΊ Ρ„Π°ΠΉΠ»Ρƒ

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ подсистСмы UNIX Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ нСскольким процСссам ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ для чтСния ΠΈ записи. Π₯отя ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи ΠΈ чтСния, осущСствляСмыС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² read(2) ΠΈΠ»ΠΈ write(2), ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½Ρ‹ΠΌΠΈ, Π² UNIX ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ отсутствуСт синхронизация ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ read(2) ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎ, Π² частности, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСсогласованным опСрациям с Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΈ ΠΊΠ°ΠΊ слСдствиС, ΠΊ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡŽ цСлостности Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ…. Вакая ситуация являСтся Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠΉ для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

UNIX позволяСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π±Π°ΠΉΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ записи Ρ„Π°ΠΉΠ»Π°. Для этого слуТат Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ систСмный Π²Ρ‹Π·ΠΎΠ² управлСния Ρ„Π°ΠΉΠ»ΠΎΠΌ fcntl(2) ΠΈ библиотСчная функция lockf(3C), прСдназначСнная ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для управлСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π΅Π΄ фактичСской Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (чтСния ΠΈΠ»ΠΈ записи) процСсс устанавливаСт Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° (для чтСния ΠΈΠ»ΠΈ для записи). Если Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ трСбуСмая файловая опСрация Π½Π΅ создаст ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠ»ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ записи Π² Ρ„Π°ΠΉΠ» нСсколькими процСссами.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ являСтся Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ (advisory lock). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ процСссы ΠΌΠΎΠ³ΡƒΡ‚ Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ созданными Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ ядро Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ запись Π² Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ участок Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ явно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΈΡ… Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π΅Ρ… ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ fcntl(2) ΠΈ lockf(3C).

ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ с использованиСм систСмного Π²Ρ‹Π·ΠΎΠ²Π° fnctl(2) для блокирования записСй Ρ„Π°ΠΉΠ»Π° Π² Π³Π»Π°Π²Π΅ 2. Π’Π°ΠΌ ΠΆΠ΅ Π±Ρ‹Π»Π° упомянута структура flock, слуТащая для описания блокирования. Поля этой структуры описаны Π² Ρ‚Π°Π±Π». 4.8.


Π’Π°Π±Π»ΠΈΡ†Π° 4.8. Поля структуры flock

ПолС ОписаниС short l_type Π’ΠΈΠΏ блокирования: F_RDLCK ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для чтСния (read lock), F_WRLCK β€” Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для записи (write lock), F_UNLCK ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ снятиС блокирования. short l_whence Π’ΠΎΡ‡ΠΊΠ° отсчСта смСщСния записи Π² Ρ„Π°ΠΉΠ»Π΅. ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ рассмотрСнным ΠΏΡ€ΠΈ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π΅ ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lseek(2) Π² Π³Π»Π°Π²Π΅ 2: SEEK_SET, SEEK_CUR, SEEK_END. off_t l_start Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ записи ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ отсчСта, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ»Π΅ΠΌ l_whence. off_t l_len Π”Π»ΠΈΠ½Π° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ записи. НулСвоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ l_len ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ запись всСгда распространяСтся Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°, нСзависимо ΠΎΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ измСнСния Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. pid_t l_pid Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠ΅Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GETLK.

Как слСдуСт ΠΈΠ· описания поля l_type структуры flock, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° блокирования записи: для чтСния (F_RDLCK) ΠΈ для записи (F_WRLCK). ΠŸΡ€Π°Π²ΠΈΠ»Π° блокирования Ρ‚Π°ΠΊΠΎΠ²Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСно нСсколько Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ для чтСния Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈ этом Π² установкС блокирования для записи Π½Π° этот Π±Π°ΠΉΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Π½ΠΎ. Напротив, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для записи Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ СдинствСнным, ΠΏΡ€ΠΈ этом Π² установкС блокирования для чтСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Π°Π½ΠΎ.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ блокирования записСй:

...

struct flock lock;

...

/* Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ описаниС lock с Ρ†Π΅Π»ΡŒΡŽ блокирования всСго Ρ„Π°ΠΉΠ»Π°

для записи */

lock.l_type = FWRLCK;

lock.l_start = 0;

lock.whence = SEEK_SET;

lock.len = 0;

/* Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌ Ρ„Π°ΠΉΠ». Если блокирования, ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅

   Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ β€” ΠΆΠ΄Π΅ΠΌ ΠΈΡ… снятия */

fcntl(fd, SETLKW, &lock);

/* Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ» - Π½Π°ΠΌ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡˆΠ°Π΅Ρ‚ */

write(fd, record, sizeof(record));

/* Π‘Π½ΠΈΠΌΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ */

lock.l_type = F_UNLK;

fcntl(fd, SETLKW, &lock);

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² UNIX сущСствуСт ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (mandatory lock), ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° доступ ΠΊ записям Ρ„Π°ΠΉΠ»Π° накладываСтся самим ядром. РСализация ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ. НапримСр, Π² SCO UNIX (SVR3) снятиС Π±ΠΈΡ‚Π° x для Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ установка Π±ΠΈΡ‚Π° SGID для Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, установлСнныС fcntl(2) ΠΈΠ»ΠΈ lockf(3C), станут ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. UNIX SVR4 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ установку блокирования ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ для записи ΠΈ для чтСния, обСспСчивая Ρ‚Π΅ΠΌ самым доступ для чтСния ΠΌΠ½ΠΎΠ³ΠΈΠΌ, Π° для записи β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ процСссу. Π­Ρ‚ΠΈ установки Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ систСмного Π²Ρ‹Π·ΠΎΠ²Π° fcntl(2). Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ использованиС ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ блокирования Ρ‚Π°ΠΈΡ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. НапримСр, Ссли процСсс Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½ΠΎΠΌΡƒ систСмному Ρ„Π°ΠΉΠ»Ρƒ ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ тСряСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ, это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ останову ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

Π‘ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш

Π’ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ подсистСмы тСсно связана с ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΉΠ½Ρ‹ΠΌΠΈ устройствами. Для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² β€” это устройство, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ размСщаСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ файловая систСма, для ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² устройств β€” это ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», ΠΈΠ»ΠΈ сСтСвой Π°Π΄Π°ΠΏΡ‚Π΅Ρ€. НС вдаваясь Π² подробности подсистСмы Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, рассмотрим, ΠΊΠ°ΠΊ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… вСрсиях UNIX ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с дисковыми устройствами β€” Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ мСстом хранСния ΠΏΠΎΠ΄Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ²[48].

НС сСкрСт, Ρ‡Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ дискового Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с доступом ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈΠ»ΠΈ свСрхопСративной памяти. ВрСмя чтСния Π΄Π°Π½Π½Ρ‹Ρ… с диска ΠΈ копирования Ρ‚Π΅Ρ… ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² памяти ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² нСсколько тысяч Ρ€Π°Π·. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ основныС Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π½Π° дисковых накопитСлях, дисковый Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ являСтся ΡƒΠ·ΠΊΠΈΠΌ мСстом ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ дискового Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ, соотвСтствСнно, всСй систСмы Π² Ρ†Π΅Π»ΠΎΠΌ, Π² UNIX ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ дисковых Π±Π»ΠΎΠΊΠΎΠ² Π² памяти.

Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ выдСлСнная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, Π³Π΄Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ дисковыС Π±Π»ΠΎΠΊΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто осущСствляСтся доступ. Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти ΠΈ связанный с Π½Π΅ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½Ρ‹ΠΉ интСрфСйс носят Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠ³ΠΎ кэша, ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π‘Ρ…Π΅ΠΌΠ° взаимодСйствия Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… подсистСм ядра с Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΌ кэшСм ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° рис. 4.13.

Рис. 4.13. Роль Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠ³ΠΎ кэша

ВнутрСнняя структура Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠ³ΠΎ кэша

Π‘ΡƒΡ„Π΅Ρ€Π½Ρ‹ΠΉ кэш состоит ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… достаточСн для размСщСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ дискового Π±Π»ΠΎΠΊΠ°. Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… связан Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±ΡƒΡ„Π΅Ρ€Π°, прСдставлСнный структурой buf, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ядро ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ кэшСм, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ поиск Π±ΡƒΡ„Π΅Ρ€ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ доступа. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ устройства для выполнСния фактичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Когда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ чтСния ΠΈΠ»ΠΈ записи Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° диск, ядро заносит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° устройства. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ….

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ поля структуры buf ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 4.9.


Π’Π°Π±Π»ΠΈΡ†Π° 4.9. Поля структуры buf