본문 바로가기

CS/운영체제(OS)

OS - 임계구역과 세마포어

728x90

Critical Section

  • 공통 자원을 건드릴 수 있는 공간이다.
  • 멀티 프로세싱에 의한 오류는 보통 여기서 발생한다.
  • 해결 방안이 갖춰야하는 것
    • Mutual exclusion - 오직 한 쓰레드만 진입
    • Progress - 진입 결정은 유한 시간 내
    • Bounded waiting - 어느 스레드라도 유한 시간 내에 해결해야함.

프로세스/쓰레드 동기화

  • 임계구역 문제 해결 (틀린 답 X)
  • 프로세스 실행 순서 제어
  • 비효율성 제거

세마포어

  • 유명한 동기화 해결 도구
    • acquire()
    • release()
    • 세마포어는 상호베타를 위해 사용한다.
void acquire(){
	value--;
	if(value < 0){
		add this process/thread to list
		block
	}
}

void release(){
	value++;
	if(value <= 0){
		remove a process/thread P from list 
		wakeup
	}
}
  • 세마포어의 중요한 함수들이다. 여기서 세마포어는 value를 갖고 있는데, 이 value가 임계구역에 들어갈 수 있는 프로세스/쓰레드의 개수이다.
  • 세마포어는 각각의 대기큐(waiting queue)를 가지고 있다.
    1. P1이 임계구역 입장 시도 → aquire 호출 value = 0
    2. P2 임계구역 입장 성공
    3. P2가 임계구역 입장 시도 → aquire 호출 value = -1
    4. P2는 임계구역 입장 실패 → 대기큐 입장
    5. P1이 작업을 마치고 퇴장 → release 호출 value = 0
    6. P2가 임계구역 입장 성공 → aquire 호출 value = -1
    7. 반복

그림으로 표현하면 다음과 같다.

프로세스의 실행순서

  • p1이 먼저 critical section에 들어갔기 때문에 p2는 들어갈 수 없었다. 그래서 대기큐에 들어갔고 블락 상태에 빠져 절대로 스스로 나올 수 없다.
  • p1이 빠져나오며 p1을 깨워주었고 덕분에 대기큐에서 나올수있었다.
  • 이렇게 세마포어는 상호배타를 실현한다.

Ordering

  • 세마포어의 순서를 설정하고 싶을 때
    • 초기 value 세팅을 0으로한다.

임계구역 입장 순서 설정

  • 예제) 언제나 입금이 먼저되게 하려면?
    • 세마포어 초기 value = 0;
    • 세마포어.acquire를 먼저 출금 앞에 쓰고, 입금 뒤에 세마포어.release를 작성한다.

Critical Section

  • 공통 자원을 건드릴 수 있는 공간이다.
  • 멀티 프로세싱에 의한 오류는 보통 여기서 발생한다.
  • 해결 방안이 갖춰야하는 것
    • Mutual exclusion - 오직 한 쓰레드만 진입
    • Progress - 진입 결정은 유한 시간 내
    • Bounded waiting - 어느 스레드라도 유한 시간 내에 해결해야함.

프로세스/쓰레드 동기화

  • 임계구역 문제 해결 (틀린 답 X)
  • 프로세스 실행 순서 제어
  • 비효율성 제거

세마포어

  • 유명한 동기화 해결 도구
    • acquire()
    • release()
    • 세마포어는 상호베타를 위해 사용한다.
void acquire(){
	value--;
	if(value < 0){
		add this process/thread to list
		block
	}
}

void release(){
	value++;
	if(value <= 0){
		remove a process/thread P from list 
		wakeup
	}
}
  • 세마포어의 중요한 함수들이다. 여기서 세마포어는 value를 갖고 있는데, 이 value가 임계구역에 들어갈 수 있는 프로세스/쓰레드의 개수이다.
  • 세마포어는 각각의 대기큐(waiting queue)를 가지고 있다.
    1. P1이 임계구역 입장 시도 → aquire 호출 value = 0
    2. P2 임계구역 입장 성공
    3. P2가 임계구역 입장 시도 → aquire 호출 value = -1
    4. P2는 임계구역 입장 실패 → 대기큐 입장
    5. P1이 작업을 마치고 퇴장 → release 호출 value = 0
    6. P2가 임계구역 입장 성공 → aquire 호출 value = -1
    7. 반복

그림으로 표현하면 다음과 같다.

  • p1이 먼저 critical section에 들어갔기 때문에 p2는 들어갈 수 없었다. 그래서 대기큐에 들어갔고 블락 상태에 빠져 절대로 스스로 나올 수 없다.
  • p1이 빠져나오며 p1을 깨워주었고 덕분에 대기큐에서 나올수있었다.
  • 이렇게 세마포어는 상호배타를 실현한다.

Ordering

  • 세마포어의 순서를 설정하고 싶을 때
    • 초기 value 세팅을 0으로한다.
  • 예제) 언제나 입금이 먼저되게 하려면?
    • 세마포어 초기 value = 0;
    • 세마포어.acquire를 먼저 출금 앞에 쓰고, 입금 뒤에 세마포어.release를 작성한다.