[pintOS] Project1-3. Priority Scheduling and Synchronization

์˜ˆ๋‹ˆยท2021๋…„ 2์›” 15์ผ
0

pintOSํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
3/6

๐Ÿ“… ๊ธฐ๊ฐ„ : 2021.02.06(ํ† ) ~ 2021.02.08(์›”)

1. ๊ณผ์ œ ๋ชฉํ‘œ

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ lock, semaphore, condition variable ์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆด ๊ฒฝ์šฐ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ thread๊ฐ€ CPU๋ฅผ ์ ์œ  ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์ž!
ํ˜„์žฌ pintos๋Š” semaphore๋ฅผ ๋Œ€๊ธฐ ํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋“ค์˜ list์ธ waiters๊ฐ€ FIFO๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. ์ด๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์ž.

ํ˜„์žฌ ์ƒํ™ฉ

๋ชฉํ‘œ


2. ๋ฐฐ๊ฒฝ์ง€์‹

๐Ÿ’ก ์„ธ๋งˆํฌ์–ด, ๋ฝ

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์„ ๊ณต์œ ํ•  ๋•Œ, ์„œ๋กœ ๊ฒน์น˜๋Š” ์ผ์ด ์—†์–ด์•ผํ•œ๋‹ค. ์ด๋Ÿฐ ์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์„ธ๋งˆํฌ์–ด, ๋ฝ ์ด๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ๋‹ค.

* ์„ธ๋งˆํฌ์–ด

struct semaphore {
	unsigned value;
	struct list waiters;
};
  • value : ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ’ (0์ด๋ฉด ์ ์œ  ์ค‘, 1์ด๋ฉด ์‚ฌ์šฉ๊ฐ€๋Šฅ)
  • waiters : ํ•ด๋‹น ์ž์›์„ ์ ์œ ํ•˜๊ธฐ์œ„ํ•ด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋“ค์˜ ๋ชฉ๋ก
    (ํ˜„์žฌ ํ•€ํ† ์Šค์—์„œ๋Š” ์ด waiter์— FIFO๋กœ ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ์ด๋ฅผ ์šฐ์„ ์ˆœ์œ„์ˆœ์œผ๋กœ ๋“ค์–ด๊ฐ€๋„๋ก ๋ฐ”๊ฟ”์ค˜์•ผํ•จ)

* Lock

struct lock {
	struct thread *holder;
	struct semaphore semaphore;
};

๋ฝ์€ ์„ธ๋งˆํฌ์–ด์ธ๋ฐ, ํ˜„์žฌ ์ž์‹ ์„ ์ฅ๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ๊ณ ์žˆ๋Š” ์„ธ๋งˆํฌ์–ด!
์ด๋ฆ„ํ‘œ๊ฐ€ ๋‹ฌ๋ฆฐ ์„ธ๋งˆํฌ์–ด๋‹ค.
๊ตฌํ˜„ ์‹œ ์ฃผ์˜ํ•  ์ ์€, lock์€ ์ž์‹ ์˜ holder์Šค๋ ˆ๋“œ๋ฅผ ์•Œ์ง€๋งŒ, ์Šค๋ ˆ๋“œ ์ž์‹ ์€ ์ž์‹ ์ด ์–ด๋–ค lock์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅธ๋‹ค. lock์œผ๋กœ๋ถ€ํ„ฐ ์Šค๋ ˆ๋“œ๋กœ์˜ ์ ‘๊ทผ์€ ๋ฐ”๋กœ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ lock์œผ๋กœ์˜ ์ ‘๊ทผ์€ ์‰ฝ์ง€ ์•Š๋‹ค.


3. ๊ตฌํ˜„

3-1. sema_down, sema_up ํ•จ์ˆ˜

  • sema_down : ์„ธ๋งˆํฌ์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋“ค์—์„œ waiter์— ์Šค๋ ˆ๋“œ๋ฅผ ๋„ฃ์–ด์ค„๋•Œ, ์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ๋„ฃ์–ด์ฃผ๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค.
  • sema_up : ์Šค๋ ˆ๋“œ๊ฐ€ waiter์— ์žˆ๋Š” ๋™์•ˆ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ ค ํ•˜์—ฌ waiter๋ฅผ ์šฐ์„ ์ˆœ์œ„๋กœ ์ •๋ ฌ ํ•œ๋‹ค.

3-2. cmp_sem_priority ํ•จ์ˆ˜

bool cmp_sem_priority (const struct list_elem *a, const struct list_elem *b, void *aux UNUSED){
	struct semaphore_elem *sa = list_entry(a, struct semaphore_elem, elem);
	struct semaphore_elem *sb = list_entry(b, struct semaphore_elem, elem);
}

ํ•ด๋‹น lock์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์„ธ๋งˆํฌ์–ด ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š” ์Šค๋ ˆ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์œผ๋ฉด 1 ๋ฐ˜ํ™˜, ๋‚ฎ์œผ๋ฉด 0 ๋ฐ˜ํ™˜ํ•˜๋Š” bool ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.


4. ํšŒ๊ณ 

์ด๋•Œ๋ถ€ํ„ฐ ์Šฌ์Šฌ ์–ด๋ ค์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.
์„ธ๋งˆํฌ์–ด์™€ lock์˜ ๊ฐœ๋…์ด ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ฑ์žฅํ•˜๋ฉด์„œ ๋ˆ„๊ฐ€ ๋ˆ„๊ตด ๊ฐ€๋ฆฌํ‚ค๊ณ , ๋ˆ„๊ฐ€ ๋ˆ„๊ตด ์†Œ์œ ํ•˜๊ณ  ๋งˆ๊ตฌ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑด ๋ง›๋ณด๊ธฐ์— ๋ถˆ๊ณผํ–ˆ์ง€..
๋‹ค์Œ ๋‹จ๊ณ„์ธ Priority donation์€ ์ •๋ง.. Lock, ์„ธ๋งˆํฌ์–ด์˜ ๋ํŒ์™•์ด๋‹ค..


(์‚ฌ์ง„์ถœ์ฒ˜ : ํ•€ํ† ์Šค ๊ฐ•์˜์ž๋ฃŒ)

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