아래 내용들은 양희재 교수님의 운영체제 강의를 듣고 정리한 내용입니다.
p1 | p2 |
---|---|
빈칸 | sem.acquire(); |
s1 | s2; |
sem.release(); | 빈칸 |
ordering 예제
- 항상 입금 먼저 (= Parent 먼저) 과
- 항상 출금 먼저 (= Child 먼저) 문제를 ordering으로 해결할수 있다.
- 입출금 교대로 (P-C-P-C-P-C- …)
Semaphore sem, semDeposit, semWithraw;
BankAccount() {
sem = new Semaphore(1);
semDeposit = new Semaphore(0);
semWithraw = new Semaphore(0);
}
void deposit(int amount) {
try {
sem.acquire();
int temp = balance + amount;
System.out.print("+");
balance = temp;
sem.release();
semWithraw.release();
semDeposit.acquire(); // 입금후에는 반드시 출금을 해야 하므로 자신을 block한다.
} catch (InterruptedException e) {}
}
void withdraw(int amount) {
try {
semWithraw.acquire(); // 입금보다 먼저 수행하는 것을 막는다.
sem.acquire();
} catch (InterruptedException e) {}
int temp = balance - amount;
System.out.print("-");
balance = temp;
sem.release();
semDeposit.release(); // 출금 수행이 완료되면 block되었던 입금 프로세스를 깨워준다.
}
int getBalance() {
return balance;
}
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-