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가 점유한 자원을 대기하는것 이 반복되는 것
- 교착상태 처리 방법
- 교착상태를 예방하거나 회피하는 프로토콜 사용
- 교착상태를 허용한 다음에 회복
- 문제를 무시하고 발생하지 않은 척 한다.
- 교착상태가 발생하지 않도록 하는 방법
- 예방: 필요조건 중 하나가 성립되지 않도록 보장한다
- 회피: 프로세스가 일생동안 요구하고 사용할 자원에 대한 부가적인 정보를 미리 제공할 것을 요구하고 운영체제가 해당 정보를 바탕으로 각 프로세스의 요청과 방출을 고려한다.