ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΡΠ°Π±ΠΎΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΡΡ Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π²ΡΠ΅Ρ Π±ΠΈΡΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΈΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΈ ΠΈΠΌΠ΅Π½Π° ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ Π΄Π²ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠΈΠ²Π°Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ ΡΠΎΡΠΌΠ° ΡΡΠ½ΠΊΡΠΈΠΈ test_bit() Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΈΠΌΡ __test_bit(). ΠΡΠ»ΠΈ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ»ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ ΡΠΆΠ΅ Π·Π°ΡΠΈΡΠ΅Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅.
ΠΡΠΊΡΠ΄Π° Π±Π΅ΡΡΡΡΡ Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅, ΠΊΠ°ΠΊ Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ Π±ΠΈΡΠΎΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π°. ΠΠ°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ, ΠΈ Π·Π΄Π΅ΡΡ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π° ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π²ΡΠ΅Π³Π΄Π° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΡΡΠΎ Π΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ? ΠΠ°, ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²Π°ΠΆΠ½ΡΠΌ, Π½ΠΎ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ-ΡΠΎ ΡΡΡ ΠΏΡΠΈ ΡΠ΅ΠΌ? Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², Π΅ΡΠ»ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈΡΠ° ΡΠ°Π²Π½ΠΎ ΡΠΎΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΡΠΎ Π²ΡΠ΅ Ρ ΠΎΡΠΎΡΠΎ, Π½Π΅ ΡΠ°ΠΊ Π»ΠΈ?
ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΡΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ? ΠΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, Π½Π΅ ΠΏΡΠ΅ΡΡΠ²Π°ΡΡΡ, ΠΈΠ»ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΠΎΠΎΠ±ΡΠ΅. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄Π²Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΎΠ±Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ. ΠΠΎΠ½ΡΡΠ½ΠΎ, ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ (ΠΈ ΡΠ°Π²Π½ΡΠΌ ΡΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠ°ΠΊ ΡΠ°ΡΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΠΏΠ°ΡΠ°Π³ΡΠ°ΡΠ°). ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠΎΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΡΠΎ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠΎΠΌΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ.
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π²Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΡΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΈΡΡΠΊΠ° Π±ΠΈΡΠ°. ΠΠ΅Π· Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΠΈ ΡΡΠΎΡ Π±ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΈΡΠ΅Π½, Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΎΡΠΈΡΡΠΊΠΈ ΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ. ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΡΠΈΡΡΠΊΠΈ Π±ΠΈΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈ Π±ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΈΡΠ΅Π½, ΠΊΠ°ΠΊ ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π»ΠΎΡΡ. Π ΡΠ»ΡΡΠ°Π΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π±ΠΈΡΠ° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅. ΠΡΠ΄Π΅Ρ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π² ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ, ΡΡΠΎ Π±ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½, ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΎΡΠΈΡΡΠΊΠΈ ΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈΡΠ° ΡΡΠ°Π½Π΅Ρ ΡΠ°Π²Π½ΡΠΌ Π½ΡΠ»Ρ.
ΠΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΊΡΠΈΡΠΈΡΠ΅Π½ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
Π―Π΄ΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π½Π°ΠΉΡΠΈ Π½ΠΎΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ (ΠΈΠ»ΠΈ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ) Π±ΠΈΡΠ°, Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π°Π΄ΡΠ΅ΡΠ° addr:
int find_first_bit(unsigned long *addr, unsigned int size);
int find_first_zero_bit(unsigned long *addr, unsigned int size);
ΠΠ±Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²ΡΠΎΡΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±ΠΈΡΠΎΠ², ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΠΎΠΈΡΠΊ. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½ΠΎΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. ΠΡΠ»ΠΈ ΠΊΠΎΠ΄ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΈΡΠΊ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΡΠ»ΠΎΠ²Π΅, ΡΠΎ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ __ffs() ΠΈ __ffz(), ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΠΎΠΈΡΠΊ.
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Ρ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ, ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΎΠ±ΡΡΠ½ΠΎ Π½Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π²ΡΠ±ΠΎΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ Π±ΠΈΡΠΎΠ²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ»ΠΈ ΠΎΡΠΈΡΡΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π±ΠΈΡ. ΠΠΎΠΏΡΠΎΡ Π»ΠΈΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΠΈ ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ β Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅. ΠΡΠ»ΠΈ ΠΊΠΎΠ΄ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌ ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΡΡΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±ΡΡΡΡΠ΅Π΅ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌ.
Π‘ΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ
ΠΡΠ»ΠΎ Π±Ρ ΠΎΡΠ΅Π½Ρ Ρ ΠΎΡΠΎΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ°ΡΡΠΊΠΈ Π±ΡΠ»ΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΏΡΠΎΡΡΡΠ΅, ΠΊΠ°ΠΊ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΆΠΈΠ·Π½ΠΈ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎ. Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ°ΡΡΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ, Π·Π°ΡΠ΅ΠΌ ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π°Π½Π°Π»ΠΈΠ· ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π΄ΡΡΠ³ΡΡ ΡΡΡΡΠΊΡΡΡΡ. ΠΠ΅ΡΡ ΡΡΠΎΡ Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ. ΠΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΈΡΠ°ΡΡ Π½ΠΈ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΡΠ΅ ΡΡΠΈΡ ΡΡΡΡΠΊΡΡΡ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Ρ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΏΡΠΎΡΡΡΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π·Π°ΡΠΈΡΡ, ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π·Π°ΡΠΈΡΡ β Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (lock).
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠ΄ΡΠ΅ Linux β ΡΡΠΎ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ (spin lock). Π‘ΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° β ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° (contended), Ρ.Π΅. ΡΠΆΠ΅ Π·Π°Ρ Π²Π°ΡΠ΅Π½Π°, ΠΏΠΎΡΠΎΠΊ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ (busy loop) β "Π²ΡΠ°ΡΠ°ΡΡΡΡ" (spin), ΠΎΠΆΠΈΠ΄Π°Ρ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡΠ»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π½Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ° ΠΏΡΠΈ Π·Π°Ρ Π²Π°ΡΠ΅, ΡΠΎ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π¦ΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΡΡΠ°ΡΡΠΊΠ΅. Π‘Π»Π΅Π΄ΡΠ΅Ρ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠ΄Π½Π° ΠΈ ΡΠ° ΠΆΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΊΠΎΠ΄Π°, ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π° Π·Π°ΡΠΈΡΠ° ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΡΡΡΠΊΡΡΡΠ΅ Π΄Π°Π½Π½ΡΡ .
Π’ΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ°, Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π·Π°ΠΌΠΊΠ½ΡΡΡΠΉ ΡΠΈΠΊΠ» (ΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΡΠ°ΡΠΈΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ), ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΡΠΌ. ΠΠ΅ΡΠ°Π·ΡΠΌΠ½ΠΎ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎ ΡΠ²ΠΎΠ΅ΠΉ ΡΡΡΠΈ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° β ΡΡΠΎ Π±ΡΡΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡΡΡ Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ°, ΠΏΠΎΡΠΎΠΊ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Π½ΠΎΡΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ Π·Π°ΡΡΠ°ΡΡ, ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ β ΡΡΠΎ Π΄Π²Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. ΠΠ½Π°ΡΠ°Π»Π΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π° Π·Π°ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ. ΠΠΎΡΡΠΎΠΌΡ ΡΠ°Π·ΡΠΌΠ½ΡΠΌ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ΠΌΡ ΡΠ΄Π΅ΡΠΆΠ°Π½ΠΈΡ ΡΡΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠ΅Π½ΡΡΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π²ΡΡ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π° Π»ΡΠ΄Π΅ΠΉ Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ Π·Π°Π½ΡΡΠΈΡ, ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, ΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠ°ΡΠ°ΡΡΡΡ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΊΠΎΡΠΎΡΠΊΠΎΠ³ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ[47]. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π±ΡΠ΄ΡΡ ΠΎΠΏΠΈΡΠ°Π½Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ (semaphore) β ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠ΅ Π½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ, Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ»Π°ΡΡ Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, Π½Π°Ρ ΠΎΠ΄ΡΡΠ°ΡΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ°.
Π‘ΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ²Π»ΡΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΡΠΌΠΈ ΠΎΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π½Π° ΡΠ·ΡΠΊΠ΅ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ°. ΠΠ°Π²ΠΈΡΠΈΠΌΡΠΉ ΠΎΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ ΠΊΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <asm/spinlock.h>. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ <linux/spinlock.h>. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
spin_lock(&mr_lock);
/* ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ°ΡΡΠΎΠΊ ... */
spin_unlock(&mr_lock);
Π Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΏΠΎΠ·Π²ΠΎΠ»Π΅Π½ΠΎ Π²ΠΎΠΉΡΠΈ Π² ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ°ΡΡΠΎΠΊ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΡΠΈΡΡ ΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΠΈ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅. ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΊΠΎΠ΄, ΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈΠ³ΡΠ°ΡΡ ΡΠΎΠ»Ρ ΠΌΠ°ΡΠΊΠ΅ΡΠΎΠ², ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠ°ΡΡ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ°ΡΡ Π²ΡΡΠ΅ΡΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° (ΠΏΡΠ΅Π΅ΠΌΠΏΡΠΈΠ²Π½ΠΎΡΡΡ) Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΄ΡΠ°. ΠΡΠ»ΠΈ ΠΏΡΠ΅Π΅ΠΌΠΏΡΠΈΠ²Π½ΠΎΡΡΡ ΡΠ΄ΡΠ° ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π°, ΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΡΡΡΡ.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½Ρ!Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ Π² Π΄ΡΡΠ³ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΡΠΏΠΈΠ½-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Linux Π½Π΅ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½Ρ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊ ΠΏΡΡΠ°Π΅ΡΡΡ Π·Π°Ρ Π²Π°ΡΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΎΠ½ ΡΠΆΠ΅ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ, ΡΠΎ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π½Π°ΡΠ½Π΅Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ, ΠΎΠΆΠΈΠ΄Π°Ρ, ΠΏΠΎΠΊΠ° ΠΎΠ½ ΡΠ°ΠΌ Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π½Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ»Π°ΡΡ Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π΅Π΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡΡ, ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΡΠΏΠΈΠΊΠΎΠ²Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ (ΡΠ°ΠΌΠΎΠ±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°). ΠΡΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ!