Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Race condition ΠΈ D ata Race

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΠ΅Ρ€ΠΈΡŽ статСй ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… многопоточности, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ΅, concurrency ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… интСрСсных ΡˆΡ‚ΡƒΠΊΠ°Ρ….

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Race condition ΠΈ data race β€” Π΄Π²Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ многопоточности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто ΠΏΡƒΡ‚Π°ΡŽΡ‚. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ.

Race condition

БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²ΠΎΠΊ опрСдСлСния:

Race condition прСдставляСт собой класс ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы зависит ΠΎΡ‚ Π΄Π²ΡƒΡ… нСзависимых событий, происходящих Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС, ΠΎΠ΄Π½Π°ΠΊΠΎ отсутствуСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ фактичСскоС Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ этих событий.

Race condition β€” ошибка проСктирования ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ систСмы ΠΈΠ»ΠΈ прилоТСния, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π° систСмы ΠΈΠ»ΠΈ прилоТСния зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ порядкС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ части ΠΊΠΎΠ΄Π°.

Race condition β€” это Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация, которая Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° устройство ΠΈΠ»ΠΈ систСма пытаСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π²Π΅ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ устройства ΠΈΠ»ΠΈ систСмы, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Race condition β€” это нСдостаток, связанный с синхронизациСй ΠΈΠ»ΠΈ упорядочСниСм событий, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠΌΡƒ повСдСнию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Но ΠΌΠ½Π΅ Π½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ ΠΈ простоС:

Race condition β€” это нСдостаток, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° врСмя ΠΈΠ»ΠΈ порядок событий Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Race condition β€” это сСмантичСская ошибка.

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ элСктронных схСм Π΅ΡΡ‚ΡŒ похоТая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

БостязаниС сигналов β€” явлСниС Π² Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… устройствах нСсоотвСтствия Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠ³ΠΎ устройства с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ возникновСния ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π½Ρ‹Ρ… процСссов Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ΡƒΡ€Π΅.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π³Π΄Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½:

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΊΠΎΠ΄Π° зависит ΠΎΡ‚ порядка выполнСния Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½. Π­Ρ‚ΠΎ типичная ошибка race condition. Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ€Π°Π·Π΄ΠΎ слоТнСй ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π΅ΠΉ.

Учитывая, Ρ‡Ρ‚ΠΎ race condition сСмантичСская ошибка, Π½Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ способа ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС.

ΠŸΠΎΠΌΠΎΡ‡ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° консолС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа, Π° расчитывали ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ‚Π½Ρ‹Π΅.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с доступом ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ автоматичСски ΠΈ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синхронизации:

или локальной копиСй:

Data Race

Data race это состояниС ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ячСйкС памяти Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ синхронизации ΠΈ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² осущСствляСт запись.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с балансом Π½Π° счСту:

ЗапускаСм Π² Ρ€Π°Π·Π½Ρ‹Ρ… Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°Ρ…:

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ баланс Ρ€Π°Π²Π΅Π½ 0, Π΄Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠΌ 1000 Ρ€Π°Π· ΠΏΠΎ 1. ОТидаСм баланс Ρ€Π°Π²Π½Ρ‹ΠΉ 1000, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

ΠŸΠΎΡ‚Π΅Ρ€ΡΠ»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π΅Π½Π΅Π³.

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ опСрация acc.balance += amount Π½Π΅ атомарная. Она ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒΡΡ Π½Π° 3:

Пока ΠΌΡ‹ мСняСм Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΡƒΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ основной balance. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ тСряСтся Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

НапримСр, Ρƒ нас 2 ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ балансу ΠΏΠΎ 1:

ОТидали ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ баланс=102, Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ = 101.

Π£ Data Race Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ связано с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ поэтому ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. БущСствуСт мноТСство разновидностСй Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (статичСскоС/динамичСскоС ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π½Π° основС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ основанноС Π½Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… событий, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΈΠ±Ρ€ΠΈΠ΄Π½ΠΎΠ³ΠΎ data race).

Π£ Go Π΅ΡΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Data Race Detector с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ ошибки ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ.

Π Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ синхронизации:

Race Condition ΠΈ Data Race

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Ѐункция для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° срСдств с ΠΎΠ΄Π½ΠΎΠ³ΠΎ счСта Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

На ΠΎΠ΄Π½ΠΎΠΌ счСту Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ 1000, Π° Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ 0. ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ 1 Π² 1000 Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°Ρ… ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС дСньги ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ счСта ΠΏΠ΅Ρ€Π΅Ρ‚Π΅ΠΊΡƒΡ‚ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ:

