๐Ÿ’ฟ KAIST:PINTOS | Concept | Semaphore

์ด์ˆœ๊ฐ„ยท2025๋…„ 5์›” 13์ผ

KAIST:PINTOS

๋ชฉ๋ก ๋ณด๊ธฐ
5/23

์•ž์„  ๊ธ€์—์„œ ๋ฎคํ…์Šค(Mutex)๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด์•˜๋‹ค.
์ด๋ฒˆ์—๋Š” ๋ฎคํ…์Šค๋ฅผ ์ผ๋ฐ˜ํ™”ํ•œ ๊ฐœ๋…์ธ ์„ธ๋งˆํฌ์–ด(Semaphore)๋ฅผ ์•Œ์•„๋ณด์ž.
์„ธ๋งˆํฌ์–ด๋Š” ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์›์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋ฎคํ…์Šค๋ณด๋‹ค ํ™•์žฅ๋œ ๊ตฌ์กฐ๋‹ค.


๐Ÿšฆ ์„ธ๋งˆํฌ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์„ธ๋งˆํฌ์–ด๋Š” ์šด์˜์ฒด์ œ์—์„œ ์ž์›์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ์ •์ˆ˜ ๋ณ€์ˆ˜๋กœ,
์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šค๋ ˆ๋“œ์˜ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ์žฅ์น˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์ฐจ์žฅ์— 3๊ฐœ์˜ ๋นˆ์ž๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ์„ธ๋งˆํฌ์–ด ๊ฐ’์„ 3์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
์ฐจ๊ฐ€ ํ•˜๋‚˜ ๋“ค์–ด์˜ค๋ฉด 2, ๋˜ ํ•˜๋‚˜ ๋“ค์–ด์˜ค๋ฉด 1... ๋ชจ๋‘ ์ฐจ๋ฉด 0์ด ๋˜๋ฉฐ,
๊ทธ๋‹ค์Œ ๋“ค์–ด์˜ค๋ ค๋Š” ์ฐจ๋Š” ์ž๋ฆฌ๊ฐ€ ๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋œ๋‹ค.


๐Ÿง  ์„ธ๋งˆํฌ์–ด์˜ ํ•ต์‹ฌ ์—ฐ์‚ฐ

์„ธ๋งˆํฌ์–ด๋Š” ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

์—ฐ์‚ฐ์„ค๋ช…์‰ฌ์šด ๋ง๋กœ
sema_down()์ž์›์„ ์–ป๊ธฐ ์œ„ํ•œ ์š”์ฒญ. ๊ฐ’์ด 0์ด๋ฉด ๊ธฐ๋‹ค๋ฆฐ๋‹ค."๋‚˜ ๋“ค์–ด๊ฐ€๋„ ๋ ๊นŒ?"
sema_up()์ž์›์„ ๋ฐ˜๋‚ฉํ•˜๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šด๋‹ค."๋‚˜ ๋‹ค ์ผ์–ด, ๋‹ค์Œ ์‚ฌ๋žŒ ์™€!"

์ด ๋‘ ์—ฐ์‚ฐ์€ ๋ฐ˜๋“œ์‹œ ์›์ž์ ์œผ๋กœ(atomic) ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๊ณ  ๋‹จ์ผ ๋™์ž‘์œผ๋กœ ์ฒ˜๋ฆฌ๋ผ์•ผ ํ•œ๋‹ค.


๐Ÿงƒ ์‰ฌ์šด ๋น„์œ : ์ปต ์ œ๊ณต๊ธฐ

  • ์ข…์ด์ปต์ด 3๊ฐœ ๊ฝ‚ํ˜€ ์žˆ๋Š” ์ž๋™ ์ปต ์ œ๊ณต๊ธฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.
  • ์‚ฌ๋žŒ์ด ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๊ฐ„๋‹ค โ†’ ์ปต์ด ํ•˜๋‚˜์”ฉ ์ค„์–ด๋“ ๋‹ค.
  • ์ปต์ด 0๊ฐœ๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ณ , ๋ˆ„๊ตฐ๊ฐ€ ์ปต์„ ๋‹ค์‹œ ์ฑ„์šฐ๋ฉด โ†’ ๋‹ค์Œ ์‚ฌ๋žŒ์ด ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋กœ ์„ธ๋งˆํฌ์–ด๋‹ค.


