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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 66

Автор ДТонсон Π₯Π°Ρ€Ρ‚

ΠœΡ‹ часто Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CS, Π° Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² CS Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ CS. 

VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection)

VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection)

ΠŸΠΎΡ‚ΠΎΠΊ, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ CS, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²ΠΎΠΉΡ‚ΠΈ Π² этот ΠΆΠ΅ CS Π±Π΅Π· Π΅Π³ΠΎ блокирования; это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CRITICAL_SECTION ΡΠ²Π»ΡΡŽΡ‚ΡΡ рСкурсивными (recursive). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ счСтчик Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CS, ΠΈ поэтому ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ CS ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Π±Ρ‹Π»ΠΎ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² Π½Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСкурсивных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ обСспСчСния бСзопасного ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΎΠ±Ρ‰ΠΈΡ… (раздСляСмых) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° CS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ нСпрСдсказуСмым Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ самого ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EnterCriticalSection Π½Π΅ сущСствуСт ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания; Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя, ΠΏΠΎΠΊΠ° ΠΏΠΎΡ‚ΠΎΠΊ, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ CS, Π½Π΅ ΠΏΠΎΠΊΠΈΠ½Π΅Ρ‚ Π΅Π³ΠΎ. Однако, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ TryEnterCriticalSection, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ) CS, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚ Π»ΠΈ ΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. 

BOOL TryEnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) 

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ TryEnterCriticalSection значСния True ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π» ΠΏΡ€Π°Π²Π° владСния критичСским участком ΠΊΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ значСния False Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ критичСский участок ΠΊΠΎΠ΄Π° ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CRITICAL_SECTION ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Ρ‚Π΅ΠΌ прСимущСством, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ядра ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ пространствС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΠΎ Π½Π΅ всСгда, это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. К ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ аспСктов ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡ‹ вСрнСмся послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ознакомимся с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ синхронизации, относящимися ΠΊ ядру.

Настройка спин-счСтчика

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ EnterCriticalSection ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CS ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, ΠΎΠ½ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ядро ΠΈ остаСтся Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ освободится ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ CRITICAL_SECTION, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Однако Π² SMP-систСмах Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠ» ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ Π·Π°Π²Π»Π°Π΄Π΅Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ CS, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сущСствуСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Π»Π°Π΄Π΅ΡŽΡ‰ΠΈΠΉ CS, выполняСтся Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ процСссорС ΠΈ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ CS. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ссли ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ высокая ΡΠΎΡΡ‚ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π° ΠΏΡ€Π°Π²ΠΎ владСния СдинствСнным ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ CRITICAL_SECTION. ВлияниС упомянутых Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ обсуТдаСтся Π΄Π°Π»Π΅Π΅ Π² этой ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ….

Для настройки счСтчика занятости, ΠΈΠ»ΠΈ спин-счСтчика (spin-count), ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, SetCriticalSectionSpinCount, обСспСчиваСт Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ настройку счСтчика, Π° вторая, InitializeCritical-SectionAndSpinCount, выступаСт Π² качСствС Π·Π°ΠΌΠ΅Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Initialize-CriticalSection. Настройка спин-счСтчика рассматриваСтся Π² Π³Π»Π°Π²Π΅ 9.

ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CRITICAL_SECTION для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ раздСляСмыхпСрСмСнных

ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CRITICAL_SECTION Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ слоТностСй, ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных способов ΠΈΡ… примСнСния являСтся обСспСчСниС доступа ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΊ раздСляСмым Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ сСрвСр (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ прСдставлСнному Π½Π° рис. 7.1), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ вСсти ΡƒΡ‡Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… статистичСских Π΄Π°Π½Π½Ρ‹Ρ…:

β€’ ΠžΠ±Ρ‰Π΅Π΅ количСство ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… запросов.

β€’ ΠžΠ±Ρ‰Π΅Π΅ количСство ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².

β€’ ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ запросов, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² настоящСС врСмя всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ сСрвСра. 

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ счСтчиков ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ процСсса, нСльзя Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° измСняли ΠΈΡ… значСния. Один ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² обСспСчСния этого, Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CRITICAL_SECTION, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ схСма, показанная Π½ΠΈΠΆΠ΅ Π½Π° рис. 8.2. ИспользованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CRITICAL_SECTION дСмонстрируСтся Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ 8.1, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ систСму, Ρ‡Π΅ΠΌ сСрвСрная.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CS ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚ΡŒΡΡ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ рис. 8.1, Π³Π΄Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° обСспСчиваСт Π½Π΅Ρ‡Ρ‚ΠΎ большСС, Π½Π΅ΠΆΠ΅Π»ΠΈ простоС ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для этого достаточно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями Π²Π·Π°ΠΈΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° спСцификатор volatile, ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ компилятором Π² рСгистрС, Π° Π½Π΅ Π² ячСйкС памяти, ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ промСТуточная пСрСмСнная; этот Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт сниТаСт ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ позволяСт Π±ΠΎΠ»Π΅Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π·Π°Π΄Π°Ρ‡Π°, ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠ°Ρ рис. 8.1.