Но Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ:

Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» Π½Π° большСС ΠΊΠΎΠ»-Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ интСрСснСй:

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±Π΅Π· внСшнСй синхронизации эта функция допускаСт ΠΊΠ°ΠΊ dara race (нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ баланс счСта), Ρ‚Π°ΠΊ ΠΈ race condition (Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ контСкстС это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Π΅Π½Π΅Π³).

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ копию. ΠžΠ±Ρ‰Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΈ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ выглядит Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ:

Π£ нас синхронизированы всС участки с записью ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ, Ρƒ нас Π΅ΡΡ‚ΡŒ локальная копия, Race Detector большС Π½Π΅ ругаСтся Π½Π° ΠΊΠΎΠ΄. ЗапускаСм 1000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π²Π΅Ρ€Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Но Ρ‡Ρ‚ΠΎ Ссли Π³ΠΎΡ€ΡƒΡ‚ΠΈΠ½ Π±ΡƒΠ΄Π΅Ρ‚ 10ΠΊ:

ΠœΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ data race, Π½ΠΎ race condition остался. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ Π½Π° всю Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° срСдств, Π½ΠΎ это Π½Π΅ всСгда Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

РСшив Data Race Ρ‡Π΅Ρ€Π΅Π· ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ доступа ΠΊ памяти (Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ) Π½Π΅ всСгда Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ race condition ΠΈ logical correctness.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΠΎΡ‡Π΅ΠΌΡƒ стоит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ прилоТСния Π½Π° ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ ΠΊ race condition

Если вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ сСрвис Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π²Π°Π»ΡŽΡ‚ΠΎΠΉ, слСдуСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° уязвимости Ρ‚ΠΈΠΏΠ° race condition («состояниС Π³ΠΎΠ½ΠΊΠΈΒ» ΠΈΠ»ΠΈ, Ссли Ρ‚ΠΎΡ‡Π½Π΅Π΅, β€” Β«Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β»). Race condition β€” это Β«ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π°Ρ ошибка», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΈ. Π‘ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ благодаря ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Π²Π°Π»ΡŽΡ‚Π΅ прилоТСния, ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Сю ΠΈ, ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, нанСсти ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹ΠΉ финансовый ΡƒΡ‰Π΅Ρ€Π± Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ сСрвиса. НСдавно ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρƒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π΅Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ race condition

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ Π½Π° ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠ° race condition, хотя эта ошибка довольно распространСна.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния бэкэнда это выглядит Ρ‚Π°ΠΊ: нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ рСсурсу: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ прСдусмотрСна Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ синхронизация. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСсогласованности Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠΉ уязвимости. Допустим, Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ бонусы ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Ρ‹ΠΌΠΈ кошСльками. Π£ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° Π΅ΡΡ‚ΡŒ Π΄Π²Π° кошСлька β€” A ΠΈ B, ΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ 1000 бонусов. На схСмС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ манипулируя Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ запроса Π½Π° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ сумму ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° свой счСт ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ· 10 бонусов β€” 20.

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ автоматичСскиС инструмСнты для поиска Ρ‚Π°ΠΊΠΈΡ… уязвимостСй. НапримСр, RacePWN ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π° минимальноС врСмя отправляСт мноТСство HTTP-запросов Π½Π° сСрвСр ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ json-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, облСгчая процСсс Π°Ρ‚Π°ΠΊΠΈ для Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠ². Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΆΠ΅ это дСлаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ POST-запросов.

Π‘ΠΌΠ΅Ρ€Ρ‚Π΅Π»ΡŒΠ½Π°Ρ race condition

Π’ БША с июня 1985 Π³ΠΎΠ΄Π° ΠΏΠΎ ΡΠ½Π²Π°Ρ€ΡŒ 1987 Π³ΠΎΠ΄Π° ошибка race condition Π² Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π΅ Π»ΡƒΡ‡Π΅Π²ΠΎΠΉ Ρ‚Π΅Ρ€Π°ΠΏΠΈΠΈ Therac-25, созданном канадской государствСнной ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Atomic Energy of Canada Limited (AECL) стала ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΡˆΠ΅ΡΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ·ΠΈΡ€ΠΎΠ²ΠΎΠΊ Ρ€Π°Π΄ΠΈΠ°Ρ†ΠΈΠ΅ΠΉ. Π–Π΅Ρ€Ρ‚Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΄ΠΎΠ·Ρ‹ Π² дСсятки тысяч Ρ€Π°Π΄. Π‘ΠΌΠ΅Ρ€Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ считаСтся ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π² 1000 Ρ€Π°Π΄. ПослС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΎΠΆΠΎΠ³ΠΎΠ² ΠΏΠΎΡΡ‚Ρ€Π°Π΄Π°Π²ΡˆΠΈΠ΅ ΡƒΠΌΠ΅Ρ€Π»ΠΈ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… нСдСль. Π’Ρ‹ΠΆΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°Ρ†ΠΈΠ΅Π½Ρ‚ΠΊΠ΅.

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Therac ΠΈΠΌΠ΅Π»ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹: нСзависимыС Ρ†Π΅ΠΏΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ элСктронный Π»ΡƒΡ‡; мСханичСскиС Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‚ΠΎΡ€Ρ‹; Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ автоматичСскиС Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ; ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΠΈ. Π’ Therac-25 Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΡƒΡŽ Π·Π°Ρ‰ΠΈΡ‚Ρƒ ΡƒΠ±Ρ€Π°Π»ΠΈ. Π—Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС. Аппарат ΠΈΠΌΠ΅Π» нСсколько Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΈ ΠΈΠ·-Π·Π° ошибки race condition Π²Ρ€Π°Ρ‡ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π», Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° самом Π΄Π΅Π»Π΅. Π’ Ρ…ΠΎΠ΄Π΅ судСбных Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π² Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ПО Therac-25 Π±Ρ‹Π»ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ ΠΎΠ΄Π½ΠΈΠΌ программистом, Π½ΠΎ Ρƒ AECL Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ΅ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ.

