05. 공유 자원을 병행적으로 읽거나 쓰는 상황을 무엇이라 하는가?
경쟁조건
06. 공유 자원의 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역은 무엇인가?
임계 구역
공유 자원
•
여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등
→ 프로세스들의 공유 자원 접근 순서를 정해야 문제가 발생하지 않는다
경쟁 조건
•
2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
임계구역
•
공유 자원의 접근 순서에 따라 결과가 달라진다
→ ex. 가스렌지는 화구가 3개라 한번에 여러개가 접근 가능, 하지만 믹서는 1개니까 주방의 임계구역
•
프로세스들이 동시에 작업하면 안 된다.
→ 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 밖에서 기다려야 한다
공유자원의 접근 예
•
P1이 예금을 확인한다
•
P2가 진행되어 예금 확인 및 입금을 진행한다
•
P1은 P2의 과정을 무시하고 기존 예금 10만원에 자신의 입금 과정을 진행해 결과 20만원이 나온다
•
예금 : 임계 구역
07. 임계구역 해결 조건 중 한 프로세스가 임계구역에 들어갔을 때 다른 프로세스는 임계구역에 들어갈 수 없는 조건을 무엇이라 하는가?
상호 배제
08. 임계구역 해결 조건 중 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다는 조건을 무엇이라 하는가?
진행의 융통성
생산자-소비자 문제
•
생산자는 수를 증가시켜가며 물건을 채운다
•
소비자는 생산자를 쫓아가며 물건을 소비한다
→ 전역 변수 sum에 접근하는 타이밍을 맞추지 않으면 (a), (b) 처럼 결과가 달라진다
(a)
1.
생산자는 sum = 3 일 때 sum=sum+1 수행 → sum = 4
2.
소비자는 sum = 3 으로 읽고 sum=sum - 1 수행 → sum = 2
(b)
1.
소비자는 sum = 3 일 떄를 읽고 sum=sum - 1 수행 → sum = 2
2.
생산자는 sum = 3 으로 읽고 sum=sum+1 수행 → sum = 4
해결 조건
1. 상호 배제
•
한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다
1.1 잠금 구현
1.
프로세스 P1, P2는 임계구역에 진입하기전에 잠금이 걸려있는지 확인 (lock == true)
2.
잠겨있으면 무한 루프를 돌며 대기 while(lock==ture);
3.
잠금이 풀리면 무한루프를 나와서 작업 시작
4.
잠금을 건다 (lock=true;)
5.
작업을 마치면 잠금을 푼다 (lock=false;)
1.2 동시 진입 상황
1.
P1이 while(lock==true); 실행. 무한루프를 빠져나옴
→ 다음 문장을 실행하려는 순간 CPU 시간을 다 써서 준비상태로 옮겨진다
→ 문맥 교환이 발생하고 P2 가 실행상태로 바뀐다
2.
P2가 while(lock==true); 실행
→ P1이 잠금을 걸지 않았기 때문에 lock은 false. P2는 임계구역에 진입 가능
3.
P1은 lock=true; 문을 실행하여 임계구역에 잠금을 걸고 진입
4.
P2도 lock=true; 문을 실행하여 임계구역엥 잠금을 걸고 진입
→ P1, P2 둘 다 while 문을 빠져나오지 못하고 무한 루프에 빠져서 임계구역에진입 못함
→ 교착상태
위의 경우 프로세스가 늘어나면 검사해야 하는 lock의 개수도 늘어나 비효율적이다.
2. 한정 대기
•
어떤 프로세스도 무한 대기하지 않아야 한다
→ 특정 프로세스가 임계구역에 진입하지 못하면 안 된다.
2.2 무한 대기 상황
•
P1과 P2가 동시에 임계구역에 진입하지 않는다
•
무한 대기상황 발생 가능
1.
P1은 lock1=true; 문을 실행한 후 타임아웃 → 문맥 교환이 발생하고 P2가 실행상태로 바뀐다
2.
P2도 lock2=true; 문을 실행한 후 타임아웃 → 문맥 교환이 발생하고 P1이 실행상태로 바뀐다
3.
P2가 lock2=true; 문을 실행했기 때문에 P1은 while(lock2==true); 문에서 무한루프에 빠진다.
4.
P1이 lock1=true; 문을 실행했기 때문에 P1은 while(lock1==true); 문에서 무한루프에 빠진다.
3. 진행의 융통성
•
한 프로세스가 다른 프로세스의 진행을 방해하면 안된다
ex. B가 믹서를 쓰고 A가 쓰기로 했는데 A가 쓸 일이 없음에도 B 가 사용 후 마냥 A를 기다리면 안된다.
3.1 상호배제, 한정대기 조건을 충족하는 코드
•
lock에 1, 2 처럼 네이밍을 해서 사용중인 프로세스를 표시
→ 잠금을 확인하는 코드가 하나이므로 상호 배제와 한정 대기를 보장
→ 서로 번갈아가며 실행되는것이 문제
•
한 프로세스가 연달아 임계구역에 진입할 수 없다
→ 경직된 동기화