본문 바로가기
Lecture/OS

공유 자원과 임계구역

by YUNZEE 2023. 10. 21.
728x90
공유 자원에 대한 접근

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

 

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

 

임계 구역

공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역을 임계구역이라고 한다.

 

예를 들어 주방에서 가스레인지는 공유 할 수 있는 자원이다. 가스레인지는 보통 3~4개의 화구가 있어 한 번에 여러 요리를 할 수 있다. 이에 반해 믹서는 공유할 수 없는 자원으로 주방에 임계 구역이다. 믹서를 사용할 때는 순서를 지켜야 한다. 급하다고 수프에 넣는 쇠고기와 주스에 넣는 오렌지를 같이 갈 수는 없다. 믹서의 경우처럼 예금을 임계 구역으로 지정하면 문제가 발생하지 않는다. 한 프로세스가 임계 구역에 들어간 프로세스가 나와야 밖에 있던 프로세스가 들어갈 수 있다.

 

생산자-소비자 문제

임계 구역과 관련된 관련된 전통적인 문제가 생산자-소비자 문제가 있다. 이 문제에서는 생산자 프로세스와 소비자 프로세스가 서로 독립적으로 작업한다. 예를 들어 생산자는 물건을 계속 생산해서 버퍼에 넣고[input(buf)] 소비자는 버퍼에서 계속 물건을 가져온다. [output(buf)] 작업을 계속하기 위해 버퍼는 원형 버퍼 circular buffer를 사용한다. 또한 버퍼가 비었는지 가득 찼는지 확인하기 위해 전역 변수 sum을 사용하는데, sum에는 현재 버퍼에 있는 상품의 총수가 저장된다.  

생산자-소비자 알고리즘은 생산자와 소비자가 동시에 실행되면 문제가 발생한다. 생산자와 소비자가 전역 변수 sum에 접근하는 타이밍을 서로 맞추지 않았기 때문이다.

 

임계구역은 하드웨어 자원을 사용할 때도 적용되는 개념이다. 예를 들어 프린터 한 대를 여러 명이 동시에 사용하는 경우에 프린터는 임계구역이 된다.

 

임계구역 문제 해결 조건

상호배제 murual exclusion

- 한 프로세스가 임계구역에 드러가면 다른 프로세스는 임계구역에 들어갈 수 없다. 이것이 지켜지지 않으면 임계구역을 설정한 의미가 없다.

한정대기 bounded waiting

- 어떤 프로세스도 임계 구역에 진입하지 못하면 무한 대기 하지 않아야 한다.

진행의 융통성 progress flexibility

- 진행의 융통성은 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다는 것을 의미한다.

 

 임계 구역 문제 해결 방안

- 소프트웨어 임계 구역을 해결하는 방법을 살펴보자. boolean변수는 true와 false값만 가질 수 있으므로 잠금을 표현하기에 적합하다. 하지만 c언어에서는 boolean이 없어 새로 정의했다. 또한 잠금으로 사용할 적역변수 lock과 임계구역에 사용할 변수 balance도 정의했다. 

 

피터슨 알고리즘

임계 구역 문제를 해결하기 위해 게리 피터슨이 제안한 것이다. trun이라는 공유변수를 하나 더 사용한다. 하지만 피터슨 알고리즘의 단점은 2개의 프로세스만 사용 가능하다는 한계가 있다. 여러 프로세스가 하나의 임계구역을 사용하려면 공유 변수를 추가하고 코드를 변경해야 한다.

 

데커 알고리즘

테오도뤼스 데커가 제안한 데커 알고리즘도 임계구역 문제 해결의 세 가지 조건을 모두 만족한다.  데커 알고리즘의 특징은 하드웨어의 도움 없이도 임계구역의 문제를 해결할 수 있다.

 

하지만 앞에 설명한 피터슨 알고리즘과 데커 알고리즘은 임계구역의 문제를 해결해주지만 매우 복잡하다. 프로세스가 늘어나면 변수도 늘어나고 전체 알고리즘이 복잡해진다. 임계 구역을 보호하기 위해 복잡한 알고리즘을 구현하는 것은 바람직한 접근 방법이 아니다.

 

세마포어 알고리즘

이러한 단점을 해결한게 세마포어semaphore이다.  세마모어는 임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 임계 구역으로 들어간다. 이후에 도착하는 프로세스는 앞의 프로세스에 임계구역을 사용하라는 동기화 신호를 보낸다. 세마포어 알고리즘에서는 다른 알고리즘과 달리 임계구역이 잠겼는지 직접 점검하거나, 바쁜 대기를 하거나, 다른 프로세스에 동기화 메시지를 보낼 필요가 없다. 

 

세마포어 알고리즘은 피터슨 알고리즘이나 데커 알고리즘보다 단순하고 사용하기 편리하지만 문제가 없는 것은 아니다. 세마포어의 가장 큰 문제는 잘못된 사용으로 인해 임계구역이 보호받지 못한다는 것이다. 사용자가 고의로 세마포어를 사용하지 않거나 사용 중에 실수를 해서 문제가 생긴 경우를 나타낸다.

 

모니터

해결방안으로 공유 자원을 사용할 때 모든 프로세스가 세마포어 알고리즘을 따른다면 P()와 V()를 사용할 필요 없이 자동으로 처리된다. 이를 실제로 구현한 것은 모니터 monitor다. 모니터는 공유 자원을 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스 간에 동기화시킨다.

 

728x90

'Lecture > OS' 카테고리의 다른 글

교착 상태 해결 방법  (0) 2023.11.06
교착 상태의 개요  (2) 2023.10.31
프로세스 간 통신  (0) 2023.10.20
스케줄링 알고리즘  (2) 2023.10.19
스케줄링의 개요  (0) 2023.10.18