По ΠΈΡ‚ΠΎΠ³Π°ΠΌ процСсса ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ БША ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ уТСсточило трСбования ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ систСм, Ρ‡ΡŒΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° для людСй.

Как Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒΡΡ

ΠŸΡ€ΠΎΡ‰Π΅ ΠΈ дСшСвлС всСго Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ race condition β€” ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ прилоТСния. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ для этого слСдуСт ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

Как ΠΌΡ‹ нашли ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ

Наш ΠΊΠ»ΠΈΠ΅Π½Ρ‚ β€” ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-ΠΌΠ°Π³Π°Π·ΠΈΠ½ доставки ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ прСдоставлСния скидок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΡƒΠΏΠΎΠ½ΠΎΠ². Π’ процСссС тСстирования ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ β€” ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ POST-запроса со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΡƒΠΏΠΎΠ½Π°. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡ запрос с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ°ΠΌΠΈ, ΡƒΠ΄Π°Π²Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ скидку Π΄Π²Π°ΠΆΠ΄Ρ‹. Будя ΠΏΠΎ всСму, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ допустили Π³Ρ€ΡƒΠ±ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ с раздСляСмым доступом ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ отоТдСствлялся с ΠΏΠΎΠΊΡƒΠΏΠΊΠΎΠΉ.

РСшСниС

Race condition Π½Π΅ слСдуСт Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ. Π›ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΈ рСсурсы Π½Π° поиск уязвимости, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹Ρ… послСдствий, Π² Ρ‚ΠΎΠΌ числС для Π±ΡŽΠ΄ΠΆΠ΅Ρ‚Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

20.5. Битуация Π³ΠΎΠ½ΠΎΠΊ

20.5. Битуация Π³ΠΎΠ½ΠΎΠΊ

Битуация Π³ΠΎΠ½ΠΎΠΊ (race condition) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° мноТСство процСссов ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ для Π½ΠΈΡ… Π΄Π°Π½Π½Ρ‹ΠΌ, Π½ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° зависит ΠΎΡ‚ порядка выполнСния процСссов. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ порядок выполнСния процСссов Π² Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… систСмах Unix зависит ΠΎΡ‚ мноТСства Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ запуска ΠΊ запуску, ΠΈΠ½ΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½, Π° ΠΈΠ½ΠΎΠ³Π΄Π° β€” Π½Π΅Ρ‚. НаиболСС слоТным для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠΌ Π³ΠΎΠ½ΠΎΠΊ являСтся Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ°. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ ситуациях Π³ΠΎΠ½ΠΎΠΊ ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² Π³Π»Π°Π²Π΅ 26, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (mutex) ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (condition variables). ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² всСгда Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ситуациями Π³ΠΎΠ½ΠΎΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ количСство Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΠΎΠ±Ρ‰ΠΈΠΌ для всСх ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, всС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅).

Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ Π³ΠΎΠ½ΠΎΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° часто Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с сигналами. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сигнал, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доставлСн Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎ врСмя выполнСния нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. POSIX позволяСт Π½Π°ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доставку сигнала, Π½ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° это часто Π½Π΅ Π΄Π°Π΅Ρ‚ эффСкта.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Битуация Π³ΠΎΠ½ΠΎΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· листинга 20.1. ΠŸΠΎΡ‚Ρ€Π°Ρ‚ΡŒΡ‚Π΅ нСсколько ΠΌΠΈΠ½ΡƒΡ‚ ΠΈ посмотритС, смоТСтС Π»ΠΈ Π²Ρ‹ Π΅Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. (Подсказка: Π² ΠΊΠ°ΠΊΠΎΠΌ мСстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° доставляСтся сигнал?) Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π³ΠΎΠ½ΠΎΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alarm с 5 Π½Π° 1 ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² sleep(1) сразу ΠΆΠ΅ послС printf.

