CS/OS

임계 구역 문제

우봉수 2023. 4. 24. 00:04

정의

  • 프로세스 동기화를 위해서 각 프로세스 들이 접근시 다른 프로세스의 접근을 막아야 하는 코드 영역을 임계 구역이라 한다.
  • 동기화가 필요한 이유: 만약 여러개의 프로세스 또는 스레드가 동시에 접근 하면 데이터 불일치가 발생 할 수 있기 때문이다.

임계 구역 해결안의 필요 조건

  • 상호 배제(mutual exclusion): 한 프로세스가 임계구역에서 실행되면 다른 프로세스는 임계구역에 접근할 수 없어야 한다.
  • 진행(progress): 모든 프로세스가 언젠가는 해당 임계 구역에 접근 할 수 있음을 보장 해 주어야 한다.
  • 한정된 대기(bounded waiting): 각 프로세스들은 임계 영역에 진입 할 수 있는 횟수에 한계가 있어야 한다.

피터슨 해결안

do{
	flag[i] = true; // 진입여부
	turn = j; // 준비여부
	while(flag[j] && turn == j); 
		//critical section
	flag[i] = false;
		//remainder section
}while(true);
  • 특정 변수를 사용하여 프로세스 별로 임계구역에 진입할 순번을 정한다.
  • 상호배제, 진행, 한정된 대기 모두 지켜진다.
  • 조건이 충족 될 때 까지 대기해야함

하드웨어적 동기화

// 순차적인 아닌 한번에 해당 명령이 실행
boolean test_and_set(boolean *target){
	boolean rv = *target;
	*target = true;
	return rv
}
  • 원자적으로 교환 할 수 있는 특별한 하드웨어 명령어
  • 과정
    • 메모리 검사 후 값을 지정
    • 두 메모리 워드 교환

Mutext Locks

do{
	get_Rock();
		//critical section
	release_Rock();
}while(true);
  • 한 스레드가 임계영역에 진입 시 문을 잠그고 임계영역을 빠져나올시 다시 문을 여는 방식
  • 단일 스레드와 공유 자원 간 상호 작용을 제어하는 데 사용
  • 가용해지길 기다리는 프로세스들이 계속 회전하고 있기 때문에 스핀락이라 불리운다.
    • 락을 기다리는 동안 상당한 시간을 소모하는 문맥 교환이 전혀 필요하지 않다는 장점을 가진다.

Semaphores

  • 뮤텍스와 유사하지만 프로세스들이 자신들의 행동을 더 정교하게 동기화 할 수 있는 방법을 제공하는 강력한 도구
  • 뮤택스와의 차이점은 정해진 수 만큼 한 번에 여러 개의 스레드가 공유자원에 접근 할 수 있도록 허용한다는 것
  • 여러 개의 스레드와 공유 자원 간 상호 작용을 제어하는 데 사용

Monitors

  • 고급 언어에서 사용되는 동기화 메커니즘
  • 객체 지향 프로그래밍에서 상태(state)와 동작(operation)을 함께 캡슐화한 객체(object)에 대한 접근 제어를 제공하는 추상화된 데이터 타입
  • 락과 조건 변수(condition variable)를 함께 사용하여 공유 자원에 대한 상호 배제 및 조건부 실행(conditional execution)을 지원한다.

DeadLock

  • 두 개 이상의 프로세스 서로서로가 필요한 자원을 가지고 자원을 반환하기를 기다리는 상황 교착상태라고도 한다.
  • 교착상태가 일어나는데 필요한 조건들
    • 상호 배제(유일하게 예방 불가능): 한 번에 한 프로세스만이 해당 자원을 사용할 수 있는 경우
    • 점유하며 대기: 프로세스가 최소 하나의 자원을 점유한 채 대기 하는 것 
    • 비선점: 자원을 선점 할 수 없는 것(중간에 자원을 뺏어 올 수 없는 것)
    • 순환 대기: 순환적으로 p1은 p2가 점유한 자원을 대기하는것 이 반복되는 것
  • 교착상태 처리 방법
    • 교착상태를 예방하거나 회피하는 프로토콜 사용
    • 교착상태를 허용한 다음에 회복
    • 문제를 무시하고 발생하지 않은 척 한다.
  • 교착상태가 발생하지 않도록 하는 방법
    • 예방: 필요조건 중 하나가 성립되지 않도록 보장한다
    • 회피: 프로세스가 일생동안 요구하고 사용할 자원에 대한 부가적인 정보를 미리 제공할 것을 요구하고 운영체제가 해당 정보를 바탕으로 각 프로세스의 요청과 방출을 고려한다.