공유 자원과 임계 구역

초보개발·2022년 4월 8일
0

OS

목록 보기
35/38

1. 공유 자원 접근

공유 자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말합니다. 공동으로 사용되기 때문에 언제 데이터를 쓰거나 읽는 것에 따라서 결과 값이 달라질 수 있어 접근 요청한 프로세스들의 순서를 정해 예상하지 못한 결과가 발생하지 않도록 주의해야 합니다.

2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황을 Race Condition 이라고 합니다. 경쟁 조건이 발생하면 공유 자원의 접근 순서에 따라 결과가 달라질 수 있습니다.

2. Critical Section

공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 Critical Section이라고 합니다. 임계구역에서는 프로세스들이 동시에 작업을 할 수 없으며 이미 다른 프로세스가 점유하고 있다면 다른 프로세스는 임계구역 밖에서 그 프로세스가 작업을 마치고 나올 때까지 기다려야 합니다.

3. 생산자-소비자 문제(Producer-consumer problem)

생산자-소비자 문제에서는 생산자 프로세스와 소비자 프로세스가 서로 독립적으로 작업을 합니다.

  • 생산자: input(buf), 계속 물건을 생성해서 버퍼에 가져다 둡니다.
producer() {
	input(buf);
	sum += 1; // (1)
}
  • 소비자: output(buf), 계속 버퍼에서 물건을 가져옵니다.
consumer() {
	output(buf);
	sum -= 1; // (2)
}

만약, 생산자와 소비자가 동시에 실행되면 문제가 발생하게 됩니다. 생산자와 소비자가 전역변수인 sum에 접근하는 타이밍을 서로 맞추지 않았기 때문입니다.

  • 생산자가 물건 하나를 buf 4에 저장했지만 변수 sum을 4로 아직 바꾸지 않았습니다.
  • 소비자가 물건 하나를 가져가지만 변수 sum을 2로 바꾸지 못했습니다.

이 상태에서 (1) 생산자의 sum += 1과 (2) 소비자의 sum -= 1가 거의 동시에 실행되면 문제가 발생합니다. 생산자와 소비자는 독립적으로 실행되므로 상대방이 sum을 바꾸려는 것을 모르고 현재 상태인 sum = 3을 읽어서 작업을 수행하게 됩니다.

미세한 시간 차로 (1), (2)나 (2), (1) 순서로 실행되면 sum은 2나 4가 되어버립니다.

(1), (2) 순서(2), (1) 순서
(1) 생산자 sum = 4(2) 소비자 sum = 2
(2) 소비자 sum = 2(1) 생산자 sum = 4
결과 sum = 2결과 sum = 4

4. 임계구역 해결 방법

  • 상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없습니다. 임계구역 안에는 한 번에 하나의 프로세스만 있어야 합니다.
  • 한정 대기: 특정 프로세스가 임계구역에 진입하지 못하면 안됩니다. 즉, 자원을 사용하지 못하고 무한 대기(infinite postpone)해서는 안됩니다.
  • 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다는 것을 의미합니다.

0개의 댓글