Когда ΠΌΡ‹ послС внСсСния этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π°Π±Π΅Ρ€Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строку Π²Π²ΠΎΠ΄Π°, эта строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° ΠΊΠ°ΠΊ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС, Π° ΠΌΡ‹ установим Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ alarm Ρ€Π°Π²Π½Ρ‹ΠΌ 1 с. ΠœΡ‹ блокируСмся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom, Π° Π·Π°Ρ‚Π΅ΠΌ для нашСго сокСта ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚, вСроятно, Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… миллисСкунд. ΠžΡ‚Π²Π΅Ρ‚ возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ recvfrom, Π½ΠΎ Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ…ΠΎΠ΄ΠΈΠΌ Π² спящСС состояниС Π½Π° ΠΎΠ΄Π½Ρƒ сСкунду. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ сокСта. Но ΠΏΠΎΠΊΠ° ΠΌΡ‹ находимся Π² спящСм состоянии, врСмя Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° alarm истСкаСт ΠΈ гСнСрируСтся сигнал SIGALRM. ΠŸΡ€ΠΈ этом вызываСтся наш ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sleep, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ повторяСм Ρ†ΠΈΠΊΠ» ΠΈ Ρ‡ΠΈΡ‚Π°Π΅ΠΌ установлСнныС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ с ΠΏΠ°ΡƒΠ·ΠΎΠΉ Π² ΠΎΠ΄Π½Ρƒ сСкунду ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° выводится ΠΎΡ‚Π²Π΅Ρ‚. ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² всС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹, ΠΌΡ‹ снова блокируСмся Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΡƒΠΆΠ΅ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠœΡ‹ окаТСмся навсСгда Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom. Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° здСсь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ наша Ρ†Π΅Π»ΡŒ β€” ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ блокирования Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала, ΠΎΠ΄Π½Π°ΠΊΠΎ сигнал ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доставлСн Π² любоС врСмя, ΠΈ наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ доставки сигнала ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² любом мСстС бСсконСчного Ρ†ΠΈΠΊΠ»Π° for.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: ΠΎΠ΄Π½ΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ ΠΈ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сигнала

НашС ΠΏΠ΅Ρ€Π²ΠΎΠ΅ (Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅) Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сниТаСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ появлСния ошибки, блокируя сигнал ΠΈ прСдотвращая Π΅Π³ΠΎ доставку, ΠΏΠΎΠΊΠ° наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выполняСт ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Ρ‡Π°ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Π° for. Π­Ρ‚Π° вСрсия прСдставлСна Π² листингС 20.2.

Листинг 20.2. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сигналов ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π² Ρ†ΠΈΠΊΠ»Π΅ for (Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅)

2 static void recvfrom_alarm(int);

4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

8 char sendline[MAXLINE], recvline[MAXLINE + 1];

9 sigset_t sigset_alrm;

11 struct sockaddr *preply_addr;

12 preply_addr = Malloc(servlen);

13 Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

16 Signal(SIGALRM, recvfrom_alarm);

18 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

23 n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);

25 if (n ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ЛитРСс

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

10.4.5. Бостояния Π³ΠΎΠ½ΠΎΠΊ ΠΈ sig_atomic_t (ISO C)

10.4.5. Бостояния Π³ΠΎΠ½ΠΎΠΊ ΠΈ sig_atomic_t (ISO C) Пока ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала Π·Π° Ρ€Π°Π· выглядит просто: установка ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала Π² main() ΠΈ (Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ) пСрСустановка самого сСбя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ сигнала (ΠΈΠ»ΠΈ установка дСйствия SIG_IGN) Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ дСйствия ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.Но Ρ‡Ρ‚ΠΎ

РСальная ситуация

РСальная ситуация Рис. 5.7. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ³ΠΎ) сайта

Битуация 4. Авария Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ диска

Битуация 4. Авария Π·Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ³ΠΎ диска ВСхничСский Π±Π°Π½Π΄ΠΈΡ‚. Π§ΠΈΠ½ΠΈΡ‚ диск. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π΅ΠΌΡƒ удаСтся Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму прямо ΠΈΠ· ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Если это Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚, запускаСт микроядро, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ запускаСт Π½Π° сосСднСм ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ скрипт, ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π½Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΡƒΡŽ

Битуация 5. Блабая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСти

