2022. 12. 13. 19:37ใ_Study/OperationSystem
Concurrency & Critical Section ๐¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•
ํด๋น ์๋ฃ๋ ๊ฐ์ ํ์ต์๋ฃ์ ๋๋ค.
๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์ ํ๋ ๊ฑธ๊น? -> speed & economics ์์ ํฌ๊ฒ ์ด์ ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ๋ณ๋ ฌ ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ๊ธฐ๋ ํ๋ค๊ณ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๊ธฐ๋ ํ๋ค๋ค. ๋ณ๋ ฌ์ฑ์ ๋ณด์ฅํ๊ธฐ์ํ ๋๊ธฐํ์ ๋ํด ๋ฐฐ์๋ณด์.
Critical Section (๋ณ๋ ฌ์ฑ & ์๊ณ๊ตฌ์ญ, ์น๋ช ์ ์์ญ)
์ด์์ฒด์ ๊ฐ ์ง์ํ๋ ๋๊ธฐํ ๋ฐฉ๋ฒ์ ํ๋๋ก “์๊ณ ๊ตฌ์ญ” , “์น๋ช ์ ์์ญ” ์ผ๋ก ๋ณดํธ๋์ด์ผํ ์์ญ์ ์ด๋ฆ. ๊ณต์ ์์์ ๋ ์ ์ ๋ณด์ฅํด์ฃผ๋ ์ญํ ์ ์ํํ๋ค.
- ์ปค๋ ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋๊ธฐํ ํ๋ ๋ฐฉ๋ฒ
- ์ปค๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ (๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ค, ํ ํ๋ก์ธ์ค ๋ด์ ์ฐ๋ ๋ ์ฌ์ด์์๋ง ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค.)
- ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์ ์ ๊ทผ์ด ๋ถ๊ฐ
- ๋ฎคํ
์ค (mutex)
- ์ปค๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ, ๋ฌด๊ฑฐ์
- ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ด ํ ํ๋ก์ธ์ค ๋ด์ ์ฐ๋ ๋ ์ฌ์ด์์๋ง ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ ๋ฐ๋ฉด, ๋ฎคํ ์ค๋ ์ฌ๋ฌ ํ๋ก์ธ์ค์ ์ค๋ ๋ ์ฌ์ ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
- ํ๋ก์ธ์ค ๋ค์ค ์คํ์ ๋ง์ ๋
- ์ธ๋งํฌ์ด(Semaphore)
- ์ธ๋งํฌ์ด๋ ์ง์ ๋ ์ ๋งํผ ์ฐ๋ ๋๊ฐ ๋์์ ์คํ๋๋๋ก ๋๊ธฐํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค (ex/ ํ์ฅ์ค์ ๊ฐ์)
- multiple application (๋ค์ค์์ฉ): invented to allow procession time to be shared among active applications : ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ํ๋์ ๋ฐ์ดํฐ ๋๋ ๊ทธ ์งํฉ์ด ์ฌ๋ฌ ๋ถ์ผ์์ ์๋ก ๊ณตํต์ผ๋ก ์ฌ์ฉ ๋๋ ๊ฒ. ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๋์์ ๋์
- Structured Application : extension of modular design and structured programming: ํ๋ก๊ทธ๋จ ๋ชจ๋ํ → ๊ตฌ์กฐํ๊ฐ ๋์ด์์
- Operation System Structure : OS themselves implemented as a set of processes or threads: OS ์์ฒด๋ ๋ณ๋ ฌ์ฑ์ ๊ฐ์ง๊ณ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ(processes, threads)์ด ๋์๊ฐ (๋ฐฑ๊ทธ๋ผ์ด๋)
- ๋๋ฒ๊น ์ด ๋๋ฌด ์ด๋ ค์ด ๋จ์ : Scheduler์ ๊ฒฐ๊ณผ๋ฅผ ์์ธก์ ํ ์๊ฐ ์์. Problem : the relative speed of execution of processes cannot be predicted
OS์ ๋ฐ๋ผ Scheduling ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ ์๋ ์์, interrupts → global value์ ๋ฌธ์ (shared memory)
- Critical Section (๊ต์ฐจ๋ก, ์ฌ๊ฑฐ๋ฆฌ)
- shared double balance ์ ์๋ก ์ค๋ช , Race condition: there is a race to execute critical sections
(๋์์) ์ถ๊ธ ๋ด์ฉ์ ์ ์ฅํ๊ธฐ ์ ์ ์ ๊ธํ๋ฉด ์ถ๊ธ๋ด์ญ์ด.. ์ฌ๋ผ์ง๋ค! ์ด๋ ๋์์ compile ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
๋ฐ๋ ๊ฐ์ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ์์ ๊ฐ์ ๋ถ๋ฌ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ store ํ๊ธฐ ๋๋ฌธ์ด๋ค.
i++ ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋์ผํ๊ฒ ๋ฐ์ํ๋ค. load i, i+=1 store i ์ 3๋จ๊ณ๋ก ๊ตฌ์ฑ๋์ด ์์ด i++๊ณผ ๊ฐ์ ์ฝ๋์๋ ๊ฐ์ด ์ฌ๋ผ์ง๋ ํ์์ด ์ผ์ด๋๋ค.
Race condition ๊ฒฝ์์ํ : there is a race to execute critical sections
The sections may be defined by different code in different processes : cannot easily detect with analysis.
์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ด ๊ณต์ ์์์ ์ฌ์ฉํ๊ธฐ ์ํด ์์ง์ด๋ ์ผ์ข ์ ๊ฒฝ์ ์ํ๋ฅผ ์๋ฏธํ๋ค.
Mutual exclusion : only one process can be in the critical section at a time
ํ ํ๋ก์ธ์ค๋ง ์คํ๋ ์ ์๋ค. ๊ต์ฐจ๋ก์ ์ฐจ๊ฐ 1๋๋ง ๋ค๋๊ฒ ํ๊ธฐ
without mutual exclusion, results of multiple execution are not determinate
์ํธ ๋ฐฐ์ ๊ฐ ์๋ค๋ฉด, ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ ์ ์๋ค. (์ ์ฌ์ ์ธ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.)
Need an OS mechanism so programmer can resolve races : ์ํธ ๋ฐฐ์ , Mutex ๋์ ํ๋ก๊ทธ๋๋ฐ์์ ๊ณต์ ๋ถ๊ฐ๋ฅํ ์์์ ๋์ ์ฌ์ฉ์ ํผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ, ์๊ณ๊ตฌ์ญ์ผ๋ก ๋ถ๋ฆฌ๋ ์ฝ๋ ์์ญ์ ์ํด ๊ตฌํ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๋ณ๋ ฌ์ฑ์ ๋ณด์ฅํ ์ ์์๊น?
1. Disabling Interrupts : ์์ธ์ธ ์ธํฐ๋ฝํธ๋ฅผ ์ ๊ฑฐํ์.
disableInterrupts();
balance = balance + amount;
enableInterrupts();
์ธํฐ๋ฝํธ๋ฅผ ์์๋ก ๋นํ์ฑํ ํ ์ ์์ง๋ง ์ธ์ ๊น์ง ์ด๋ฅผ ๋ง์์ผ ํ๋์ง๋ ๋ชจ๋ฅด๊ณ ์ฐ์ ์์์ ๋ฐ๋ฆฌ๋ฉด ์์ ์คํ๋์ง ์์ ์๋ ์๋ค. ๋ํ ์ธํฐ๋ฝํธ๋ฅผ ์ค์งํ๋ฉด, ๋ค๋ฅธ ์ธํฐ๋ฝํธ๋ ์ค์ง๋๊ธฐ ๋๋ฌธ์ ์์คํ ์ ์ฒด๊ฐ ๋ธ๋ฝ๋ ์ ์๋ค.
2. Using a Lock Variable : Lock ๋ณ์๋ฅผ ์ฌ์ฉํ์
์ฌ์ฉํ ๋ Lock์ผ๋ก ์ ๊ตฌ๊ณ ์ฌ์ฉํ๋ฉด ํธ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ค.
while(lock); // do nothing, busy wait
lock = True ๋ฉด ๋๊ตฐ๊ฐ๊ฐ ์ผ์ ํ๊ณ ์๋๊ฒ!
Busy Wait Condition : ์ค์ผ์ค๋ง์ ์ํด ๋์ด๊ฐ์ง๋ง lock์ด ๊ฑธ๋ ค ์๋ฌด๊ฒ๋ ํ์ง ์๋ ์ํ
Unsafe Solution
์์์ ์ฌ์ฉํ๋ ค๊ณ ์ง์ ํํ lock์ true๋ก ๋ง๋ค๊ธฐ๋ ์ ์ time interrupt๋ฅผ ๋ฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ก ๋์ด๊ฐ๋ค๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๋ lock์ด ๊ฑธ๋ ค์์ง ์์ ๋ ํ๋ก์ธ์ค ๋ชจ๋ ๋์์ ์์์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ lock๋ ๊ณต์ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์๋ก์ด critical section์ด ์๊ธธ ์ ์๋ค.
Atomic Lock Manipulation - System call, ์ชผ๊ฐ์ง์ง ์๋ ํจ์(time interrupt๋ก ์ชผ๊ฐ์ง์ง์์)
OS์ ์ํด์๋ง block๋๋ system call ํจ์์ด๊ณ enter(), exit() ํจ์๋ก ์ ์ํ์ฌ ํญ์ ๋์ผํ ์ฝ๋๋ฅผ ์ํํ๋ค. interrupts๊ฐ ๋นํ์ฑํ๋๋ ์๊ฐ์ด ์ ํ๋์ด ์์ด ๋ช๊ฐ์ ๋ช ๋ น์ด๊ฐ ์ํ๋๋ ๋์๋ง block๋๋ค.
lock ํ ๋นํด๋ ๋๋์ง ํ์ธํ๋ ์ฝ๋ ์ถ๊ฐ๋ ๊ฐ๋ฅํ๋ค.
Deadlock : ๋ ๊ฐ์ ์์๋ฅผ ์ฒ๋ฆฌํ ๋ ์๋ก์ ์์์ด ํ์ํด ๋ฌดํํ ๊ธฐ๋ค๋ฆฌ๋ ์ํฉ
์ ์ํฉ์ deadlock์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ด๋ค. lock1 ๋ณ์๊ฐ true๋ก ๋ฐ๋๋ฉด ์ ๊ธฐ๊ฒ ๋์ด ๋ค๋ฅธ process๋ ๋ง์๋ฒ๋ฆฐ๋ค.
Semaphore : ๋ฐ๋๋ฝ ํด๊ฒฐ๋ฒ
Dijkstra sepaphore : ๋ค์ด์์คํธ๋ผ๊ฐ ์ด์์ฒด์ ์ ํ์ํ ๊ฐ๋ ์ ์ธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ค. ๊ฐ๋ ์ผ ๋ฟ์ด์ง๋ง ์ต์ ์ด์์ฒด์ ์ ๋ฉ์ปค๋์ฆ์ด ๊ธฐ๋ณธ์ด ๋๋ค.
Critical Section : ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๊ธฐ๋ณธ ์กฐ๊ฑด 4๊ฐ์ง
- mutual Exclusion : only one process at a time in the CS : ์ค์ง ํ ๋ฒ์ ํ ํ๋ก์ธ์ค๋ง ์ฌ์ฉํ๋ค.
- Only processes competing for a CS are involved in resolving who enters the CS : ์ธ๋ถ์ ๊ฐ์ญ(๊ด๋ฆฌ์)์์ด ํ๋ก์ธ์ค ๋ด์์ ๊ท์น์ ์ ํ์ฌ ๊ฒฝ์ํด์ ํด๊ฒฐํ๋ค.
- Once a process attempts to enter its CS, it cannot ve postponed indefinitely : ๋ฌดํ์ ์ฐ๊ธฐ(์ง์ฐ) ๊ธ์ง
- After requesting entry, only a bounded number of other processes may enter before the requsting process : ์์ฒญํ๊ธฐ ์ ์ ๋๊ธฐ์ค์ด๋ ํ๋ก์ธ์ค(์์ฌ์๋ ํ๋ก์ธ์ค)๋ ํ์ ๋ ๊ฐ์๋ง ๋๊ธฐ ๊ฐ๋ฅํ๋ค.
์์ 4๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ์ฌ ํด๊ฒฐํ ๊ฒ์ ์ธ๋งํฌ์ด๋ผ๊ณ ํ๋ค.
์ธ๋งํฌ์ด : Semaphore
s is a nonnegaive integer variable that can only be changes or tested by these two indivisible functions:
์์ด ์๋ ์ ์ (1,2,3..)๋ก ์ด๋ฃจ์ด์ง ๋ณ์์ด๋ฉฐ, ์ฒดํฌํ๋ ํจ์, ์๊ทธ๋์ ์ฃผ๋ ํจ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
Verhogen : increase(์ฆ๊ฐ, ์ ์๋ฅผ +) / Proberen : try(testing) ์ฌ์ฉํด๋ ๋๋์ง ํ์ธ
P๋ 0์ธ ๋์์๋ ๊ธฐ๋ค๋ ค์ผํ๋ค. (์ด๊น๊ฐ์ด 1์ด๋ฉด ๋ค์ด์์ -1๋ก 0์ผ๋ก ์ ๊ตฌ๊ณ ์ฌ์ฉํ๋ค.)
semaphore mutex =1; // ์ธ๋งํฌ์ด ๋ณ์์ด๋ฆ์ด mutex์ด๋ค.
P()
์งํํ ์ฝ๋
V()
fork(proc_0,0); // run
fork(proc_1,0); // run
Sharing Two variables
V๋ก ์ ํธ๋ฅผ ์ฃผ๋ฉด P๋ก ๋ฐ๋๋ค.
proc_A(){
while(TRUE){
update(x);
V(s1);
P(s2);
retrieve(y);
}
}
์ธ๋งํฌ์ด ์ด๊น๊ฐ์ ์ด์ฉํด ์กฐ์ ํ ์ ์๋ค.
P,V ์์๊ฐ ๋ฐ๋ก ์ ํด์ ธ ์์ง๋ ์๋ค.
Counting semaphore - interger variable : ์ฌ๋ฌ ์ ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
Binary semaphore : 0~1 mutex lock
Deadlock and Starvation
Deadlock : two or more processes are waiting indefinitely for an event that can be caused by only one of the waiting processes // ์์ฒญํ ์๊ทธ๋์ ๋ฌดํ waiting, block ๋์ด ์๋ ์ํ
Let S and Q be two semaphores initialized to 1
Starvation : indefinite blocking. A process may never be removed from the semaphore queue in which it is suspended
Priority Inversion - Scheduling problem when lower-priority process holds a lock nedded by higher-priority process
time scheduling์ ์ํด ์ฐ์ ์์ ์ญ์ ํ์์ด ์ผ์ด๋ ์ ์๋ค.
์ญ์ผ๊ฐํ ๋ชจ์์ Critical Section์ธ๋ฐ ์ฆ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ํ๋ก์ธ์ค t3๊ฐ ์คํ๋๊ณ ์ฐ์ ์์๊ฐ ๋์ t1์ด ๊ณต์ ๋ณ์๋ฅผ ํ์๋ก ํ ๋ P()ํจ์๋ก block์ด ๊ฑธ๋ฆด ์ ์๋ค. ์ด๋ t3 ๊ฐ ์ ๋ ๊ณต์ ๋ณ์๋ฅผ ๋๋ ค์ฃผ์ง ์์ผ๋ฉด ์ฐ์ ์์ ์ญ์ ํ์์ด ์ด๋ฌ๋๋ค.
t3๋ ์ฐ์ ์์๊ฐ ๋ฎ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์คํ๋๋ฉด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผํด์ t3๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฐธ ๋ค์ ๋๋ ค์ฃผ๊ฒ ๋๊ธฐ ๋๋ฌธ์ t1์ ์ฐ์ ์์๊ฐ ๋์๋ ๊ฐ์ฅ ๋ฆ๊ฒ ๋๋๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฐ์ CS๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ์ ์์๊ฐ ์๋์ธ t3์ t1์ ์ฐ์ ์์๋ฅผ ์์ํ๋ค. ์ด๋ฅผ priority inheritance(์ฐ์ ์์์์) ๋ผ๊ณ ํ๋ค.
๋ค์ด์์คํธ๋ผ์ ํด๊ฒฐ๋ฒ
์์ฐ์์ ์๋น์ ๋ฌธ์
์์ฐ์(producer): ์ ๋ณด๋ฅผ ๋ง๋ค์ด๋, update , ex)print program
์๋น์(consumer): ์ ๋ณด๋ฅผ ์ฌ์ฉํจ. ex) printer
ํ์ ๋ ๊ฐ์์ buffer๊ฐ ์๋๋ฐ buffer๋ item์ hold ํ๋ค. producer๊ฐ full pool์ buffer์ ์ฌ์ฉํ๋ฉด ๋ค์ empty pool์ ๋ด๋๋ค.
์ฌ๋ฌ๋ช ์ด ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (web)
reader : ๋ ์, updateํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ช ์ด ์ฝ์ ์ ์๋ค.
writer : ์๊ฐ, ์์ฑํ ๋๋ ํ ๋ช ๋ง ์ ๊ทผํด์ผํ๋ค.
์ฒซ๋ฒ์งธ ๋ ์๊ฐ ๋ฐฉ์ ์ ๊ตฌ๊ณ (๋ชจ๋ writer ๊ณผ์ ๊ฒฝ์)
๋ง์ง๋ง ๋ ์๊ฐ signal์ ๋ณด๋
writer๊ฐ ๋ชจ๋ reader์ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ starvation ๋ฐ์ํ ์ ์๋ค
๋ณดํต์ writing์ ๋ ์ฐ์ ์์๋ฅผ ์ฃผ๊ฑฐ๋ ๊ถํ์ ์ค๋ค.
์ ๊ทธ๋ฆผ ์ค๋ช : ํ๋ก์ธ์ค 1 reader๊ฐ ํ์ดํ๊น์ง ์คํ
ํ๋ก์ธ์ค 2 reader๊ฐ P(readBlock)๊น์ง ์คํํ๊ณ ์คํ์ค 0์ด๋จ
ํ๋ก์ธ์ค 3 writer ์ ๊ทผํ์ฌ 0์ด๋ผ ์ดํ ์คํ ๋ชปํจ
ํ๋ก์ธ์ค 4 P์ ์ ๊ทผํ์ฌ 0์ด๋ผ ์ดํ ์คํ ๋ชปํจ
ํ๋ก์ธ์ค2๊ฐ V(readblock)์ ๋ ๋ฒ ์คํํด์ผํ๋ ์ํฉ์ด ๋ฐ์์ด๋ผ๋๋ฐ ์ ์ดํด๊ฐ ๊ฐ์ง์์ ์ ๋ฆฌํ๋ฉด, ํ๋ก์ธ์ค3์ด writer๋ง ์์ฐจ์ ์ผ๋ก ์คํ๋๊ฑฐ๋, ํ๋ก์ธ์ค2๊ฐ ๋๊น์ง ์คํ๋๊ธฐ๋ง ํด๋ V๊ฐ ๋ชจ์๋ผ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฌด๋๋ P๊ฐ ๋์ ์คํ๋์ด lock์ด ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ. V๋ก ๋๋ ค์ค๋ ํ๋๋ง ๋๋ ค์ฃผ๋๊ฑด๋ฐ ์ด๊ฑธ ๊ด๋ฆฌํ๋ ๊ด๋ฆฌ์๊ฐ ์์ด ๋๋ค ์๊ธฐ๊บผ์ธ์ค ์๊ณ ๋ฐ์ ๊ฒฐ๊ตญ ํค์ ์ดํฉ ๊ฐ์๊ฐ ์ํค๋ ๊ฑฐ๊ฐ๋ค.
๋ฐ๋ผ์ readblock ์กฐ์ฐจ๋ 1๊ฐ์ฉ๋ง ์ฌ์ฉํ๊ฒ ๋ง๋ ๊ฒ writePending๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
it is imperative that the P and V operations be implemeted as atomic primitives : atoimic์ผ๋ก ๊ตฌ์ฑํ๋ค.
์ํํธ์จ์ด๋ฟ๋ง ์๋๋ผ ํ๋์จ์ด๋ก ์ธ๋งํฌ์ด๋ฅผ ๊ตฌ์ฑํ ์๋ ์๋ค.
Dekker's, Perterson's ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌํํ ์ ์๋๋ฐ ์ธ๋งํฌ์ด๋ฅผ ๊ตฌํํ๋ฉด ์ค๋ฒํค๋๊ฐ ๊ต์ฅํ ํฌ๊ฒ ๋ฐ์ํ๋ค.
์ด์์ฒด์ ์์ ์ธ๋งํฌ์ด๋ฅผ ์ง์ํ๊ณ ์๋ค.
์ฒ ํ์๋ค์ ์ ๋ ์์ฌ
์ฒ ํ์ 5๋ช , ์ ๊ฐ๋ฝ 5๊ฐ๋ก ๊ตฌ์ฑ, ์ฒ ํ์๋ค์ thinking, eating ๋์์ ์ํ, ์์์ ์ ๊ฐ๋ฝ 2๊ฐ๋ฅผ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ง ์์ฌ๊ฐ๋ฅ = ์ด์ํ ์ฒ ํ์๋ ๋์์ ์์ฌ ์ ๋ ๋ถ๊ฐ๋ฅ
์ ๊ฐ๋ฝ = shared data // CS
์ธ๋งํฌ์ด๋ฅผ ์ค์ฒฉ์์ ์ฌ์ฉํ๋ค. P(0) p(1) ๋๋ค ์ ๊ฐ๋ฝ์ด ์์ด์ผ eat() ๊ฐ๋ฅ
๋์์ ํ์ชฝ ์ ๊ฐ๋ฝ๋ง ์ก์ผ๋ฉด? -> ๋ชจ๋๊ฐ ๋๋จธ์ง ํ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ํ -> deadlock
์ง์ ์ค๋ฅธ์ชฝ๋ถํฐ ๋ค๊ธฐ, ํ์์ธ์ฌ๋์ ์ผ์ชฝ๋ถํฐ ๋ค๊ธฐ
๊ฒฐ๋ก : (Nesting)์ค์ฒฉ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ๋ฉด deadlock์ด ๋ฐ์ํ ์ ์๋ค.
์๋ก๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ์ ์ํด ์์ฑ๋ ์ฝ๋๋ผ ์์์ ์์๋ก ๊ตฌํํ๋ค.
-> P์ฐ์ฐ์ ์์ ํ ๋ฐ์ดํฐ ์ฌ์ฉ์ ์ํด์ ์ถ์ํํ์ฌ ํ๋์ ์ฐ์ฐ์ผ๋ก ์ด์ฉํ์.
AND synchronization : ์ฌ๋ฌ๊ฐ semaphore์ ๋ฌถ์ด์ ์ฒ๋ฆฌํ ์ ์๋ค. => ๋๊ฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํด์ผ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๋ค.
Psimultaneous(S1,S2...Sn): P ์ ์ฒด ๋๊ธฐ๋ธ๋ญ
Semaphores provide a powerful tool for enforcing mutual exclusion and coordinate processes
But wait and signal are scattered among several processes. Hence, difficult to understand their effects.
Usage must be correct in all the processes
One bad process can fail the entire collection of proecesses
Event
Exact definitition is specific to each OS:์ด์์ฒด์ ๋ง๋ค ๋ค๋ฆ
a process can wait on an event until another process signals the event : ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก์ธ์ค์๊ฒ signal์ ์ค ์ ์๋ค.
event descriptor : event control block : signal์ 1๊ฐ๋ง ๋ฐ์. broadcast x
Active approach
- multiple processes can wait on an event
- exactly one process is unblockes when a signal occurs
- A signal with no waiting process is ignored
May have a queue function that returns number of processes waiting on the event.
topOfHour.wait(): ์ ์๊ฐ ๋๋ฉด ใ ก signal์ ๋ณด๋.
Unix signal : it is raised by one process to call nother process's attention to an event
ํ๋ก์ธ์ค๋ ์ฌ์ฉ์๊ฐ ์ ํธ๋ฅผ ์ค๋ ์ฌ์ฉํ๊ฑฐ๋, ์์คํ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ์ฌ์ฉ๋๋ค.
it can be caught by the subject process
Justification for including signals was for the OS to inform a user process of an event
Ctrl + C => interrupt, 2 / or ๋๋ง์ ํธ๋ค๋ฌ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
Program tried to divided by zero
Active semaphore (if) | passive semaphore (while) | |
๋ฐ์ ์์ | signal ๋ฐ์ ์์ | ๋ฐ์ํ๊ณ ํ์ํ ๋ |
์ฑ๋ฅ | ๋๋ฆผ : target switching -> overhead | ๋น ๋ฆ : ๋ณ๋ ฌ์ปดํจํ |
์ด๋ฆ | Hoare semantics | Brinch Hansen semantics |
Monitors
Specialized form of ADT(Abstract Data Type) : encapsulates implementation
ํ๋ฒ์ ํ๋์ balace๋ฅผ ์ ๊ทผํ ์ ์๋๋ก
writer , reader ํ๋์ ์ฑ ๋ฑ ๋ณดํธ๊ฐ ๋๋ค.
reader writer ์ฌ์ด์ deadlock์ด ๋ฐ์ํ ์ ์๋ค.
suspend ๊ฐ ํ์ํ๊ฒ ๋ค.
suspend : ์กฐ๊ฑด์ด ๋ง์กฑํ ๋๊น์ง (์ ๊น์)์ค์ง
condition variable : monitor์์์ ์ฌ์ฉํ๋ event์ ํน๋ณํ ํํ
wait() : suspend invoking process until another executes a signal
signal() : resume one process if any are suspended, otherwise do nothing
queue(): return TRUE if there is at least one process suspended on the condition variable : ํ๋์ ํ๋ก์ธ์ค๊ฐ suspended๋ผ๋ฉด true๋ฅผ ๋ฐํ ์๋๋ฉด false, ๋๊ธฐํ๊ณ ์๋ ๋๋ฃ
์ฒ ํ์๋ค์ ์ ๋ ์์ฌ์ ์ ์ฉํ๊ธฐ
test์์ ์์ชฝ์ผ๋ก signal์ ์ค wait์๋๊ฒ signal ์ ๋ฐ์ผ๋ฉด ์คํ๋๋ค.
pthread mutex
variables | pthread_mutex_t |
initialize | pthread_mutex_init |
setting | pthread_mutex_lock |
Unsetting | pthread_mutex_unlock |
Destroy | pthread_mutex_destroy |
mutex๋ฅผ ์ฌ์ฉ์ ์ต๋ํ ๋ฒ์๋ ์๊ฒ ์ก์์ผํ๋ค.
#include <pthread.h>
pthread_mutex_lock(&lck);
balace += dep[i];
pthread_mutex_unlock(&lck);
semaphore
#include <semaphore.h>
int sem_init(sem_t *sem, int pshared, unsigned int value);
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
omt sem_destory(sem_t* sem);
'_Study > OperationSystem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ch8 virtual memory(VM) #์ด์์ฒด์ OS #๊ฐ์๋ฉ๋ชจ๋ฆฌ (0) | 2022.12.15 |
---|---|
ch7. memory paging, segmentation #์ด์์ฒด์ OS #ํ์ด์ง๊ธฐ๋ฒ (0) | 2022.12.14 |
ch7. memory management.1 #์ด์์ฒด์ OS #๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ (0) | 2022.12.14 |
ch6. Deadlock(๋ฐ๋๋ฝ) #์ด์์ฒด์ OS #๋ฐ๋๋ฝ์์กฐ๊ฑด (0) | 2022.12.14 |