[Rust] hint: spin_loop

κ΄€λ ¨ 포슀트
https://m.blog.naver.com/sssang97/223236643886

spin_loopλŠ” μŠ€ν•€λ½κ³Ό κ΄€λ ¨λœ μ΅œμ ν™” μ „μš© ν•¨μˆ˜λ‹€.

이것 μžμ²΄λ‘œλŠ” νŠΉμˆ˜ν•œ κΈ°λŠ₯을 ν•˜μ§€λŠ” μ•ŠμœΌλ‚˜, λ¦¬μ†ŒμŠ€λ₯Ό μ ˆμ•½ν•΄μ„œ 전체적인 μ„±λŠ₯κ³Ό λ¦¬μ†ŒμŠ€ μ†Œλͺ¨λ₯Ό μ΅œμ ν™”ν•  수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 λ‹¨μˆœν•œ μŠ€ν•€λ½μ„ κ΅¬ν˜„ν•˜λ‹€κ³  κ°€μ •ν•˜κ² λ‹€.

사싀 μŠ€ν•€λ½μ˜ μž₯점은 λ‹¨μˆœν•¨μ— μžˆμ§€, 일반적인 μ„±λŠ₯이 썩 쒋은 νŽΈμ€ λͺ»λœλ‹€.
μ—¬κΈ°μ„œλŠ” lock을 κ±Έλ•Œ λ¬΄ν•œλ£¨ν”„λ₯Ό λŒλ„λ‘ ν•΄λ’€λ‹€.

μ €κ²Œ μ΅œμ„ μΌκΉŒ? κ·Έλ ‡μ§€λŠ” μ•Šμ„ 것 κ°™λ‹€.
μ € 루프 내에 힌트 ν•¨μˆ˜λ₯Ό λ„£λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ μ΅œμ†Œν•œμ˜ μ΅œμ ν™”λ₯Ό μ‹œλ„ν•΄λ³Ό μˆ˜λŠ” μžˆλ‹€.

이러면 ν”„λ‘œμ„Έμ„œμ— λͺ…령을 μ€˜μ„œ ν•˜μ΄νΌμŠ€λ ˆλ“œλ₯Ό μ „ν™˜ν•˜κ±°λ‚˜, μ „λ ₯을 μ ˆμ•½ν•˜λŠ” μ‹μ˜ 처리λ₯Ό ν•  수 μžˆλ‹€κ³  ν•œλ‹€.
근데 직접 λŒλ €λ³΄λ‹ˆ 생각보닀 cpu λ¦¬μ†ŒμŠ€κ°€ 크게 μ€„μ–΄λ“€κ±°λ‚˜ ν•˜μ§€λŠ” μ•Šμ•˜λ‹€. 이것도 μ•½κ°„ μš°μ„ κΆŒμ„ λ‹€λ₯Έ μž‘μ—…μ— λ„˜κΈ°λŠ” μ‹μœΌλ‘œ λ™μž‘ν•΄ 그럴 μˆ˜λ„ μžˆλ‹€.

이건 λͺ¨λ“  ν”„λ‘œμ„Έμ„œμ—μ„œ λ™μž‘ν•˜μ§€λŠ” μ•Šκ³ , ν”„λ‘œμ„Έμ„œλ§ˆλ‹€ λ™μž‘λ°©μ‹κ³Ό νš¨κ³Όλ„ μ’€ λ‹€λ₯΄λ‹€.

κ·Έλž˜μ„œ 까보면 μ΄λŸ°μ‹μœΌλ‘œ λ˜μ–΄μžˆλ‹€.
_mm_pause 같은 λͺ…령을 날리도둝 λ˜μ–΄μžˆλŠ”λ°, μ°Ύμ•„λ³΄λ‹ˆκΉŒ μ•½κ°„μ˜ λ©”λͺ¨λ¦¬/μΊμ‹œ μ΅œμ ν™”κ°€ λ˜κ±°λ‚˜ 상황에 λ”°λΌμ„œ ν”„λ‘œμ„Έμ„œλ₯Ό 잠깐 μΌμ‹œμ€‘μ§€ν•  μˆ˜λ„ μžˆλ‹€κ³  ν•œλ‹€.

근데 이런걸 쓰더라도 spinlock을 μ˜€λž«λ™μ•ˆ λŒ€κΈ°μ‹œν‚€λŠ” 것은 μ—¬μ „νžˆ 느리고 효율이 λ‚˜μ˜λ‹€.
이건 μ•½κ°„μ˜ κ°œμ„ μ„ 쀄 뿐이닀.




vs thread::yield_now()

λΉ„μŠ·ν•œ μš©λ„λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” ν•¨μˆ˜λ‘œλŠ” thread::yield_now()κ°€ μžˆλ‹€.

일단 μ‚¬μš©λ²•κ³Ό λͺ©μ  μžμ²΄λŠ” 거의 λΉ„μŠ·ν•˜λ‹€. 이걸 μ‹€ν–‰ν•˜λ©΄ os μŠ€μΌ€μ€„λŸ¬μ— μš”μ²­μ„ ν•΄μ„œ λ‹€λ₯Έ μž‘μ—…μ—κ²Œ CPU μ‚¬μš© μš°μ„ κΆŒμ„ λ„˜κ²¨μ€„ 수 μžˆλ‹€. λ‹€λ₯Έ μž‘μ—…μ΄ μ—†λ‹€λ©΄ μ•„λ§ˆ κ·Έλƒ₯ λ‹€μ‹œ 싀행될 것이닀.

spin_loopμ™€μ˜ 차이점은, 이건 OS μŠ€μΌ€μ€„λŸ¬μ™€ 직접 μƒν˜Έμž‘μš©ν•˜λŠ” λͺ…λ Ήμ΄λž€ 것이닀.
이에 λŒ€ν•œ μ²˜λ¦¬λŠ” ν”„λ‘œμ„Έμ„œκ°€ μ•„λ‹Œ OS μž¬λŸ‰μ— λ‹¬λ €μžˆλ‹€.

spin_loop에 λΉ„ν•΄μ„œ λ¦¬μ†ŒμŠ€λ₯Ό 쒀더 κ³Όκ°ν•˜κ²Œ λ†“μ„ν…Œλ‹ˆ μ΅œμ ν™” νš¨κ³ΌλŠ” 더 ν¬κ² μ§€λ§Œ, λ‹€μ‹œ λ¦¬μ†ŒμŠ€λ₯Ό λŒλ €λ°›λŠ” μ†λ„λŠ” 그보닀 λͺ»ν•  것이닀. 놓은 μš°μ„ κΆŒμ„ λ‹€μ‹œ λ°›μœΌλ €λ©΄ λ‹€μ‹œ OS에 μ˜ν•΄ 할당을 λ°›μ•„μ•Όν•  ν…Œλ‹ˆ 말이닀.

λͺ…ν™•ν•œ μš°μ—΄μ€ μ—†μœΌλ©°, 상황에 따라 μ„ νƒν•˜λ©΄ λ˜κ² λ‹€.



μ°Έμ‘°
https://doc.rust-lang.org/std/hint/fn.spin_loop.html
https://www.felixcloutier.com/x86/pause.html
https://stackoverflow.com/questions/4725676/how-does-x86-pause-instruction-work-in-spinlock-and-can-it-be-used-in-other-sc
https://github.com/rust-lang/rust/issues/55418