공유자원과 임계구역

DanChu 🌟·2022년 8월 15일
0

공유 자원 shared resource

여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등이다. 공동으로 이용되기 때문에 프로세스들의 접근 순서를 정하여 예상치 못한 문제가 발생되지 않도록 해야한다.

경쟁조건 race condition

2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황


임계 구역 critical section

multi thread 시스템에서 스레드가 공통의 변수를 바꾸거나 table을 업데이트 하거나 파일에 써서 생기는 코드의 한 부분. 즉, 공유 자원에 접근하는 코드의 영역을 말한다.
따라서 이 영역은 공유자원 접근 순서에 따라 실행 결과가 달라지는 프로그램의 영역이, 프로세스들이 동시에 작업하면 안되는 영역이기도 하다.


임계구역과 관련한 문제

프로세스들이 서로 공유하는 자원을 동시에 변경하여 쓰고 읽는다면 동기화가 제대로 되지 않게 되는 문제를 임계구역 문제라고 한다. 이 문제를 해결하기 위해서는 세가지 조건이 필요하다

1. 상호 배타 Mutual Exclusion

오류를 방지하기 위해 데이터데 대한 업데이트는 한 순간에 오직 한 스레드만 진행할 수 있다.

2. 진행 Progress

문제를 일으키는 스레드들 사이 누가 먼저 우선권을 가지고 자원에 접근하여 작업을 진행할 것인가에 대한 결정이 빠르게 이루어져야 한다. 프로세스의 진행이 다른 프로세스로 인해 방해받지 않아야 한다 (경직된 동기화, lockstep synchronization).

3. 유한 대기 Bounded Waiting

임계 구역에 유한 시간 내 접근을 해야한다는 의미로, 무한시간동안 아무도 접근을 하지 않는 경우 (교착 상태, deadlock)를 만들어서는 안된다.



해결방법


피터슨 알고리즘

  • 프로세스 1은 임계구역 진입 전, 잠금을 한 후 turn을 2로 설정
  • turn은 두 프로세스가 동시에 lock을 설정하여 임계구역에 못 들어가는 상황에 대비하는 장치
  • 임계구역 해결 조건을 모두 만족하지만, 2개의 프로세스만 사용가능하다는 한계 존재

데커 알고리즘

  • 프로세스는 우선 잠금을 걸고, 다른 프로세스의 잠금여부를 확인
  • 다른 프로세스도 잠금을 걸었다면 누가 먼저인지 확인우 임계구역 진입 혹은 대기
  • 임계구역 해결 조건을 모두 만족하지만, 매우 복잡

세마포어

Semaphore(n) : 전역변수 RS를 n으로 초기화 (n = 공유 가능한 자원의 수, RS = 현재 사용 가능한 자원의 수 저장)

P() : 잠금을 수행하는 코드
	- RS가 0보다 크면(사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역 진입
	- RS가 0보다 작으면 (사용 가능한 자원이 없으면) 0보다 커질 때까지 대기 (block())

V() : 잠금 해제와 동기화를 같이 수행하는 코드

	- RS 값을 1 증가시키고 세마포어 큐에서 기다리는 프로세스에게 임계구역에 진입하라는 wake_up 신호 보냄

P()와 V()의 내부 코드는 검사와 지정을 사용하여 분리 실행되지 않고 완전히 실행되게 해야 함
문제점 : 사용자의 잘못된 사용으로 임계구역이 보호받지 못할 수 있음
	- 프로세스가 세마포어를 사용하지 않고 바로 임계구역에 들어간 경우
	- P()를 두 번 사용하여 wake_up 신호가 발생하지 않은 경우 (세마포어 큐의 프로세스들이 무한대기)
	- P()와 V()를 반대로 사용하여 상호 배제가 보장되지 않은 경우
  • 임계구역 진입 전, 스위치를 사용 중으로 놓고 진입
  • 이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 대기
  • 프로세스가 작업을 마치면 세마포어는 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄
  • 임계구역이 잠겼는지 직접 점검하거나, 바쁜 대기를 하거나, - 다른 프로세스에 동기화 메세지를 보낼 필요 없음

모니터

세마포어의 단점을 보완하는 방식으로, 공유자원을 숨기고 공유자원에 접근하기 위한 인터페이스만 제공한다.

  • 공유 자원 사용 시 모든 프로세스가 세마포어 알고리즘을 따를 경우 자동으로 처리
  • 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공함으로써 자원을 보호하고 프로세스간 동기화를 시킴
  • 임계구역에 접근하고자 하는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업 요청
  • 모니터는 요청받은 작업을 모니터 큐에 저장한 후 순서대로 처리하고 그 결과만 해당 프로세스에게 알려줌
  • 모니터는 임계구역 보호와 동기화를 위해 내부적으로 상태 변수(condition variable) 사용
    - wait() : 모니터 큐에서 자신의 차례가 올 때까지 대기, 세마포어의 P()에 해당
    - signal() : 모니터 큐에서 기다리는 다음 프로세스에 순서를 넘겨줌, 세마포어의 V()에 해당



references

0개의 댓글