[Concurrency] Mutex์™€ futex

๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223131650074

futex๋Š” Mutex์˜ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„ ํŒจํ„ด์ด๋‹ค.
๊ธฐ์กด์˜ ๋А๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์ธ Mutex ๊ตฌํ˜„์„ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์™”๋‹ค.

ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ Mutex ๊ตฌํ˜„์ฒด๋Š” ์ „๋ถ€ futex ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค.

์ด๊ฑด Rust์˜ ํ‘œ์ค€ Mutex




๊ธฐ์กด์˜ Mutex ๊ตฌํ˜„

futex๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์˜ Mutex ๊ตฌํ˜„์€ ํšจ์œจ์ ์ด๋ผ๊ณ  ๋งํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.

์Šค๋ ˆ๋“œ๊ฐ„ ํ†ต์‹ ์„ IPC ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ๋‚ ๋ฆฌ๊ธฐ๋„ ํ–ˆ๊ณ , lock/unlock์„ ํ• ๋•Œ๋งˆ๋‹ค syscall์„ ๋ฌด์ง€์„ฑ์œผ๋กœ ๋‚ ๋ ค๋Œ”๋‹ค. ์•„๋‹ˆ๋ฉด spinlock์ฒ˜๋Ÿผ ๋Œ€๊ธฐ ์ค‘์— CPU ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ๊ฐ‰์•„๋จน๊ธฐ๋„ ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ณผ๊ฑฐ์—๋Š” Mutex๋ฅผ ์“ฐ๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๊ทน์‹ฌํ•˜๊ฒŒ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ์š”์ฆ˜ ๊ตฌํ˜„๊ณผ ๋น„๊ตํ•˜๋ฉด ์ˆ˜์‹ญ๋ฐฐ, ํ˜น์€ ์ˆ˜๋ฐฑ๋ฐฐ๊นŒ์ง€๋„ ๋А๋ ธ๋‹ค.




๊ทธ๋ž˜์„œ futex๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

futex๋Š” ์ƒ๊ธฐํ•œ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์™”๋‹ค.

๋‹จ, ์œ ์˜ํ•  ์ ์€ ์ด๊ฒŒ os syscall๋กœ๋งŒ ์™„๊ฒฐ๋˜๋Š” ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๋ž€ ๊ฒƒ์ด๋‹ค.
OS ์ˆ˜์ค€์—์„œ๋„ futex ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๊ธด ํ•˜๋Š”๋ฐ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€์—์„œ๋„ ํ•จ๊ป˜ ๋งž์ถฐ์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ปค๋„์ŠคํŽ˜์ด์Šค์™€ ์œ ์ €์ŠคํŽ˜์ด์Šค๋ฅผ ์ ์ ˆํžˆ ์˜ค๊ฐ€๋ฉด์„œ ์ปค๋„ ํ˜ธ์ถœ์„ ์ค„์ด๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ๋ฒ•๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฌผ๋ก  ๋Œ€๋ถ€๋ถ„์˜ ์„ฑ์ˆ™ํ•œ ์–ธ์–ด๋“ค์€ ๊ธฐ๋ณธ Mutex ์ž์ฒด๊ฐ€ ๊ฑฐ๊ธฐ์— ๋งž์ถฐ์„œ ๊ตฌํ˜„์„ ํ•ด๋’€๋‹ค. ๋‚ด๊ฐ€ ํ™•์ธํ•œ ๋ฐ”๋กœ Java, Rust, Go๋Š” ํ‘œ์ค€ Mutex๊ฐ€ ํ™•์‹คํ•˜๊ฒŒ futex ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ณ„์ธต ๋ถ„๋ฆฌ: user + kernel
์•„๋ฌดํŠผ futex๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ํ•ต์‹ฌ ์›๋ฆฌ๋Š” lock๊ณผ wait/wake ๊ตฌ์กฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
lock์„ ์œ ์ €์ŠคํŽ˜์ด์Šค์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , wait/wake๋ฅผ OS ์ปค๋„ ์ˆ˜์ค€์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
user ์ˆ˜์ค€ lock์„ ์„ ์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€, ์–ด์ฉ” ์ˆ˜ ์—†์„ ๋•Œ๋งŒ os ์ˆ˜์ค€ wait/wake๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

1. user ์ˆ˜์ค€ lock
futex์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ค€ ๊ตฌํ˜„์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‘๊ณ  compare and swap ๊ฐ™์€ atomic operation์„ ๋Œ๋ ค์„œ ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ์œ ์ €์ŠคํŽ˜์ด์Šค Lock์„ ๊ตฌํ˜„ํ•œ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด lock/unlock์„ ํ• ๋•Œ ๊ฒฝ์Ÿ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ปค๋„ ํ˜ธ์ถœ ์—†์ด ์œ ์ €์ŠคํŽ˜์ด์Šค Lock๋งŒ์œผ๋กœ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹น์—ฐํžˆ ์ปค๋„ ํ˜ธ์ถœ์ด ์—†์œผ๋‹ˆ ๊ฒฝ์Ÿ์ด ์ ์€ ๊ฒฝ์šฐ์—๋Š” ํ›จ์”ฌ ๋นจ๋ผ์ง„๋‹ค.
ํ•˜์ง€๋งŒ ๊ฒฝ์Ÿ์ด ์‹ฌํ•˜๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์€ ์Šคํ•€๋ฝ์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณผ๋‹คํ•˜๊ฒŒ ์†Œ๋ชจํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๊ฒฐ๊ตญ 2๋ฒˆ์˜ ์ ‘๊ทผ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

