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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ядра LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 56

Автор Π ΠΎΠ±Π΅Ρ€Ρ‚ Π›Π°Π²

init_MUTEX(sem);

НСизвСстно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ слово "mutex" Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ init_MUTEX() Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΎ большими Π±ΡƒΠΊΠ²Π°ΠΌΠΈ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ слово "init" ΠΈΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sema_init() Ρ‚Π°ΠΊΠΈΡ… особСнностСй Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ясно, Ρ‡Ρ‚ΠΎ это выглядит Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, ΠΈ я ΠΏΡ€ΠΈΠ½ΠΎΡˆΡƒ свои извинСния Π·Π° это нСсоотвСтствиС. НадСюсь, Ρ‡Ρ‚ΠΎ послС прочтСния Π³Π»Π°Π²Ρ‹ 7 Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ ΡƒΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΠ΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ символам ядра.

ИспользованиС сСмафоров

Ѐункция down_interruptible() выполняСт ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ сСмафор. Если эта ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Π°, Ρ‚ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ пСрСводится Π² состояниС оТидания с Ρ„Π»Π°Π³ΠΎΠΌ TASK_INTERRUPTIBLE. Из ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° Π³Π»Π°Π²Ρ‹ 3 слСдуСт Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ состояниС процСсса ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сигнала ΠΈ Ρ‡Ρ‚ΠΎ такая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ цСнная. Если сигнал ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½Π° освобоТдСниС сСмафора, Ρ‚ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ возвращаСтся ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ, Π° функция down_interruptible() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -EINTR. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ рассмотрСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выступаСт функция down(), которая ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π² состояниС оТидания с Ρ„Π»Π°Π³ΠΎΠΌ TASK_UNINTERRUPTIBLE. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½Π° освобоТдСниС сСмафора, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° сигналы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ функция down_interruptible() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ, Ρ‡Π΅ΠΌ функция down(). Π”Π°, ΠΈΠΌΠ΅Π½Π° этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π°Π»Π΅ΠΊΠΈ ΠΎΡ‚ ΠΈΠ΄Π΅Π°Π»Π°.

Ѐункция down_trylock() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π°Ρ…Π²Π°Ρ‚Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ сСмафора. Если сСмафор ΡƒΠΆΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½, Ρ‚ΠΎ функция Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ случаС успСха ΠΏΠΎ Π·Π°Ρ…Π²Π°Ρ‚Ρƒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ возвращаСтся Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ захватываСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°.

Для освобоТдСния Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ сСмафора Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ up(). Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

/* объявлСниС ΠΈ описаниС сСмафора с ΠΈΠΌΠ΅Π½Π΅ΠΌ mr_sem ΠΈ

   ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ счСтчика, Ρ€Π°Π²Π½Ρ‹ΠΌ 1 */

static DECLARE_MUTEX(mr_sem);

...

if (down_interruptible(&mr_sem))

 /* ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ сигнал ΠΈ сСмафор Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½ */


/* критичСский участок ... */


/* ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ сСмафор */

up(&mr_sem);

ΠŸΠΎΠ»Π½Ρ‹ΠΉ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСмафорами ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² Ρ‚Π°Π±Π». 9.5.


Π’Π°Π±Π»ΠΈΡ†Π° 9.5. Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСмафорами

Ѐункция ОписаниС sema_init(struct semaphore*, int) Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ динамичСски созданного сСмафора ΠΈ установка для Π½Π΅Π³ΠΎ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ значСния счСтчика использования init_MUTEX(struct semaphore*) Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ динамичСски созданного сСмафора ΠΈ установка Π΅Π³ΠΎ счСтчика использования Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1 init_MUTEX_LOCKED (struct semaphore*) Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ динамичСски созданного сСмафора ΠΈ установка Π΅Π³ΠΎ счСтчика использования Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 (Ρ‚.Π΅. сСмафор ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½) down_interruptible(struct semaphore *) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ сСмафор ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ состояниС оТидания, Ссли сСмафор находится Π² состоянии ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ (contended) down(struct semaphore*) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ сСмафор ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ состояниС оТидания, Ссли сСмафор находится Π² состоянии ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ (contended) down_trylock(struct semaphore*) Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ сСмафор ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли сСмафор находится Π² состоянии ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‚Π΅ (contended) up(struct semaphore*) ΠžΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ сСмафор ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰Π΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅, Ссли Ρ‚Π°ΠΊΠΎΠ΅ Π΅ΡΡ‚ΡŒ

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ чтСния-записи

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΈΠΏΠ° чтСния-записи. Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмафоры чтСния-записи Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² случаС использования спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ чтСния-записи ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ структуры struct rw_semaphore, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ <asm/rwsem.h>. БтатичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ сСмафор чтСния-записи ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

