이번 단원은 코드가 많이나와 이해하는데 시간이 많이 필요했다.
이해를 하고 나니 매우 쉬운 내용이였고 다른 임계구역을 보호할 수 있는 방법을 여러가지 생각해봤지만 내가 생각했던 것들은 모두 여러가지 상황들로 인해 문제점이 많았다.
먼저 첫번째로 다루는 코드에 잠금확인을 2번 하는 것이다.
P1
1. while(lock2==true); // lock2가 true이면(P2이 임계구역을 사용중이면) 무한 대기
3. lock1==true; // lock1을 true(잠금)로 설정
5. while(lock2==true); // 이중확인 > 무한잠금
//임계구역
lock1=false; lock1을 false(잠금해제)로 설정
P2
2. while(lock1==true); // lock1가 true이면(P1이 임계구역을 사용중이면) 무한 대기
4. lock2==true; // lock2을 true(잠금)로 설정
while(lock1==true); //이중확인 > 무한잠금
//임계구역
lock2=false; lock2을 false(잠금해제)로 설정
이러한 코드를 작성한다면 P1이 lock2가 true가 아닌걸 확인 한 후 다음으로 넘어가는도중 타임아웃이 나서 P2가 임계구역에 집입하기 위해 lock1이 true가 아닌걸 확인 한 후 다시 3번의 문장으로 간다.
그러면 P1은 lock1를 잠구게되고 타임아웃이 나서 P2가 lock2를 잠구게 되면 서로 아무도 나갈 수 없는 *교착상태에 빠지게 된다.
이것처럼 안되는 코드라도 여러 가지 상황에 대해 스스로 생각해보면서 실력을 쌓아가야겠다.
공유 자원과 임계구역
1. 공유 자원의 접근
- 공유자원이란 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일이다.
- 공유자원은 공통으로 이용되기 때문에 접근 순서에 따라 결과가 달라질 수 있다.
2. 임계구역
- 공유자원 접근 순서에 따라 실행결과가 달라지는 프로그램의 영역
- 임계구역에 두개의 프로세스가 같이 들어가면 오류가 발생할 수 있기 때문에 한 번에 하나의 프로세스만 들어가야 한다.
3. 생산자 - 소비자 문제
임계구역과 관련된 대표적인 문제의 예시이다.
예를 들어 생산자는 SUM에 +1을 하고있고 소비자는 -1을 하고 있다고 생각해보자. 이 모델은 다음과 같은 문제점이 있다.
- 생산자가 물건 하나를 buf 4에 저장하고 sum을 4로 바꿔야하나 바꾸지 못했다.
- 소비자가 sum이 3인 상태에서 물건을 하나 소비하고 sum을 2로 바꾸지 못했다.
- 두 개의 프로세스가 sum을 3으로 보고 작업을 하게된다.
결론은 정작 남아있는것은 원래 상태 그대로인 3인데 2또는 4인 값이 나오게 된다.
임계구역 해결 방법
임계구역을 해결하는 방법은 잠금을 이용하는 것이다. 하나의 프로세스가 임계구역에 들어가 있는 동안 다른 프로세스가 기다리게 되면 임계구역에 관한 문제는 사라진다.
1. 기본 코드 소개
1-1. 상호 배제 문제
P1
while(lock==true); // lock이 true면(다른 프로세스가 사용중이면) 무한 루프를 돌며 대기
lock=true; //lock을 true(잠금 실행)으로 바꿈
//임계구역
lock=false; // lock을 false(잠금해제)로 바꿈
문제점
1. P1이 임계구역에 진입하기 위해 lock이 true인지 확인 후 잠금이 없는걸 확인 → 진입
2. P1의 CPU할당 시간이 끝나 P2에 CPU가 주어지고 P2도 임계구역에 진입하기 위해 lock이 잠겨있는지 확인 후 잠금이 없는걸 확인 → 진입
3. 다시 P1이 CPU를 받고 lock을 true(잠금)으로 바꾸고 진입
4. P2도 CPU를 할당받고 lock을 true(잠금)으로 바꾸고 진입
5. P1과 P2 모두 임계구역에 진입
1-2. 한정 대기 문제
boolean lock1 = false;
boolean lock2 = false;
P1
lock1=true; //lock1을 true(잠금)로 바꿈
while (lock2==true); //lock2(다른 프로세스가 잠금)가 true이면 무한 대기
//임계구역
lock1=false; //lock1을 false(잠금해제)로 바꿈
문제점
1. P1이 lock1 = true;를 실행하고 타임아웃
2. P2도 lock2 = true;를 실행하고 타임아웃
3. P1은 lock2가 true이기 때문에 무한루프
4. P2도 lock1이 true이기 때문에 무한루프
5. 아무도 임계구역을 들어가지 못했기때문에 lock을 false로 바꿀 수 없음
1-3. 진행의 융통성 문제
int lock=1; //공유변수
P1
while(lock==2); //lock이 2이면(P2의 차례이면) 무한대기
//임계구역
lock=2; //lock을 2로(P2의 차례) 바꾼다
문제점
1. 두 프로세스가 번갈아 가며 임계구역에 진입
2. *경직된 동기화 발생
1-4. 피터슨 알고리즘
boolean lock1=false;
boolean lock2=false;
int turn=1;
P1
lock1=true; //lock1을 true(잠금)로 바꿈
turn=2; //turn(순서)을 프로세스 2에게 넘겨줌
while(lock2==true && turn==2); //lock2가 true이고(P2가 사용중이고) turn이 2이면(순서가 P2차례이면) 무한대기
//임계구역
lock1=false; //lock1을 false(잠금해제)로 바꿈
문제점
1. 2개의 프로세스밖에 사용하지 못한다.
1-5. 데커 알고리즘
boolean lock1=false;
boolean lock2=false;
int turn=1;
P1
lock1=true; //lock1을 true로 바꿈
while(lock2==true) //lock2가 true라면(P2가 사용하려한다면)중괄호의 내용 실행
{ if(turn==2) { //만약 turn이 2라면(순서가 P2의 차례라면)
lock1=false; //lock1을 false(잠금해제)로 바꿈
while(turn==2); //turn이 2라면 무한대기
lock1=true; } //lock1을 true로 바꿈
}
//임계구역
turn=2; //turn을 2로 바꿈 (P2의 순서로 바꿔줌)
lock1=false; //lock을 false로 바꿈(잠금해제)
문제점
1. 피터슨 알고리즘과 데커 알고리즘은 임계구역 해결의 3조건을 모두 만족하지만 다소 복잡함
1-6. 하드웨어적인 해결방법
while(lock==true); // 1행과 2행을 하드웨어적인 방법으로 하나의 행으로 만들 수 있음
lock=true;
//임계구역
lock=false;
다음 코드에서 1행과 2행이 따로 실행되기 때문에 오류가 발생한다. 하지만 하드웨어적인 방법으로 1,2행을 한번에 합칠 수 있다.
1-7. 세마포어
- Semaphore(n) : RS에는 현재 사용 가능한 자원의 수가 저장
- P( ) : 잠금을 수행하는 코드. RS가 0보다 크면 1만큼 감소시키고 임계구역에 진입. 0보다 작으면 0보다 커질 때까지 기다린다.
용어 정리
교착 상태 : 한정 대기 조건을 보장하지 못하는 상황. 프로세스는 살아있으나 작업이 진행되지 않는 상태
경직된 동기화 : 프로세스의 진행이 다른 프로세스에 의해 방해 받는 것
'OS > 쉽게 배우는 운영체제' 카테고리의 다른 글
메모리 관리 (1) (0) | 2022.03.10 |
---|---|
교착 상태 (2) | 2022.03.08 |
프로세스 동기화 (1) (0) | 2022.03.03 |
CPU 스케줄링 (2) (0) | 2022.02.23 |
CPU 스케줄링 (1) (0) | 2022.02.22 |
댓글