CRITICAL_SECTION cs1;

volatile DWORD N = 0, М;

/* N β€” глобальная пСрСмСнная, раздСляСмая всСми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. */

InitializeCriticalSection (&cs1);

…

EnterCriticalSection (&cs1);

if (N < N_MAX) { M = N; M += 1; N = M; }

LeaveCriticalSection (&cs1);

…

DeleteCriticalSection (&cs1);

На рис. 8.2 прСдставлСна ΠΎΠ΄Π½Π° ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для случая, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 8.1, ΠΈ продСмонстрировано, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CS ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ синхронизации.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 8.1 дСмонстрируСт, насколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CS.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: простая систСма "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ"

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 8.1 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, насколько ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ CS. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° дСмонстрируСт, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… для хранСния состояний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈ Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ с понятиСм ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° (invariant) β€” свойства состояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ гарантируСтся (ΠΏΡƒΡ‚Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹), Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ истинным Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ критичСского участка ΠΊΠΎΠ΄Π°. 

Рис. 8.2. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅ΠΉ памяти синхронизированными ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ


ОписаниС Π·Π°Π΄Π°Ρ‡ΠΈ приводится Π½ΠΈΠΆΠ΅.

β€’ Π˜ΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ (producer) ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ (consumer), Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅.

β€’ ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ пСриодичСски создаСт сообщСния, содСрТащиС Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ чисСл, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Π±ΠΈΡ€ΠΆΠ΅Π²Ρ‹Ρ… ΠΊΠΎΡ‚ΠΈΡ€ΠΎΠ²ΠΎΠΊ, которая пСриодичСски обновляСтся.

β€’ ΠŸΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅. ВрСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ прСдставляли собой самый послСдний ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π΄Π²Π°ΠΆΠ΄Ρ‹.

β€’ Π”Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π² Ρ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ; ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ сообщСния Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, "Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ". Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся частным случаСм ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

β€’ Π’ качСствС срСдства контроля цСлостности Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ вычисляСт ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму[28] Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, которая Π΄Π°Π»Π΅Π΅ сравниваСтся с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ суммой, вычислСнной ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π΄Π°Π±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π”Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π΅Π΅ обновлСния, Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ; использованиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CS Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ этого Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. Π˜Π½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±Π»ΠΎΠΊΠ° сообщСния (message block invariant) являСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы для содСрТимого Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ сообщСния.

β€’ Обоими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ поддСрТиваСтся статистика суммарного количСства ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈ утСрянных сообщСний.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 8.1.simplePC: простая систСма "ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ/ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ"

/* Π“Π»Π°Π²Π° 8. simplePC.с */

/* ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” производитСля ΠΈ потрСбитСля. */

/* ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ пСриодичСски создаСт Π±ΡƒΡ„Π΅Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ */

/* суммами, ΠΈΠ»ΠΈ "Π±Π»ΠΎΠΊΠΈ сообщСний", ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΠΎ запросу */

/* ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. */


#include "EvryThng.h"

#include <time.h>

#define DATA_SIZE 256


typedef struct msg_block_tag { /* Π‘Π»ΠΎΠΊ сообщСния. */

 volatile DWORD f_ready, f_stop; /* Π€Π»Π°Π³ΠΈ готовности ΠΈ прСкращСния ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉ. */

 volatile DWORD sequence; /* ΠŸΠΎΡ€ΡΠ΄ΠΊΠΎΠ²Ρ‹ΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π±Π»ΠΎΠΊΠ° сообщСния. */

 volatile DWORD nCons, nLost;

 time_t timestamp;

 CRITICAL_SECTION mguard; /* Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π·Π°Ρ‰ΠΈΡ‚Ρ‹ Π±Π»ΠΎΠΊΠ° сообщСния. */

 DWORD checksum; /* ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма содСрТимого сообщСния. */

 DWORD data[DATA_SIZE]; /* Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ сообщСния. */

} MSG_BLOCK;