๐Ÿงต ์„ธ๋งˆํฌ์–ด๋Š” ์–ด๋–ค ์ƒํ™ฉ์— ์“ฐ์ด๋‚˜?

์ƒํ™ฉ์„ค๋ช…
์ž์› ์ˆ˜ ์ œํ•œํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์›์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ (์˜ˆ: ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ์†Œ์ผ“ ์ˆ˜, ํ”„๋ฆฐํ„ฐ ์ˆ˜ ๋“ฑ)
์Šค๋ ˆ๋“œ ๊ฐ„ ์ˆœ์„œ ์ œ์–ดํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
๋ฝ ๊ตฌํ˜„์„ธ๋งˆํฌ์–ด(1)์„ ์ด์šฉํ•˜๋ฉด ๋ฎคํ…์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ PintOS์˜ ๋ฝ์€ ์„ธ๋งˆํฌ์–ด๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

๐Ÿ“‚ PintOS์—์„œ ์„ธ๋งˆํฌ์–ด๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋‚˜?

PintOS์—์„œ๋Š” struct semaphore ๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์„ธ๋งˆํฌ์–ด๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค.

struct semaphore {
  unsigned value;               // ํ˜„์žฌ ์ž์› ๊ฐœ์ˆ˜
  struct list waiters;          // ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ
};

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๋™์ž‘ํ•œ๋‹ค:

void sema_down(struct semaphore *sema); // ์ž์› ์š”์ฒญ
void sema_up(struct semaphore *sema);   // ์ž์› ๋ฐ˜ํ™˜

๐Ÿงฌ ๋ฝ๊ณผ ์„ธ๋งˆํฌ์–ด์˜ ๊ด€๊ณ„

  • ๋ฝ(lock) ์€ ์„ธ๋งˆํฌ์–ด์˜ ํŠน๋ณ„ํ•œ ํ˜•ํƒœ๋‹ค.
  • PintOS์˜ struct lock์€ ๋‚ด๋ถ€์ ์œผ๋กœ struct semaphore๋ฅผ ํฌํ•จํ•œ๋‹ค.
  • ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ๋ฝ์„ ์“ด๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” sema_down()๊ณผ sema_up()์ด ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿงช ์„ธ๋งˆํฌ์–ด๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

PintOS์˜ priority-* ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์„ธ๋งˆํฌ์–ด๊ฐ€ ๋‹จ์ˆœ ์ž์› ์ œํ•œ์šฉ์ด ์•„๋‹Œ, ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„ ์Šค์ผ€์ค„๋ง์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

  • sema->waiters ๋ฆฌ์ŠคํŠธ๋Š” priority ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • sema_up() ์‹œ์—๋„ ๊ฐ€์žฅ ๋†’์€ priority์˜ ์Šค๋ ˆ๋“œ๋ถ€ํ„ฐ ๊นจ์›Œ์•ผ ํ•œ๋‹ค.

์ด๊ฑธ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด priority-sema, priority-donate-sema, priority-condvar ๊ฐ™์€ ํ…Œ์ŠคํŠธ์—์„œ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.


โœ… ์ •๋ฆฌ

  • ์„ธ๋งˆํฌ์–ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์›์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ ๊ฐ„ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์กฐ์œจํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋‹ค.
  • sema_down()์œผ๋กœ ์ž์›์„ ์š”์ฒญํ•˜๊ณ , sema_up()์œผ๋กœ ์ž์›์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • PintOS์—์„œ๋Š” ๋ฝ๊ณผ ์กฐ๊ฑด๋ณ€์ˆ˜๋„ ์„ธ๋งˆํฌ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ๋‹จ์ˆœํ•œ ๋ฎคํ…์Šค๋ฅผ ๋„˜์–ด์„œ, ๋ฉ€ํ‹ฐ์ž์› ๊ด€๋ฆฌ์™€ ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๊ฐœ๋…์ด๋‹ค.
profile
์„œํˆด์ง€์–ธ์ • ๋Š˜ ํ–‰๋™์ด ๋จผ์ €์ด๊ธฐ๋ฅผ

0๊ฐœ์˜ ๋Œ“๊ธ€