static DECLARE_RWSEM(name);

Π³Π΄Π΅ name β€” это имя Π½ΠΎΠ²ΠΎΠ³ΠΎ сСмафора.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ чтСния-записи, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ динамичСски, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

init_rwsem(struct rw_semaphore *sem);

ВсС сСмафоры чтСния-записи ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΌΠΈ (mutex), Ρ‚.Π΅. ΠΈΡ… счСтчик использования Ρ€Π°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅. Π›ΡŽΠ±ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² чтСния ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния, Ссли ΠΏΡ€ΠΈ этом Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° записи. И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ записи ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π½Π° запись, Ссли Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° чтСния. ВсС сСмафоры чтСния-записи ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ состояниС оТидания, поэтому сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ down(). Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

static DECLARE_RWSEM(mr_rwsem);


/* ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ сСмафор для чтСния */

down_read(&mr_rwsem);


/* критичСский участок (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅) ... */


/* освобоТдаСм сСмафор */

up_read(&mr_rwsem);

/* ... * /


/* ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ сСмафор Π½Π° запись */

down_write(&mr_rwsem);


/* освобоТдаСм сСмафор */

/* критичСский участок (Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись) ... */

up write(&mr_rwsem);

Для сСмафоров Π΅ΡΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ down_read_trylock() ΠΈ down_write_trylock(). КаТдая ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° сСмафор чтСния-записи. ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈ Π½ΡƒΠ»ΡŒ, Ссли Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° находится Π² состоянии ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ β€” ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ повСдСнию Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… сСмафоров, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π±Π΅Π· всякой Π½Π° Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹!

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ чтСния-записи ΠΈΠΌΠ΅ΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π°Π½Π°Π»ΠΎΠ³Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Ρ‚ для спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи. Π­Ρ‚ΠΎ функция downgrade_writer(), которая автоматичСски ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π½Π° запись, Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅.

Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ чтСния-записи, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π΅ΡΡ‚ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ участками ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, ΠΈ участками ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ запись. ИспользованиС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния-записи ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌ, поэтому ΠΈΡ… стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° участки чтСния ΠΈ записи.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ сСмафоров

ПониманиС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π° ΠΊΠΎΠ³Π΄Π° сСмафоры являСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ для написания ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Однако Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ просто. Π’ контСкстС прСрывания ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСмафор ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ процСссом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² состоянии оТидания. Π’ Ρ‚Π°Π±Π». 9.6 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΠ±Π·ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.


Π’Π°Π±Π»ΠΈΡ†Π° 9.6. Π§Ρ‚ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: сСмафоры ΠΈΠ»ΠΈ спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° с ΠΌΠ°Π»Ρ‹ΠΌΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ Π·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ (low overhead) Π‘ΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ МалоС врСмя удСрТания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π‘ΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ Π”Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя удСрТания Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ НСобходимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π² контСкстС прСрывания НСобходима спин-Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° НСобходимо ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² состояниС оТидания (steep) ΠΏΡ€ΠΈ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ НСобходимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСмафоры

УсловныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

УсловныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (conditional variable, completion variable) β€” простоС срСдство синхронизации ΠΌΠ΅ΠΆΠ΄Ρƒ двумя заданиями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ядра, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ послало сигнал Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ событиС. ΠŸΡ€ΠΈ этом ΠΎΠ΄Π½ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Когда Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΎΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ всС ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Π½Π΅ΠΉ задания. Если это каТСтся ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ сСмафора, Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΎΠ½ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ, идСя Ρ‚Π° ΠΆΠ΅. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ просто ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ситуациях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ сСмафоры. НапримСр, Π² систСмном Π²Ρ‹Π·ΠΎΠ²Π΅ vfork() условная пСрСмСнная ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ процСсса ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ.