[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