2. ์ปค๋„ ์ˆ˜์ค€ wait/wake - ๋Œ€๊ธฐ์—ด ๊ธฐ๋ฐ˜์˜ ์Šค๋ ˆ๋“œ ์ ˆ์ „
futex์—์„œ ์ค‘์š”ํ•œ ์  ์ค‘ ํ•˜๋‚˜๊ฐ€ "๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ"์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ์ด๋‹ค. ๋‹น์—ฐํžˆ lock์„ ์–ป์ง€ ๋ชปํ•ด์„œ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ์—๋Š”, ๊ตณ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
์ด ๊ฒฝ์šฐ์—๋Š” ์Šค๋ ˆ๋“œ ์ž์ฒด๋ฅผ "๋Œ€๊ธฐ์—ด"์— ๋„ฃ์–ด๋‘๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ unlock์„ ํ•˜๋Š” ์‹œ์ ์— ์ผ์–ด๋‚˜์„œ(wake) ํ™œ์„ฑํ™”๊ฐ€ ๋˜๊ฒŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ futex syscall์ด ์ง€์›ํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
์ด๊ฑด ๊ฒฝ์Ÿ์ด ์ ์€ ๊ฒฝ์šฐ์—๋Š” ๋น„ํšจ์œจ์ ์ด๊ณ , ๊ฒฝ์Ÿ์ด ์‹ฌํ•ด์„œ lock์„ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ํšจ์œจ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋ฐ˜์ ์œผ๋กœ user ์ˆ˜์ค€ Lock์—์„œ ์‹ฌํ•œ ๊ฒฝ์Ÿ์ด ํƒ์ง€๋œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค.

๋‹ค์Œ์€ Rust ํ‘œ์ค€ ๋ฎคํ…์Šค์˜ lock ๊ตฌํ˜„๋ก€๋‹ค.

atomic op์œผ๋กœ ๋จผ์ € ์ž ๊ฒจ์žˆ๋Š”์ง€ ์ตœ๋Œ€ 2๋ฒˆ๊นŒ์ง€ ์ฒดํฌํ•˜๊ณ , ๊ทธ๋ž˜๋„ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด "futex_wait"์œผ๋กœ ์ปค๋„ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ futex๋Š” ๋‹จ๋…์œผ๋กœ ๊ธฐ๊น”๋‚˜๊ฒŒ ์ตœ์ ํ™”๋ฅผ ์ž˜ ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋ผ๊ณ  ํ•  ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๊ฒฝ์Ÿ์ด ์‹ฌํ•œ ๊ฒฝ์šฐ์™€ ๊ฒฝ์Ÿ์ด ์‹ฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ข…ํ•ฉํ•ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” 2๋‹จ๊ณ„ ๋ฐฉ๋ฒ•๋ก ์ธ ์…ˆ์ด๋‹ค.




futex์˜ ์—ญ์‚ฌ

2002๋…„์ฏค์— ๋ฆฌ๋ˆ…์Šค ์ปค๋„์— futex๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฒ˜์Œ ๋“ค์–ด๊ฐ”๋‹ค. ์ด๋•Œ๋ถ€ํ„ฐ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

Windows์—์„œ๋Š” WaitOnAddress๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ 2012๋…„๋ถ€ํ„ฐ ์ง€์›๋๋‹ค.
MacOS๋Š” 2016๋…„๋ถ€ํ„ฐ ์ง€์›ํ•œ๋‹ค.

์‚ฌ์‹ค ์˜๋ฏธ์ ์œผ๋กœ ๊ฐ€์žฅ ์ ํ™•ํ•œ ์ด๋ฆ„์€ futex๊ฐ€ ์•„๋‹ˆ๋ผ windows๊ฐ€ ์ž‘๋ช…ํ•œ WaitOnAddress๋‹ค.
futex syscall ์ž์ฒด๊ฐ€ ๋‹จ๋…์œผ๋กœ ํ•˜๋Š” ์—ญํ• ์€ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌํ•˜๊ณ  ๊นจ์›Œ์ฃผ๋Š”๊ฒŒ ์ „๋ถ€์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค...



์ฐธ์กฐ
https://h4x0r.org/futex/
https://stackoverflow.com/questions/45764378/how-are-threads-processes-parked-and-woken-in-linux-prior-to-futex
http://www.wowotech.net/kernel_synchronization/futex.html