MegaByte & Linux
ΠΡΠΈΠ²Π΅Ρ, ΠΠ΅Π³Π°ΠΠ°ΠΉΡ. Π― ΡΡΡ ΠΏΠΎΠΊΠΎΠΏΠ°Π»ΡΡ Ρ Π½ΠΎΠ²ΠΎΠΉ Π»Π΅Π³ΠΊΠΎΠ²Π΅ΡΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠ΄ΡΠ°, ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ΅Π±Ρ Π΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ΄Π΅ΠΈ ΠΈΠ»ΠΈ ΡΠ²Π΅ΠΆΠΈΠ΅ ΠΌΡΡΠ»ΠΈ. Π§ΡΠΎ Π΄ΡΠΌΠ°Π΅ΡΡ, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΡΠΌ?
ΠΠΎΠ½Π΅ΡΠ½ΠΎ. Π‘ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π’Π°ΠΊ ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ β Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π³ΠΎΠ½ΠΎΠΊ Π·Π° ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ. ΠΠ΅ΡΠΆΠΈ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ, ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ API Π΄Π»Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠ΄ΡΠ° ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΠΈΡ
Π·Π°Π΄Π°Ρ. Π Π΄Π»Ρ ΡΡΡΡΡΠΈΠΊΠΎΠ² ΠΏΠΎΠ»Π°Π³Π°ΠΉΡΡ Π½Π° Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. Π’Π°ΠΊ ΠΊΠΎΠ΄ ΠΎΡΡΠ°ΡΡΡΡ ΡΠΈΡΡΡΠΌ, ΠΈ ΡΡ ΠΈΠ·Π±Π΅ΠΆΠΈΡΡ ΠΎΠ±ΡΡΠ½ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°ΠΌΠΈ.
ΠΠ²ΡΡΠΈΡ Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎ β ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ ΡΠ½ΠΈΠΆΠ°ΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΡΡΡ. Π’ΠΎΠ»ΡΠΊΠΎ Π±ΡΠ΄Ρ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π΅Π½ ΠΊ ΠΈΠ½Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ², Π΅ΡΠ»ΠΈ Π·Π°Π΄Π°ΡΠ° ΠΈΠ· Π½ΠΈΠΆΠ½Π΅Π³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠΈΠΉ ΡΠ΅ΡΡΡΡ; ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, Π΄ΠΎΠ±Π°Π²Ρ ΠΏΡΠΎΡΡΡΡ ΡΡ
Π΅ΠΌΡ ΡΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ? Π, Π΄Π°, ΡΠΈΡΡΡΠΉ API β ΡΡΠΎ ΠΎΡΠ»ΠΈΡΠ½ΠΎ, Π½ΠΎ ΡΠ±Π΅Π΄ΠΈΡΡ, ΡΡΠΎ Π³ΡΠ°Π½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Ρ
ΠΎΡΠΎΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Ρ, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΠΈΠ΅ ΡΠ²ΠΎΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π»ΠΈ ΡΠ΄ΡΠΎ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°. ΠΠ°ΠΊΠΈΠ΅ Ρ ΡΠ΅Π±Ρ ΠΌΡΡΠ»ΠΈ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ?
ΠΠΎΡ ΡΡΠΎ Ρ Π΄ΡΠΌΠ°Ρ: ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄ΡΡ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ Π±ΡΡΠ΅Ρ Ρ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ Π½Π° Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ. Π Π°Π·ΠΌΠ΅Ρ Π»ΡΡΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΡΠ°ΡΠ½ΡΠΌ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Π΄Π²ΠΎΠΉΠΊΠΈ, Π·Π°ΠΌΠ°ΡΠΊΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ, Π° Π² ΡΡΠ΅ΠΉΠΊΠ°Ρ
Π±ΡΡΠ΅ΡΠ° Ρ
ΡΠ°Π½ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. ΠΡΠΎΠ΄ΡΡΠ΅Ρ ΠΏΡΠΎΡΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π°ΡΠ°Π»ΠΎ, Π° ΠΊΠΎΠ½ΡΡΡΠΌΠ΅Ρ ΡΠΈΡΠ°Π΅Ρ ΠΈΠ· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠ½Π΅Ρ ΠΈ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎ Π΅Π³ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ. ΠΠΈΠΊΠ°ΠΊΠΈΡ
ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ², Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΡΠΈΠΊΠ»ΠΎΠ² CAS, ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΡΠ»ΠΈ Π½ΡΠΆΠ½Π° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ, ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈ Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Michael-Scott β ΡΠ°ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉ compare-and-swap Π½Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΊΠΎΠ½Π΅Ρ, Π½ΠΎ ΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡ Π½Π°ΠΊΠ»Π°Π΄Π½ΡΠ΅ ΡΠ°ΡΡ
ΠΎΠ΄Ρ. ΠΠ»Π°Π²Π½ΠΎΠ΅ β Π΄Π΅ΡΠΆΠ°ΡΡ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ
ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠΉ, ΡΡΠΎΠ±Ρ ΠΎΠ½Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π»Π°ΡΡ Π² ΡΡΡΠΎΠΊΠ°Ρ
ΠΊΡΡΠ°, ΠΈ ΠΈΠ·Π±Π΅Π³Π°ΡΡ Π»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ.
Nice, the ringβbuffer trick keeps things cacheβfriendly and simple. Just doubleβcheck that the relaxed stores donβt let the compiler reorder writes in a way that breaks the consumerβs view. Maybe add a memory barrier after the head bump to guarantee the write is visible. For the MichaelβScott part, a cheap spinβlock on the tail pointer could be a middle ground if the contention isnβt huge. Good planβlet me know how the prototype shapes up.