Битуация 5. Блабая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сСти ВСхничСский Π±Π°Π½Π΄ΠΈΡ‚. ΠŸΠΈΡˆΠ΅Ρ‚ скрипт для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° сСти, пСрСписываСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС, Ρ‡Π΅ΠΌ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π° 2%. ΠŸΠΎΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ»Π΅Ρ‡Π°ΠΌΠΈ, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: «Π― сдСлал всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³», ΠΈ отправляСтся Π² ΠΏΠΎΡ…ΠΎΠ΄ Π²

Битуация 7. Установка Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы

Битуация 7. Установка Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ВСхничСский Π±Π°Π½Π΄ΠΈΡ‚. Π˜Π·ΡƒΡ‡Π°Π΅Ρ‚ исходныС тСксты Π½ΠΎΠ²ΠΎΠΉ вСрсии ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΈΠ· Π½ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ нравится.Администратор-Ρ„Π°ΡˆΠΈΡΡ‚. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠ·ΡƒΡ‡Π°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½ΠΎΠ΄Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π°ΠΊΡ‚Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ² производитСля, ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ

3. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Π°Ρ ситуация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π»ΠΈ

3. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Π°Ρ ситуация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Π»ΠΈ НавСрняка Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π² ΠΆΠΈΠ·Π½ΠΈ Π±Ρ‹Π»ΠΈ ситуации, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ боялись ΠΈΠ»ΠΈ испытывали дискомфорт. НапримСр, Π²ΠΎ врСмя ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… выступлСний ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ‰Π΅Π½ΠΈΠΈ с ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹ΠΌ ΠΏΠΎΠ»ΠΎΠΌ, Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅. Π£ вас Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π²Ρ‹ ΠΈΡ…

БизнСс-ситуация 1.2: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

БизнСс-ситуация 1.2: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Брэд ДТонс понял, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Jones Novelties Incorporated Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ способ сохранСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°Ρ…. Он ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΅Π³ΠΎ Π΄Π΅Π»ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠΎΠ² Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ, ΠΈ поэтому Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ

ΠΠΠΠ›Π˜Π—Π«: ΠŸΠ°Ρ‚ΠΎΠ²Π°Ρ патСнтная ситуация

ΠΠΠΠ›Π˜Π—Π«: ΠŸΠ°Ρ‚ΠΎΠ²Π°Ρ патСнтная ситуация 6 июля сСго Π³ΠΎΠ΄Π° Π•Π²Ρ€ΠΎΠΏΠ°Ρ€Π»Π°ΠΌΠ΅Π½Ρ‚ 648 голосами ΠΏΡ€ΠΎΡ‚ΠΈΠ² 14 Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΠΈΠ» Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ ЕвросовСтом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Β«Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΎ ΠΏΠ°Ρ‚Π΅Π½Ρ‚ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎ-Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ΠΈΠΉΒ», ΡΡ‚Π°Π²ΡˆΠ΅ΠΉ Π·Π° послСдний Π³ΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ извСстной

ΠΠ΅Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½Π°Ρ ситуация

ΠΠ΅Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½Π°Ρ ситуация Π’ этом Π³ΠΎΠ΄Ρƒ самоС Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ мСроприятиС осСни, Tokyo Game Show, посСтило Ρ€Π΅ΠΊΠΎΡ€Π΄Π½ΠΎΠ΅ количСство Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ ΠΈΠ³Ρ€ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π°Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΉ β€” Π±ΠΎΠ»Π΅Π΅ 176 тысяч Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. По Π΄Π°Π½Π½Ρ‹ΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° выставки, ассоциации Computer Entertainment Supplier’s Association, ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΉ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Race conditon Π² Π²Π΅Π±-прилоТСниях

МногиС Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ race condition. А Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π΅Π΅ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΡƒΡŽΡ‚. Автор расскаТСт ΠΊΠ°ΠΊ ΠΈ с Ρ‡Π΅ΠΌ Π΅Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ.

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

ΠŸΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π±Π΅Ρ€Π΅Ρ‚ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΡΡŽΠΆΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ сцСнариСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π·Π°Π΄Π°Ρ‡Π° программиста β€” Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π΄Π΅Π½Π΅Π³ (Π±Π°Π»Π»ΠΎΠ², ΠΊΡ€Π΅Π΄ΠΈΡ‚ΠΎΠ²) ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π² Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΡƒΡΡΡŒ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, состоящий ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ.

Вася Ρ…ΠΎΡ‡Π΅Ρ‚ пСрСвСсти 100 Π΄ΠΎΠ»Π»Π°Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅ΡΡ‚ΡŒ Ρƒ Π½Π΅Π³ΠΎ Π½Π° счСту, ΠŸΠ΅Ρ‚Π΅. Он ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ², Π²Π±ΠΈΠ²Π°Π΅Ρ‚ ΠŸΠ΅Ρ‚ΠΈΠ½ Π½ΠΈΠΊ ΠΈ Π² ΠΏΠΎΠ»Π΅ с количСством срСдств, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСвСсти β€” Ρ†ΠΈΡ„Ρ€Ρƒ 100. Π”Π°Π»Π΅Π΅, Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. Π”Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΡƒ ΠΈ сколько ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ? Π§Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ программисту, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ?

● Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρƒ Васи достаточно Π΄Π΅Π½Π΅Π³ Π½Π° счСту

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

● Π’Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ сумму, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСвСсти ΠΈΠ· баланса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

НСобходимо Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ баланса Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΅Π³ΠΎ баланс с Π²Ρ‹Ρ‡Π΅Ρ‚ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ суммы. Π‘Ρ‹Π»ΠΎ 100, стало 100-100=0.

● Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ балансу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠŸΠ΅Ρ‚Ρ сумму ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈ.

ΠŸΠ΅Ρ‚Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Π±Ρ‹Π»ΠΎ 0, стало 0+100=100.

● ВывСсти сообщСниС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ†!

Π£ нас получаСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ псСвдокод:

Если (Вася.баланс >= сумма_ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°) Π’ΠΎ

Но всё Π±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ, Ссли Π±Ρ‹ всС происходило Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π’ΠΎΠ³Π΄Π° Π±Ρ‹ всС запросы Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡŒ Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ. Но Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сайт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ мноТСство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, это всС происходит Π½Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ соврСмСнныС Π²Π΅Π±-прилоТСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π‘ появлСниСм многопоточности Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ появилась забавная архитСктурная ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ β€” состояниС Π³ΠΎΠ½ΠΊΠΈ (ΠΈΠ»ΠΈ race condition). А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ наш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ срабатываСт ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ 3 Ρ€Π°Π·Π°.

Π£ Васи всС Ρ‚Π°ΠΊ ΠΆΠ΅ 100 баксов Π½Π° балансС, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΡ‚ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠ½ обратился ΠΊ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ трСмя ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ (с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ запросами). ВсС Ρ‚Ρ€ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚, сущСствуСт Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠŸΠ΅Ρ‚Ρ, ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚, достаточно Π»ΠΈ баланса Ρƒ Васи для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. Π’ Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠ³Π΄Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ провСряСт баланс, ΠΎΠ½ всё Π΅Ρ‰Π΅ Ρ€Π°Π²Π΅Π½ 100. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Π°, ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ баланса 3 Ρ€Π°Π·Π° вычитаСтся 100, ΠΈ добавляСтся ΠŸΠ΅Ρ‚Π΅.

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π’Π°ΠΊΠΆΠ΅ race condition примСняСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах.

Випичная Π³ΠΎΠ½ΠΊΠ°

Π§Ρ‚ΠΎ Ρ‚Π°ΠΌ Π½Π° сСрвСрС

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ устанавливаСт TCP соСдинСниС, отправляСт Π΄Π°Π½Π½Ρ‹Π΅, ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°, Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ снова, отправляСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, всС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ сами HTTP-запросы ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ синхронно ΠΈ Π² Ρ€Π°Π·Π½ΠΎΠ±ΠΎΠΉ ΠΈΠ·-Π·Π° особСнностСй транспортного уровня, нСобходимости ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ΅ соСдинСниС (HTTPS) ΠΈ Ρ€Π΅Π·ΠΎΠ»Π²ΠΈΡ‚ΡŒ DNS (Π½Π΅ Π² случаС с burp’ом) ΠΈ мноТСства слоёв абстракций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ проходят Π΄Π°Π½Π½Ρ‹Π΅ Π΄ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² сСтСвоС устройство. Когда Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ миллисСкундах, это ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ.

ΠšΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° HTTP

На самом Π΄Π΅Π»Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ linux Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, вСдь Ρ‚Π°ΠΌ Π±ΠΎΠ»Π΅Π΅ соврСмСнный стСк TCP/IP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ поддСрТиваСтся ядрами ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π‘Π΅Ρ€Π²Π΅Ρ€ скорСС всСго Ρ‚ΠΎΠΆΠ΅ Π½Π° Π½Π΅ΠΌ.

НапримСр, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ nc google.com 80 ΠΈ Π²ΡΡ‚Π°Π²ΡŒ Ρ‚ΡƒΠ΄Π° строки

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ соСдинСния Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ Ρ‚Ρ€ΠΈ HTTP-запроса, ΠΈ Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ Ρ‚Ρ€ΠΈ HTTP ΠΎΡ‚Π²Π΅Ρ‚Π°. Π­Ρ‚Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ запросами.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΌ Π½Π° сСрвСрС

Π’Π΅Π±-сСрвСр ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ запросы ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ (ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово), ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π² порядкС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π­Ρ‚Ρƒ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π°Ρ‚Π°ΠΊΠΈ Π² нСсколько шагов (ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Π²Π° дСйствия Π² минимальноС количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) ΠΈΠ»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для замСдлСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ запросС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ*.

Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ HTTP-запроса Π½Π° Π΄Π²Π΅ части

