[OS] ํ๋ก์ธ์ค ๋๊ธฐํ - ์๊ณ๊ตฌ์ญ ๋ฌธ์
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์๋ก ์์ํ๊ฒ ๋ค.
๐ฒ์ํ ๊ณ์ข ๋ฌธ์ (Bank Account Problem)
๋ง์์ด ๋ค์ด์๋ ๊ณ์ข์ ๋ ๋ช ์ด ๋์์ ๋ง ์์ฉ ์ธ์ถํ๋ค๋ฉด?
์ฒซ๋ฒ์งธ ์ฌ๋์ด ๋ง์์ ์ธ์ถํ์ฌ ๊ณ์ข ์์ก์ด 0์ผ๋ก ์ค์ ๋๊ธฐ ์
๋ ๋ฒ์งธ ์ฌ๋์ด ๋ง์์ ์ธ์ถํ์ฌ ๊ณ์ข ์์ก์ 0์ผ๋ก ์ค์ ํ๋ ค ํ๋ค๋ฉด?
์์ก์ 0์ด์ง๋ง ์ด๋ง์์ด ์ธ์ถ๋๋ ๊ฒ์ด ์๋๊น?
์ข๋ ์ปด๊ณผ๊ฐ์ด ๋งํด๋ณด๊ธฐ
๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ํ ๊ณ์ข ์์ก ๋ณ์ balance๋ ํ์ฌ ๊ฐ์ด 10000์ด๋ค.
ํ๋ก์ธ์ค A์ B๋ balance๋ฅผ -10000 ์ํค๋ ์ผ์ ํ๋ค.
A๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ balance ๊ฐ์ ์ฝ์ด 10000์ ๋บ ํ, ๊ฒฐ๊ณผ ๊ฐ 0์ balance์ ์ ์ฅํ๋ ค๊ณ ํ๋ค.
์ ์ฅํ๊ธฐ ์ ๊น์ง balance๋ 10000์ด๋ค.
B ์ญ์ balance๊ฐ 10000์ ์ฝ์ด 10000์ ๋บ ๊ฒฐ๊ณผ ๊ฐ 0์ balance์ ์ ์ฅํ๊ณ ์ ํ๋ค.
๊ทธ ์ฌ์ด A๊ฐ balance๋ฅผ 0์ผ๋ก ๋ง๋ค์์ง๋ง, B๋ balance๊ฐ์ ๋ค์ 0์ผ๋ก ๋ฎ์ด์์ด๋ค.
์ด๊ฒ ๊ฐ๋ฅํ๋ค๋ฉด ์ํ์ ๊ฑฐ๋๋ ๊ฒ์ด๋ค.
=> ๊ณต์ ์์์ ๋์์ ์ ๊ทผํจ์ผ๋ก์จ ์๊ธฐ๋ ์๊ณ๊ตฌ์ญ ๋ฌธ์
(๋ฉํฐ ์ค๋ ๋ ์์ ๊ฐ๊ธด ํ์ง๋ง) ๋น์ทํ ๋ฌธ์ ์ฝ๋
public class Main {
public static void main(String[] args) {
SharedBoard board = new SharedBoard();
Thread th1 = new StudentThread("bin", board);
Thread th2 = new StudentThread("sanha", board);
th1.start();
th2.start();
}
}
class SharedBoard {
private int sum = 0;
/*synchronized*/ public void add(){
int n = sum;
Thread.yield();
n += 10;
sum = n;
System.out.println(Thread.currentThread().getName() + " : " + sum);
}
public int getSum(){return sum;}
}
class StudentThread extends Thread{
private SharedBoard board;
public StudentThread(String name, SharedBoard board){
super(name);
this.board = board;
}
public void run(){
for(int i=0; i<10; i++){
board.add();
}
}
}
1. synchronized ์์ ๋ bin : 10 bin : 20 bin : 30 bin : 40 bin : 50 bin : 60 bin : 70 bin : 80 bin : 90 bin : 100 sanha : 110 sanha : 120 sanha : 130 sanha : 140 sanha : 150 sanha : 160 sanha : 170 sanha : 180 sanha : 190 sanha : 200 Process finished with exit code 0 |
2. synchronized ์์ ๋ bin : 10 bin : 30 sanha : 20 sanha : 40 sanha : 50 sanha : 60 sanha : 70 sanha : 80 sanha : 90 sanha : 100 sanha : 110 sanha : 120 bin : 40 bin : 50 bin : 60 bin : 70 bin : 80 bin : 90 bin : 100 bin : 110 Process finished with exit code 0 |
๐๋ณํ ํ๋ก์ธ์ค์ ๋๊ธฐํ
- ๊ฒ์์ ํ ๋ ์บ๋ฆญํฐ๊ฐ ์์ง์ด๋ฉด์, ๋ ธ๋๋ ๋์ค๊ฒ ํ๋ ค๋ฉด ์ฌ๋ ค ํ๋ก์ธ์ค๊ฐ ๋์์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค.
- ํ์ง๋ง ํ๋์ CPU๋ ํ๋์ ํ๋ก์ธ์ค๋ฐ์ ์คํํ ์ ์์ผ๋ฏ๋ก ํ๋ก์ธ์ค๋ผ๋ฆฌ ์ฌ๋ฌ๋ฒ ๋ฌธ๋งฅ๊ตํํ์ฌ ๋์์ ์ฒ๋ฆฌ๋๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ค.
- ๋ณํ ํ๋ก์ธ์ค ๊ฐ์ ๋น๋๊ธฐ์ ์ด๋ค.
- ๋๊ธฐ์ : ํ ํ๋ก์ธ์ค์ ์์ ์ ๋๋ด๋ฉด ๋ค์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ค. (JAVA Sync)
- ๋น๋๊ธฐ์ : ์ฌ๋ฌ ํ๋ก์ธ์ค๋ฅผ ๋ฒ๊ฐ์ ์ํํ๋ค.
๋ค๋ฅธ ํ๋ก์ธ์ค๋ค์ด ์ด๋ค ์ํ์ ์๋์ง, ์ด๋ค ์์์ ๊ฐ์ง๊ณ ์๋์ง,
์ด๋๊น์ง ์คํ๋๋์ง ๋ฑ์ ๋ํด ๋ชจ๋ฅธ ์ฑ ์คํ๋๊ณ ์๋ค. - ๊ณต์ ์์์ด ์์ผ๋ฉด ์๋ฌด ๋ฌธ์ ๊ฐ ์์ง๋ง. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ฒฝ์ ์ํ(Race Condition) : ํ๋ก์ธ์ค๋ค์ด ๊ณต์ ๋ฐ์ดํฐ์ ๋ํด ์๋ก ์ ๊ทผ์ ์๋ํ๋ ์ํฉ
์ด๋ก ์ธํด ์ํธ๋ฐฐ์ , ๊ต์ฐฉ์ํ, ๊ธฐ์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. - ์๊ณ ์์(Critical Resource) : ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ฌ์ฉํ ์ ์๋ ์์
์๊ณ ์์ญ(Critical Section) : ์๊ณ ์์์ ์ ๊ทผํ๊ณ ์คํํ๋ ์ฝ๋ ๋ถ๋ถ - ์๊ณ ์์ญ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋
1. ์ํธ ๋ฐฐ์ ๋ฅผ ์ ์ง์ผ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค ๋ง์ด ์๊ณ ์์ญ์ ๋ค์ด๊ฐ์ผ ํ๋ค.(Mutual exclusion)
2. ์๊ณ ์์ญ์ ์์ง ์์ ํ๋ก์ธ์ค๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์๊ณ์์ญ ์ง์ ์ ๋ง์์๋ ์๋๋ค.(Progress requirement)
3. ๋น์ด์๋ ์๊ณ ์์ญ์ ๋ํ ์ง์ ์ ๋ฐ๋ก ํ์ฉํ๋ค. ํน์ ํ๋ก์ธ์ค์ ์ง์ ์๋๋ง ๊ณ์ ๋ฌด์ฐ๋์ด ๊ธฐ์๋ฅผ ๊ฒฉ์ง ์๋๋ก ํ๋ค.(Bounded-waiting requirement)
4. ์๊ณ ์์ญ์ ๋ฒ์ด๋ ๋๋ ์์ ์ด ๋์ค๋ ์ฌ์ค์ ์๋ ค ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ด์ฌ ์ ์๋๋ก ํ๋ค.
=> ์ด๊ฒ ์ง์ผ์ง๊ฒ ์ ์ ํ ์ฝ๋ฉํด์ผ ํ๋ค.
๐ฅ์ํธ ๋ฐฐ์
- ์ํํธ์จ์ด ๊ธฐ๋ฒ๋ค
- Peterson ์๊ณ ๋ฆฌ์ฆ
- ๊ฒ๋ ๋ฒํฐ๋ค๊ฐ ์๋๊ฐ ๋๋๋ฉด ๋์ด๊ฐ๋ค.
- ํ์ฌ ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ง์ํ๋ ์ปดํจํฐ์์๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
์ข ์์ฑ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. -> ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ ์ฌ์ฉ
- Lamport ๋ฒ ์ด์ปค๋ฆฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฒํธํ ๋ฐ๊ธฐ
- ๋ฒํธํ๋ฅผ ๋ฐ์์ผ๋ฉด์, ๋๋ณด๋ค ์ ๋ฒํธ๋ฅผ ๋ฐ์ ํ๋ก์ธ์ค ์ค ์คํ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋ ํ์ธ
- ํ๋์จ์ด ๊ธฐ๋ฒ
- ์ธํฐ๋ฝํธ ๊ธ์ง๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฒ -> ๊ทธ๋ฅ ์ธํฐ๋ฝํธ๋ฅผ ๊ธ์งํจ
- ํ๋์จ์ด ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฒ
- ๊ฐ๋จํ๊ณ , ๋ค์ค์ฒ๋ฆฌ ์์คํ ์์๋ ์ฝ๊ฒ ์ธ ์ ์์, ๋ค๋ฅธ ๋ณ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ฌ๋ฌ ์๊ณ ์์ญ ์ง์
- ๋ฐ์ ๋๊ธฐ, ์ฐจ๋ก ์ ํด์ง์ง ์์.
๊น์ฃผ๊ท , ใOS? Oh Yes!ใ, ํด๋จผ์ธ์ด์ธ์ค
ํฉ๊ธฐํ ๊นํจ์, ๋ช ํ JAVA Programming ๊ฐ์ 4ํ, ์๋ฅ์ถํ