[운영체제] 12. 세마포

이호용·2021년 4월 16일
0

운영체제

목록 보기
11/12

아래 내용들은 양희재 교수님의 운영체제 강의를 듣고 정리한 내용입니다.

세마포 (Semaphore)의 사용방법

1. Ordering

  • sem.value = 0;
p1p2
빈칸sem.acquire();
s1s2;
sem.release();빈칸
  • 이렇게 되면, value값이 0부터 시작이기 떄문에, p2가 먼저 실행되면, acquire되면서 value값이 -가 되기떄문에 동작되지 않는다.
  • ordering 은 p1이 작동되고 난 후에는 값이 1증가 하고 난 후에 s2도 올수 있다.

ordering 예제

  • 항상 입금 먼저 (= Parent 먼저) 과
  • 항상 출금 먼저 (= Child 먼저) 문제를 ordering으로 해결할수 있다.
  • 입출금 교대로 (P-C-P-C-P-C- …)

2. 입출금 교대로 (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;
}

3. 입출금 교대 풀이

  • sem , semDeposit, semWithraw을 통해 초기 세마포 값을 설정한다.
  • 여기서 sem은 문맥전환을 할 떄 저장하는 변수가 꺠지지 않기 위해 사용한다.
  • +가 먼저 사용되 지않으면, withdraw에서 semwithraw가 음수가 되기 때문에, 블락 걸리게 되고,
  • 끝날떄 semdeposit을 늘려서, deposit도 블라에서 나올수 있게끔 해준다.
  • 이런식으로 하면 + , -를 번갈아 가며 나오게 할수 잇다.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

0개의 댓글