Для Π½Π°Ρ‡Π°Π»Π° вспомни ΠΊΠ°ΠΊ формируСтся HTTP-запрос.

Ну ΠΊΠ°ΠΊ Ρ‚Ρ‹ знаСшь, пСрвая строка это ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡƒΡ‚ΡŒ ΠΈ вСрсия ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°:

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ это Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΈ ΠΈΡ… содСрТимоС

Но ΠΊΠ°ΠΊ Π²Π΅Π±-сСрвСр ΡƒΠ·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ HTTP-запрос закончился?

Π”Π°Π²Π°ΠΉ рассмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π²Π²Π΅Π΄ΠΈ nc google.com 80, Π° Ρ‚Π°ΠΌ

послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ наТмСшь ENTER, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. НаТмСшь Π΅Ρ‰Π΅ Ρ€Π°Π· β€” ΡƒΠ²ΠΈΠ΄ΠΈΡˆΡŒ ΠΎΡ‚Π²Π΅Ρ‚.

GET / HTTP/1.1\r\nHost: google.com\r\n\r\n

Если Π±Ρ‹ это Π±Ρ‹Π» ΠΌΠ΅Ρ‚ΠΎΠ΄ POST (Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎ Content-Length), Ρ‚ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ HTTP-запрос Π±Ρ‹Π» Π±Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ:

Или POST / HTTP/1.1\r\nHost: google.com\r\nContent-Length: 3\r\na=1\r\n\r\n

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ запрос ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки:

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ ΠΎΡ‚Π²Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наш HTTP-запрос ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ. Но Ссли Ρ‚Ρ‹ ΡƒΠ±Π΅Ρ€Π΅ΡˆΡŒ послСдний символ \n, Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡˆΡŒ.

На самом Π΄Π΅Π»Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠΌ Π²Π΅Π±-сСрвСрам достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС пСрСноса \n, поэтому Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами \r ΠΈ \n, ΠΈΠ½Π°Ρ‡Π΅ дальнСйшиС Ρ‚Ρ€ΡŽΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ.

Π§Ρ‚ΠΎ это Π΄Π°Π΅Ρ‚? Π’Ρ‹ моТСшь ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ мноТСство соСдинСний Π½Π° рСсурс, ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ 99% своСго HTTP-запроса ΠΈ оставив Π½Π΅ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ послСдний Π±Π°ΠΉΡ‚. Π‘Π΅Ρ€Π²Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° Ρ‚Ρ‹ Π½Π΅ Π΄ΠΎΡˆΠ»Ρ‘ΡˆΡŒ послСдний символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ясно, Ρ‡Ρ‚ΠΎ основная Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π° β€” Π΄ΠΎΡΠ»Π°Ρ‚ΡŒ послСдний Π±Π°ΠΉΡ‚ (ΠΈΠ»ΠΈ нСсколько).

Π­Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ, Ссли Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ большом POST-запросС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π·Π°Π»ΠΈΠ²ΠΊΠ° Ρ„Π°ΠΉΠ»Π°. Но ΠΈ Π΄Π°ΠΆΠ΅ Π² нСбольшом запросС это ΠΈΠΌΠ΅Π΅Ρ‚ смысл, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСсколько Π±Π°ΠΉΡ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС, Ρ‡Π΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

Π—Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части запроса

Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ситуация Π³ΠΎΠ½ΠΎΠΊ ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

Π§Ρ‚ΠΎ Ρ‚Π°ΠΌ Π½Π° сСрвСрС

НапримСр nginx ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² HTTP-запроса Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΈΡ… ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ, складывая Π½Π΅ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ запрос Π² кэш. Когда ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ послСдний Π±Π°ΠΉΡ‚ β€” Π²Π΅Π±-сСрвСр Π²ΠΎΠ·ΡŒΠΌΠ΅Ρ‚ частично ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ запрос ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ Π΅Π³ΠΎ ΡƒΠΆΠ΅ нСпосрСдствСнно ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Ρ‚Π΅ΠΌ самым сокращаСтся врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ.

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΊΠ°ΠΊ с этим Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ это ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ архитСктурная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π³ΠΎΠ½ΠΎΠΊ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±ΠΎΡ€ΡŒΠ±Ρ‹ с Π°Ρ‚Π°ΠΊΠΎΠΉ:

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π² Π‘Π£Π‘Π” обращСния ΠΊ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΏΠΎΠΊΠ° Π΅Π³ΠΎ Π½Π΅ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚. Π”Ρ€ΡƒΠ³ΠΈΠ΅ стоят ΠΈ ΠΆΠ΄ΡƒΡ‚ Π² сторонкС. НСобходимо ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ, Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ лишнСго.

