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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 250

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

Одним ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ Π²Π°ΠΌ созданиС Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π»Π°Π³Π°

O_EXCL
Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
open
, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ΅ созданиС Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ…ΠΎΡ€ΠΎΡˆ для простых Π·Π°Π΄Π°Ρ‡, Π½ΠΎ становится довольно ΠΏΡƒΡ‚Π°Π½Π½Ρ‹ΠΌ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ нСэффСктивным ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ слоТных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ².

Π’Π°ΠΆΠ½Ρ‹ΠΉ шаг Π²ΠΏΠ΅Ρ€Π΅Π΄ Π² сфСрС ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π±Ρ‹Π» сдСлан, ΠΊΠΎΠ³Π΄Π° голландский спСциалист Π² области ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊ ЭдсгСр ДСйкстра (Edsger Dijkstra) ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» идСю сСмафоров. Как ΡƒΠΆΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 12, сСмафор β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘ΡƒΠ΄Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассказано, ΠΊΠ°ΠΊ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ сСмафоры ΠΈ ΠΊΠ°ΠΊ для взаимодСйствия ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… процСссов ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния вмСсто особого случая ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΈΡΡŒ Π² Π³Π»Π°Π²Π΅ 12.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ Π±ΠΎΠ»Π΅Π΅ строго, сСмафор β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ приостановкой (wait) ΠΈ ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠ΅ΠΌ (signal). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Linux Ρƒ приостановки ΠΈ оповСщСния ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

β–‘Β 

P
(пСрСмСнная-сСмафор) для приостановки (wait);

β–‘Β 

V
(пСрСмСнная-сСмафор) для оповСщСния (signal).

Π­Ρ‚ΠΈ Π±ΡƒΠΊΠ²Ρ‹ взяты ΠΈΠ· голландских слов для приостановки (passeren β€” ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π² случаС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄ критичСской сСкциСй) ΠΈ для оповСщСния (vrijgeven β€” ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π² случаС ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ контроля критичСской сСкции). Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ "Π²Π²Π΅Ρ€Ρ…" (up) ΠΈ "Π²Π½ΠΈΠ·" (down), примСняСмыС Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ сСмафоров ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с использованиСм ΡΠΈΠ³Π½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π»Π°ΠΆΠΊΠΎΠ².

ОписаниС сСмафора

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ сСмафор β€” это пСрСмСнная, способная ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния 0 ΠΈ 1, Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ сСмафор. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнный Π²ΠΈΠ΄ сСмафора. Π‘Π΅ΠΌΠ°Ρ„ΠΎΡ€Ρ‹, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ сСмафорами ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°. Π’ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ части Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ сосрСдоточимся Π½Π° Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… сСмафорах.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

P
ΠΈ
V
ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просты. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ пСрСмСнная-сСмафор
sv
. Π’ этом случаС ΠΎΠ±Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ прСдставлСно Π² Ρ‚Π°Π±Π». 14.1.

Π’Π°Π±Π»ΠΈΡ†Π° 14.1

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ ОписаниС
Π (sv)
Если
sv
большС нуля, ΠΎΠ½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Если sv Ρ€Π°Π²Π½Π° 0, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ процСсса приостанавливаСтся
V(sv)
Если ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс Π±Ρ‹Π» приостановлСн Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ сСмафора
sv
, пСрСмСнная заставляСт Π΅Π³ΠΎ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ процСсс Π½Π΅ приостановлСн Π² ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ сСмафора
sv
, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ

Π”Ρ€ΡƒΠ³ΠΎΠΉ способ описания сСмафора β€” ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пСрСмСнная

sv
, равная
true
, ΠΊΠΎΠ³Π΄Π° доступна критичСская сСкция, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ
P(sv)
ΠΈ становится Ρ€Π°Π²Π½Π°
false
, ΠΊΠΎΠ³Π΄Π° критичСская сСкция занята, ΠΈ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ
V(sv)
, ΠΊΠΎΠ³Π΄Π° критичСская сСкция снова доступна. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ обычная пСрСмСнная, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚Π΅ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π½Π΅ годится, Ρ‚.ΠΊ. Π² языках Π‘, Π‘++, C# ΠΈΠ»ΠΈ практичСски Π² любом Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ языкС программирования Ρƒ вас Π½Π΅Ρ‚ возмоТности ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΡƒΡŽ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΡƒΡŽ, Ρ€Π°Π²Π½Π° Π»ΠΈ пСрСмСнная
true
, ΠΈ Ссли это Ρ‚Π°ΠΊ, ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΡƒΡŽ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°
false
. ИмСнно эта Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с сСмафором особСнными.

ВСорСтичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простого тСорСтичСского ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ дСйствуСт сСмафор. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° процСсса: proc1 ΠΈ proc2, ΠΎΠ±Π° Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния Π² монопольном доступС ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Ρ‹ опрСдСляСтС ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ сСмафор

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

Оба процСсса совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-сСмафор

sv
. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ процСсс Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
P(sv)
, ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сСмафор ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠΉΡ‚ΠΈ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‚ΠΎΡ€ΠΎΠΌΡƒ процСссу Π²Ρ…ΠΎΠ΄ Π² ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½, Ρ‚.ΠΊ., ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ попытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
P(sv)
, ΠΎΠ½ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ процСсс Π½Π΅ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ‚ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
V(sv)
, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡŽΡ‰ΡƒΡŽ сСмафор.

Π’Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ псСвдокод Ρƒ ΠΎΠ±ΠΎΠΈΡ… процСссов ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½:

semaphore sv = 1;

loop forever {

Β P(sv);

Β critical code section;

Β V(sv);

Β noncritical code section;

}

Код Π½Π° ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ΠΈΠ΅ прост, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

P
ΠΈ
V
надСляСт ΠΈΡ… большими Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ возмоТностями.

ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² Linux - image048.jpg

Рис. 14.1 

На рис. 14.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° схСма Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

P
ΠΈ
V
, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Π²ΠΎΡ€ΠΎΡ‚Π° Π² критичСских сСкциях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

РСализация сСмафоров Π² Linux

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сСмафоры ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡ… свойства Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ОБ Linux. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ большС возмоТностСй, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ трСбуСтся. ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сСмафоров Π² Linux ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ массивами сСмафоров ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°, Π° Π½Π΅ ΠΎΠ΄Π½ΠΈΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ сСмафором. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ всС услоТняСт, Π½ΠΎ Ссли процСсс нуТдаСтся Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… рСсурсов, ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массивом сСмафоров β€” большоС ΠΏΠΎΠ΄ΡΠΏΠΎΡ€ΡŒΠ΅. Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ сосрСдоточимся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… сСмафоров, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сСмафоров:

<b>#include &lt;sys/sem.h&gt;</b>

<b>int semctl(int sem_id, int sem_num,Β int command, ...);</b>

<b>int semget(key_t key, int num_sems,Β int sem_flags);</b>

<b>int semop(int sem_id, struct sembufΒ *sem_ops, size_t num_sem_ops);</b>