๐ CPU ์ค์ผ์ค๋ฌ(Scheduler)3 & ๋ณํ์ ์ด1
์ถ๊ฐ์ ์ธ CPU ์ค์ผ์ค๋ง
-
Multiple-Processor-scheduling
CPU๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์ค์ผ์ค๋ง์ด ๋์ฑ ๋ณต์กํด์ง
- Homogeneousํ ๊ฒฝ์ฐ
- Queue์ ํ์ค๋ก ์ธ์์ ๊ฐ ํ๋ก์ธ์๊ฐ ์์์ ๊บผ๋ด๊ฐ๊ฒ ํ ์ ์๋ค.
- ๋ฐ๋์ ํน์ ํ๋ก์ธ์์์ ์ํ๋์ด์ผ ํ๋ ํ๋ก์ธ์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๊ฐ ๋์ฑ ๋ณต์กํด์ง
- Load Sharing
- ์ผ๋ถ ํ๋ก์ธ์ค์์ job์ด ๋ชฐ๋ฆฌ์ง ์๋๋ก ๋ถํ๋ฅผ ์ ์ ํ ๊ณต์ ํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์
- ๋ณ๊ฐ์ ํ๋ฅผ ๋๋ ๋ฐฉ๋ฒ vs ๊ณต๋ ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- Symmetric Multiprocessing (SMP) ๊ฐ CPU๊ฐ ๋๋ฑํจ
- ๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์์์ ๊ฒฐ์
-
Asymmetic Multiprocessing ์กฐ์จํ๋ CPU๊ฐ ์์ - ํ๋์ ํ๋ก์ธ์๊ฐ ์์คํ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ฑ ์์ง๊ณ ๋๋จธ์ง ํ๋ก์ธ์ค๋ ๊ฑฐ๊ธฐ์ ๋ฐ๋ฆ
- Homogeneousํ ๊ฒฝ์ฐ
- Real time
- Hard real-time system (์ ํ์๊ฐ ์์ ์ ๋๋๋ฉด ํฐ ์ผ ๋๋ ๊ฒ๋ค)
- Hard real-time Task๋ ๋ฐ๋์ ์ ํด์ง ์๊ฐ์์ ๋๋ผ ์ ์๋๋ก ์ค์ผ์ค๋ง ๋์ด์ผ ํจ
- Soft real-time system (๋์์์ ์คํธ๋ฆฌ๋ฐํ๋ ๊ฒ๋ค)
- Soft real time Task๋ ์ผ๋ฐ ํ๋ก์ธ์ค์ ๋นํด ๋์ priority๋ฅผ ๊ฐ๋๋ก ํด์ผ ํจ
- Hard real-time system (์ ํ์๊ฐ ์์ ์ ๋๋๋ฉด ํฐ ์ผ ๋๋ ๊ฒ๋ค)
-
Thread Scheduling
- Local Scheduling - ์ด์์ฒด์ ๋ ์ค๋ ๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฆ, ๊ทธ๋์ ์ง์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ
- User Level Thread์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์์ค์ Thread library์ ์ํด ์ด๋ค Thread๋ฅผ ์ค์ผ์ค๋ง ํ ์ง ๊ฒฐ์
- Global Schefduling - ์ด์์ฒด์ ๋ ์ค๋ ๋์ ์กด์ฌ๋ฅผ ์๊ณ ์์, ๊ทธ๋์ ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅ
- Kernel level Scheduling์ ๊ฒฝ์ฐ ์ผ๋ฐ ํ๋ก์ธ์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ปค๋์ ๋จ๊ธฐ ์ค์ผ์ค๋ฌ๊ฐ ์ด๋ค thread๋ก ์ค์ผ์ค๋งํ ์ง ๊ฒฐ์
- Local Scheduling - ์ด์์ฒด์ ๋ ์ค๋ ๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฆ, ๊ทธ๋์ ์ง์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅ
Algorithm Evaluation
- Queuing models (์ฌ๋ฌ ๊ฐ์ง ์ํฉ์ ์ ๋ถ ์ ๋ชฉํ ์ ์์)
- ํ๋ฅ ๋ถํฌ๋ก ์ฃผ์ด์ง๋ Arrival rate์ Service rate ๋ฑ์ ํตํด ๊ฐ์ข Performance Index ๊ฐ์ ๊ณ์ฐ
- implementation(๊ตฌํ) & measurement(์ฑ๋ฅ ์ธก์ )
- ์ค์ ์์คํ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ฌ ์ค์ ์์ (workload)์ ๋ํด์ ์ฑ๋ฅ์ ์ธก์ ๋น๊ต
- Simulation(๋ชจ์ ์คํ)
- ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ์ ํ๋ก๊ทธ๋จ์ผ๋ก ์์ฑํ ํ trace๋ฅผ ์ ๋ ฅํ์ฌ ๊ฒฐ๊ณผ ๋น๊ต
๋ณํ ์ ์ด1 (Process Synchronization)
์ปดํจํฐ ์์์ ์ฐ์ฐ์ ํ ๋๋ ํญ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ณ ์ฐ์ฐํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋์ ์ ์ฅํ๊ฒ ๋์ด ์์.
๋จ์ํ ํ๋ํ๋์ ๋ํด ์ฐ์ฐ์ ํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด ์๊ฒ ์ง๋ง, ์ฌ๋ฌ ๊ณณ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ์ฐ์ ์ํํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์.
์ฆ S-box(Memory Address Space, Storage-box)๋ฅผ ๊ณต์ ํ๋ E-box(CPU Process, Evaluation-box)๊ฐ ์ฌ๋ฟ ์๋ ๊ฒฝ์ฐ Race Condition์ ๊ฐ๋ฅ์ฑ์ด ์์, ( ํ๋ก์ธ์ค๋ ์๊ธฐ ์ฃผ์๊ณต๊ฐ์ ์๋ ๋ฐ์ดํฐ์๋ง ์ ๊ทผํ ์ ์์, ๊ทธ๋์ ํ๋ก์ธ์ค๋ผ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋, ์ฌ๊ธฐ์ CPU๊ฐ ๋ผ์ด๋ ๋ค๋ฉด( System Call์ด ์ผ์ด๋๋ค๋ฉด ), ๋ฌธ์ ๊ฐ ๋ฐ์ํจ. ํนํ CPU๊ฐ ํ๋ ์ผ ๋, ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฑด๋๋ฆฌ๋ ๊ฒฝ์ฐ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ค๋ณตํด์ ์ฐ์ฐํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์. )
๊ฒฝ์ ์ํ:(race condition)๋ ๋ ์ด์์ ์ ๋ ฅ ๋๋ ์กฐ์์ ํ์ด๋ฐ์ด๋ ์์ ๋ฑ์ด ๊ฒฐ๊ณผ๊ฐ์ ์ํฅ์ ์ค ์ ์๋ ์ํ๋ฅผ ๋งํ๋ค.
- Multiprocessor System, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๋ค ์ปค๋ ๋ด๋ถ์ ์ ๊ทผํ๋ ๋ฃจํด๋ค ๊ฐ(์: ์ปค๋๋ชจ๋ ์ํ ์ธํฐ๋ฝํธ๋ก ์ปค๋๋ชจ๋ ๋ค๋ฅธ ๋ฃจํด ์ํ ์)
-
OS์์ Race Condition์ ์ธ์ ๋ฐ์ํ๋๊ฐ?
-
Kernel ์ํ ์ค ์ธํฐ๋ฝํธ ๋ฐ์ ์
- ๊ณ ์ ๋ณ์๋ก ์ฐ์ฐํ๊ธฐ ์ ์ interrupt๋ฅผ disable ์ํค๊ณ ํด๋น ๋ณ์๋ฅผ ๋ค ์ฌ์ฉํ์ผ๋ฉด ๋ค์ interrupt๋ฅผ ์ํํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
-
Process๊ฐ system call์ ํ์ฌ kernel mode๋ก ์ํ ์ค์ธ๋ฐ, context switch๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ
-
๋ ํ๋ก์ธ์ค์ Address Space๊ฐ์๋ data sharing์ด ์์
-
๊ทธ๋ฌ๋ system call์ ํ๋ ๋์์๋ kernel address space์ data๋ฅผ ์ ๊ทผํ๊ฒ ๋จ.
-
์ด ์์ ์ค๊ฐ์ CPU๋ฅผ preemp ํด๊ฐ๋ฉด race condition ๋ฐ์
-
ํด๊ฒฐ์ฑ : ์ปค๋ ๋ชจ๋์์ ์ํ ์ค์ผ ๋๋ CPU๋ฅผ preemptiveํ์ง ์์ ์ปค๋ ๋ชจ๋์์ ์ฌ์ฉ์ ๋ชจ๋๋ก ๋์๊ฐ ๋ preemp
โ ์ฆ kernel ๋ชจ๋์์ ์ํ ์ค์ผ ๋๋ CPU๋ฅผ ๋นผ์์ง ์๋ ๊ฒ์ด ํด๊ฒฐ์ฑ ์
-
-
Multiprocess์์ shared memory ๋ด์ kernel data
- ์ด๋ค CPU๊ฐ ๋ง์ง๋ง์ผ๋ก kernel ๋ณ์๋ฅผ storeํ๋๊ฐ? โ race condition / multiprocessor์ ๊ฒฝ์ฐ, interrupt enable/disable๋ก ํด๊ฒฐ๋์ง ์์
- Method1: ํ๋ฒ์ ํ๋์ CPU๋ง์ด ์ปค๋์ ๋ค์ด๊ฐ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ
- ์ด ๋ฐฉ๋ฒ์ ์ด์์ฒด์ ์ ์ฒด์ lock/unlock์ ๊ฑธ์ด์ ์ํํ๋ ๋ฐฉ๋ฒ์
- Method2: ์ปค๋ ๋ด๋ถ์ ์๋ ๊ฐ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ๋ง๋ค ๊ทธ ๋ฐ์ดํฐ์ ๋ํ lock/unlock์ ํ๋ ๋ฐฉ๋ฒ
- ์ฆ, ๋ค๋ฅธ CPU๊ฐ ํด๋น global ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ์๋ ๊ฒ์ ์ฐฉ์ํ์ฌ ๋ค๋ฅธ CPU๋ ํด๋น ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ lockํ๊ฑฐ๋ unlockํจ
- Method1: ํ๋ฒ์ ํ๋์ CPU๋ง์ด ์ปค๋์ ๋ค์ด๊ฐ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ
- ์ด๋ค CPU๊ฐ ๋ง์ง๋ง์ผ๋ก kernel ๋ณ์๋ฅผ storeํ๋๊ฐ? โ race condition / multiprocessor์ ๊ฒฝ์ฐ, interrupt enable/disable๋ก ํด๊ฒฐ๋์ง ์์
-
๊ฒฐ๊ตญ์ CPU๋ฅผ ๊ฑด๋๋ ๊ณผ์ ์์ ์ผ์ด๋ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ๋ง์ฝ์ shared memory๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด ๋ํ race condition์ด ์ผ์ด๋ ์ ์์
-
-
process synchronization์ ๋ฌธ์
- ๊ณต์ ๋ฐ์ดํฐ(shared data)์ ๋์ ์ ๊ทผ(concorrent access)์ ๋ฐ์ดํฐ์ ๋ถ์ผ์น(inconsistency) ๋ฌธ์ ๋ฅผ ์ผ๊ธฐ์ํฌ ์ ์๋ค.
- ์ผ๊ด์ฑ(consistency)์ ์ํด์๋ ํ๋ ฅ ํ๋ก์ธ์ค(cooperating process)๊ฐ์ ์คํ์์(orderly execution)๋ฅผ ์ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ด ํ์
- Race-condition
- ์ฌ๋ฌ ํ๋ก์ธ์ค๋ค์ด ๋์์ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ์ํฉ
- ๋ฐ์ดํฐ์ ์ต์ข ์ฐ์ฐ ๊ฒฐ๊ณผ๋ ๋ง์ง๋ง์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ ํ๋ก์ธ์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
- Race-condition์ ๋ง๊ธฐ ์ํด์๋ concurrent-process๋ ๋๊ธฐํ(synchronization) ๋์ด์ผ ํ๋ค.
-
The critical-section problem
- n๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
- ๊ฐ ํ๋ก์ธ์ค์ code segment์๋ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ์ฝ๋์ธ critical-section์ด ์กด์ฌ
- problem
- ํ๋์ ํ๋ก์ธ์ค๊ฐ critical-section์ ์์ ๋ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์ค๋ critical section์ ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ค.
-
Initial Attempts to Solve problem
-
๋ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์๋ค๊ณ ํ์. (P0, P1)
-
ํ๋ก์ธ์ค๋ค์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ
do { entry section; // lock์ ๊ฑธ๊ณ critical section; // ๋ฐ์ดํฐ์ ์ ๊ทผ ์ฌ๊ธฐ์ ๋์ ์ ๊ทผ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ exit section; // lock์ ํ๊ณ remainder section; // ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์๋์ง } while (1)
-
ํ๋ก์ธ์ค๋ค์ ์ํ์ ๋๊ธฐํ(syschonize)๋ฅผ ์ํด ๋ช๋ช ๋ณ์๋ฅผ ๊ณต์ ํ ์ ์๋ค. โ syschronization variable
-
Algorithm 1
- syschronization variable
int turn;
initially turn = 0; // P1 can enter its critical section if(turn == i)
-
Process P0
-
do { while (turn != 0); // My turn critical section; turn = 1; // Now it's your turn remainder section; } while (1)
-
Satisfies mutual exclution, but not progress
์ฆ, ๊ณผ์์๋ณด: ๋ฐ๋์ ํ ๋ฒ์ฉ ๊ต๋๋ก ๋ค์ด๊ฐ์ผ๋ง ํจ (swap-turn)
โ ๊ทธ๊ฐ turn์ ๋ด๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค์ผ๋ง ๋ด๊ฐ ๋ค์ด๊ฐ ์ ์์
โ ํน์ ํ๋ก์ธ์ค๊ฐ ๋ ๋น๋ฒํ critical section์ ๋ค์ด๊ฐ์ผ๋ง ํ๋ค๋ฉด?
-
ํ๋ก๊ทธ๋จ์ ํด๊ฒฐ๋ฒ์ ์ถฉ์กฑ ์กฐ๊ฑด
-
Mutual Exclusion(์ํธ๋ฐฐํ)
- ํ๋ก์ธ์ค pi๊ฐ critical section์์ ์ํ ์ค์ด๋ฉด, ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ critical section์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
-
Progress(์งํ)
- ๊ทธ ์ด๋ค ํ๋ก์ธ์ค๋ critical section์ ๋ค์ด๊ฐ์์ง ์์ ์ํ์์ critical section์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด, critical section์ ๋ค์ด๊ฐ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
-
Bounded Waiting (๋๊ธฐ ์๊ฐ์ด ์ ํจํด์ผ ํ๋ค. ์ฆ starvation์ ๋ง์์ผํ๋ค.)
- ํ๋ก์ธ์ค๊ฐ critical section์ ๋ค์ด๊ฐ๋ ค๊ณ ์์ฒญํ ํ๋ถํฐ ๊ทธ ์์ฒญ์ด ํ์ฉ๋ ๋๊น์ง ๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด critical section์ ๋ค์ด๊ฐ๋ ํ๊ณ๊ฐ ์์ด์ผ ํ๋ค.
โญ๏ธ ๊ฐ์
- ๋ชจ๋ ํ๋ก์ธ์ค์ ์ํ์๋๋ 0๋ณด๋ค ํฌ๋ค.
- ํ๋ก์ธ์ค๋ค ๊ฐ์ ์๋์ ์ธ ์ํ์๋๋ ๊ฐ์ ํ์ง ์๋๋ค.
Algorithm 2
-
syschronization variable
bool frag[2]; initially flag[all] = false; // no one is in cs // "Pi is ready to enter its critical section" if (flag[i] == true)
-
Process Pi
do { flag[i] = true; // pretend I am in while (flag[i]); // Is he also in? then wait critical section; flag[i] = false; // I am out now remainder section; } while (1);
-
Satisfies mutual exclusion, but not progress requirement
-
๋ ๋ค 2ํ๊น์ง ์ํ ํ ๋์์์ด ์๋ณดํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์์
Algorithm 3 (Petersonโs Algorithm)
-
combined syschronization variables of Algorithms 1 and 2
-
Process P1
do { flag[i] = true; // My intention is to enter... turn = j; // Set to his turn while (flag[i] && turn == j); // Wait only if critical section; flag[i] = false; // I am out now remainder section; } while(1);
- Meets all three requirements; solves the critical section problem for two processe
- Busy Waiting = Spin lock! (๊ณ์ CPU์ memory๋ฅผ ์ฐ๋ฉด์ wait)
Synchronization Hardware
-
ํ๋์จ์ด์ ์ผ๋ก Test & Modify๋ฅผ atomicํ๊ฒ ์ํํ ์ ์๋๋ก ์ง์ํ ๊ฒฝ์ฐ Busy Waiting = Spin lock! ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์๋ค.
-
Mutual Exclusion with Test & Set
syschronization variables: boolean lock = false; Process Pi do { while (Test_and_Set(lock)); critical section; lock = true; remainder section; }
semaphores (์ธ๋งํธ์ด, ์ถ์์๋ฃํ, object์ operation์ผ๋ก ์ ์๋จ)
-
์์ ๋ฐฉ์๋ค์ ์ถ์ํ์ํด
-
Semaphore S ์ฌ๊ธฐ S์ 1์ด ๋ช๊ฐ ์๋๊ฐ? ์ด๊ฑฐ์ ๋ฐ๋ผ์ ์์์ ํ๋ํ ์ ์๋์ง ์๋์ง ์ ์ ์์ ์๋ฅผ ๋ค์ด์ ๋๊ฐ S์ ์๋ 1์ ํ๋ ๊ฐ์ ธ๊ฐ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ๊ฐ์ ธ๊ฐ๋ ค๊ณ ํ ๋ 1์ด ์์ผ๋๊น. ์์์ ํ ๋น ๋ฐ์ ์ ์์. -
integer variable
-
์๋์ ๋ ์๊ธฐ atomic ์ฐ์ฐ์ ์ํด์๋ง ๊ฐ๋ฅ
P(S): while(S <= 0) do no-op; // โ i.e.wait ์์์ ํ๋ํ๋ ๊ณผ์ , lock์ ๊ฑฐ๋ ๊ณผ์ S--;
If positive, decrement-&-enter. Otherwise, wait until positive (busy-wait)
```c++ V(S): // ์์์ ๋ฐ๋ฉํ๋ ๊ณผ์ , lock์ ํธ๋ ๊ณผ์ S++;
-
-
Critical Section of n process
-
syschronization variables
semaphore mutax; // initially 1: 1๊ฐ๊ฐ CS์ ๋ค์ด๊ฐ ์ ์๋ค? Process P1 do { P(mutax); // if positive, dec-&-enter, Otherwise, wait critical section; V(mutax); // Increment semaphore remainder section; } while(1);
busy-wait๋ ํจ์จ์ ์ด์ง ๋ชปํจ / ex) ์ด๋ฏธ ๋๊ตฐ๊ฐ S๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ๋ค๋ฅธ ๋๊ตฐ๊ฐ๋ while์ ๋๋ ํ์์ด ๋ฐ์ํ ๊ฒ์
์์ ๋ฌธ์ ๋ฅผ Block / Wakeup์ ๊ตฌํํ์ฌ ํด๊ฒฐ ๊ฐ๋ฅ
๊ทธ๋ ๋ค๋ฉด P()์ S()๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ด๋? ์ด๋ Synchronization Hardware ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์.
-
-
Block / Wakeup Implementation
-
semaphore๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์
typedef struct { int value ; // semaphore struct process *L; // process wait queue } semaphore;
-
block๊ณผ wakeup์ ๋ค์๊ณผ ๊ฐ์ด ์ ์
- Block: ์ปค๋์ block์ ํธ์ถํ ํ๋ก์ธ์ค๋ฅผ suspend ์ํด, ์ด ํ๋ก์ธ์ค์ PCB๋ฅผ semaphore์ ๋ํ wait queue์ ๋ฃ์
- wakeup: block๋ process P๋ฅผ wakeup ์ํด, ์ด ํ๋ก์ธ์ค์ PCB๋ฅผ ready queue์ ์ฎ๊น
์์ ๊ฐ์ ์ ์๋ก ์ธํด semaphore์ฐ์ฐ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์ ์๋จ.
Implementation block/wakeup version of P( ) & V( )
P(S): S.value--; // Prepare to Enter if (S.value < 0) { // Oops, negative, I cannot enter add this process to S.L; block(); }
V(S): S.value++; if (S.value <= 0) { remove process from S.L; wakeup(P); }
-
-
which is better?
-
Busy-wait v.s. Block-Wakeup
-
Block/Wakeup overhead v.s. Critical section์ ๊ธธ์ด
- Critical section์ ๊ธธ์ด๊ฐ ๊ธด ๊ฒฝ์ฐ Block/Wakeup์ด ์ ๋น
- Critical section์ ๊ธธ์ด๊ฐ ๋งค์ฐ ์งง์ ๊ฒฝ์ฐ Block/wakeup overhead๊ฐ busy-wait ์ค๋ฒํค๋๋ณด๋ค ๋์ฑ ์ปค์ง ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก๋ Block/Wakeup ๋ฐฉ์์ด ๋ ์ข์
์ฆ, critical section์ ๋ํ ๊ฒฝ์์ด ๋งค์ฐ ์น์ดํ ์ํ๋ผ๋ฉด Block/Wakeup์ด ๋ ์ข๊ณ ๊ทธ๋ ์ง ์๋ค๋ฉด, busy-wait๊ฐ ๋ ์ข์
-
- Two Types of semaphores
- counting semaphore
- ๋๋ฉ์ธ์ด 0 ์ด์์ธ ์์์ ์ ์๊ฐ
- ์ฃผ๋ก resource counting์ ์ฌ์ฉ
- Binery semaphore
- 0 ๋๋ 1 ๊ฐ๋ง ๊ฐ์ง ์ ์๋ semaphore
- ์ฃผ๋ก mutual exclusion (lock/unlock)์ ์ฌ์ฉ
- counting semaphore