Π‘Π΅Ρ€ΡƒΡ‚ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡˆΡ‚ΡƒΠΊΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ etcd). Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ запись с ΠΊΠ»ΡŽΡ‡Π΅ΠΌ, Ссли Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ запись, Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΎΠ½Π° ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΈ Ρ‚ΠΎΠ³Π΄Π° запрос прСрываСтся. По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запроса запись удаляСтся.

И Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠ½Π΅ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ Π²ΠΈΠ΄Π΅ΠΎ выступлСния Ивана Работяги ΠΏΡ€ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ сСссий Π² race condition

Одна ΠΈΠ· особСнностСй сСссий ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° сама ΠΏΠΎ-сСбС ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΠ½ΠΊΡƒ. НапримСр, Π² языкС PHP послС session_start() происходит Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° сСссионного Ρ„Π°ΠΉΠ»Π°, ΠΈ Π΅Π³ΠΎ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° наступит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сцСнария (Ссли Π½Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° session_write_close ). Если Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·Π²Π°Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ сцСнарий ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСссию, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΆΠ΄Π°Ρ‚ΡŒ.

Для ΠΎΠ±Ρ…ΠΎΠ΄Π° этой особСнности ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ простой Ρ‚Ρ€ΡŽΠΊ β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎΠ΅ количСство Ρ€Π°Π·. Если Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ мноТСство сСссий для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, просто собираСм всС PHPSESSID ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ запросу свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

Π‘Π»ΠΈΠ·ΠΎΡΡ‚ΡŒ ΠΊ сСрвСру

Если сайт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ race condition хостится Π² AWS β€” возьми Ρ‚Π°Ρ‡ΠΊΡƒ Π² AWS. Если Π² DigitalOcean β€” Π±Π΅Ρ€ΠΈ Ρ‚Π°ΠΌ.

Когда Π·Π°Π΄Π°Ρ‡Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ запросы ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, нСпосрСдствСнная Π±Π»ΠΈΠ·ΠΎΡΡ‚ΡŒ ΠΊ Π²Π΅Π±-сСрвСру нСсомнСнно Π±ΡƒΠ΄Π΅Ρ‚ плюсом.

Π’Π΅Π΄ΡŒ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π°, ΠΊΠΎΠ³Π΄Π° ping ΠΊ сСрвСру 200 ΠΈ 10 мс. А Ссли ΠΏΠΎΠ²Π΅Π·Π΅Ρ‚, Π²Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ физичСском сСрвСрС, Ρ‚ΠΎΠ³Π΄Π° Π·Π°Ρ€Π΅ΠΉΡΠΈΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ πŸ™‚

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ race condition ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€ΡŽΠΊΠΈ для увСличСния вСроятности успСха. ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ нСсколько запросов (keep-alive) Π² ΠΎΠ΄Π½ΠΎΠΌ, замСдляя Π²Π΅Π±-сСрвСр. Π Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ запрос Π½Π° нСсколько частСй ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΎΠΉ. Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ расстояниС Π΄ΠΎ сСрвСра ΠΈ количСство абстракций Π΄ΠΎ сСтСвого интСрфСйса.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ этого Π°Π½Π°Π»ΠΈΠ·Π° ΠΌΡ‹ вмСстС с Michail Badin Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ инструмСнт RacePWN

Он состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ librace Π½Π° языкС C, которая Π·Π° минимальноС врСмя ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ„ΠΈΡˆΠ΅ΠΊ ΠΈΠ· ΡΡ‚Π°Ρ‚ΡŒΠΈ отправляСт мноТСство HTTP-запросов Π½Π° сСрвСр

Π£Ρ‚ΠΈΠ»ΠΈΡ‚Ρ‹ racepwn, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ json-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ€ΡƒΠ»ΠΈΡ‚ этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ

RacePWN ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Burp Suite), ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Π΅Π±-интСрфСйс для управлСния рСйсами (всС Π½ΠΈΠΊΠ°ΠΊ Ρ€ΡƒΠΊΠΈ Π½Π΅ доходят). Enjoy!

Но Π½Π° самом Π΄Π΅Π»Π΅ Π΅Ρ‰Ρ‘ Π΅ΡΡ‚ΡŒ ΠΊΡƒΠ΄Π° расти ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ HTTP/2 ΠΈ Π΅Π³ΠΎ пСрспСктивы для Π°Ρ‚Π°ΠΊΠΈ. Но Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ HTTP/2 Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ рСсурсов лишь Ρ„Ρ€ΠΎΠ½Ρ‚, ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ запросы Π² старый-Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ HTTP/1.1.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *