9. 임계구역 문제를 하드웨어적으로 해결한 방식으로, 하드웨어의 지원을 받아 명령어를 실행하는 도중에 타임아웃이 걸리지 않도록 하는 방식을 무엇이라 하는가?
•
왼쪽은 상호 배제 조건을 충족하지 않는 경우이다.
◦
잠금이 걸렸는지 검사하는 while(lock==true); 문과 검사한 후 잠금 설정을 하는 lock=true; 문이 분리되어 실행되면, 두 명령어 중간에 타임아웃이 걸려 둘 다 임계구역이 진입하게 된다.
•
오른쪽은 위의 두 명령문을 한꺼번에 실행시켜 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제를 해결할 수 있다.
•
편리하나 성능 좋은 하드웨어가 아니고서야 바쁜 대기를 사용하여 검사하기 때문에 자원 낭비가 있다.
◦
바쁜 대기 : 작업을 할 필요가 없는 시간에도 계속 무한 루프를 돌면서 시스템 자원을 사용하는 것
10. 세마포어의 Semaphore(n)에서 n은 무엇을 가리키는가?
•
임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계구역으로 들어간다.
•
이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다린다.
•
프로세스가 작업을 마치면 세마포어가 다음 프로세스에 임계구역 사용 신호인 동기화 신호를 보낸다.
전역 변수 RS 를 공유 가능한 자원의 수로 초기화한다. RS에는 현재 사용 가능한 자원의 수가 저장
11. 세마포어에서 내부 변수를 RS라고 할 때 세마포어의 P()의 내부 코드를 쓰시오.
•
잠금 수행 코드
•
RS가 0보다 크면(사용 가능 자원 존재) 1만큼 감소시키고, 임계구역 진입
•
RS가 0보다 작으면(사용 가능 자원 없음) 0보다 커질 때까지 대기
if RS>0 then RS=RS-1;
else block();
Java
복사
12. 세마포어에서 내부 변수를 RS라고 할 때 세마포어 V()의 내부 코드를 쓰시오.
•
잠금 해제와 동기화를 같이 수행하는 코드
•
RS 값을 1 증가시키고 세마포어에서 대기중인 프로세스에게 임계구역 진입해도 좋다는 wake_up 신호를 보냄
RS = RS + 1;
wake_up();
Java
복사
추가 내용
•
바쁜 대기 과정이 없음
•
세마포어의 P() , V() 내부 코드가 실행될 땐 검사와 지정을 사용하여 완전히 실행되게끔 해야 함
•
프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우는 당연히 보호 불가이다.
•
P()를 두 번 사용하여 wake_up신호가 발생하지 않은 경우 프로세스 간의 동기화가 이루어지지 않아 세마포어 큐에서 대기하고 있는 프로세스들이 무한 대기에 빠진다.
•
P()와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우로 임계구역을 보호할 수 없다.
예시 - 예금 사라진 문제 해결
1.
공유 자원은 예금 하나이므로 RS 초기값은 1
2.
먼저 도착한 프로세스 P1 이 임계구역 진입, RS 1 감소
3.
나중에 도착한 프로세스 P2는 현재 RS 값이 0이므로 프로세스 P1이 임계구역을 빠져나올 때까지 세마포어 큐에서 대기
4.
프로세스 P1 작업 종료(예금 10만원 → 20만원)
5.
프로세스 P1이 V()를 실행하여 RS 값을 1 증가시키고 wake_up신호를 프로세스 P2에게 보냄
6.
wake_up신호를 받은 프로세스 P2가 작업 시작 후 작업 마무리(예금 20만원 → 25만원)