개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
경성대학교 양희재 교수님 수업 영상을 듣고 정리하였습니다.
동기화 문제 해결을 위한 소프트웨어 도구
void acquire() {
value --; // number of permit(무언가를 할 수 있는 권한)
if (value < 0) {
add this process/thread to list
block;
}
}
value, P, V, 큐(list)
가 존재void release() {
value ++;
if (value <= 0) {
remove a process P from list
wakeup P;
}
}
value = 1
을 둔다.(권한을 1로 두었다는 것을 의미)critical section
으로 진입import java.util.concurrent;
class BankAccount {
int balance;
Semaphore sem;
BankAccount() {
sem = new Semaphore(1);
}
void deposit(int n) {
try{
sem.acquire();
} catch (InterruptedException e) ()
// critical section
int temp = balance + n;
System.out.println("+");
balance = temp;
//
sem.release();
}
void withdraw(int n ){
try{
sem.acquire();
} catch (InterruptedException e) ()
// critical section
int temp = balance + n;
System.out.println("-");
balance = temp;
//
sem.release();
}
int getBalance() {
return balance;
}
}
앞에서 이야기 했듯이 프로세스/쓰레드 동기화에서는 임계구역 문제를 해결하는 것도 중요하지만, 프로세스의 실행 순서를 제어하는 것 또한 중요하다.
P1 | P2
| sem.acquire();
S1; | s2;
sem.release(); |
import java.util.concurrent;
class BankAccount {
int balance;
Semaphore sem; dsem; wsem;
BankAccount() {
sem = new Semaphore(1);
dsem = new Semaphore(0);
wsem = new Semaphore(0);
}
void deposit(int n) {
try{
sem.acquire();
// critical section
int temp = balance + n;
System.out.println("+");
balance = temp;
sem.release();
//
wsem.release();
dsem.acquire();
} catch (InterruptedException e) ()
}
void withdraw(int n ){
try{
wsem.acquire();
} catch (InterruptedException e) ()
// critical section
int temp = balance + n;
System.out.println("-");
balance = temp;
sem.release();
//
dsem.release();
}
int getBalance() {
return balance;
}
}