본문 바로가기

운영체제

[OS] 임계영역(Critical Section), 상호배제(Mutex), 세마포어(Samaphores)

[임계영역(Critical Section)]

임계영역

공유 리소스에 대한 동시 엑세스는 예기치 않거나 잘못된 동작을 발생할 위험이 있다.

이렇게 공유 데이터를 접근하는 코드 부분을 임계영역이라고 한다.

 

임계영역을 충족하는 조건

  • 상호 배제 : 프로세스 A가 ciritical section 부분을 수행 중이면 다른 모든 프로세스들이 사용하면 안된다.
  • Progress : 임계영역을 사용하는 프로세스가 없다면 필요한 프로세스가 사용할 수 있도록 해야한다.
  • 유한대기 : 프로세스가 임계영역에 들어가려고 요청한 후부터 그 요청이 허용되기까지 다른 프로세스들이 임계영역에 들어가는 횟수에는 한계가 있다.

 

[크리티컬 섹션의 독점 사용을 보장하는 매커니즘]

상호배제(Mutex)

쓰레드의 동시 접근을 허용하지 않는다.

임계영역에 들어가기 위해서는 뮤텍스를 가지고 있어야만 들어갈 수 있다. 👉 세마포어의 카운트가 1인 것과 유사하다.

 

세마포어(Semaphores)

접근 순서를 동기화 하는 것이다.

임계영역에 들어가기 전에 P연산을 통해 공유 데이터를 획득하고 자원을 다 사용하고 난 이후 놓아줄때 V연산을 통해 임계영역을 나온다.

임계영역에 접근하려 할 때, 이미 다른 프로세스가 사용중이라면 while문을 돌며 wait상태로 대기한다.

👉 busy wait == spin lock

       (임계영역의 길이가 짧을 때 사용하는 것이 좋다.)

락을 얻지 못하여 자원을 기다리는 동안 해당 프로세스를 sleep 상태로 보낸다.

👉 bolock & wakeup == sleep lock

       (임계영역의 길이가 긴 경우 사용하는 것이 좋다.)

(종류)

Counting sample

    - P호출이 발생할 때마다 세마포어를 1씩 감소시킨다.

    - V호출은 세마포어를 1씩 증가시켜 자원을 Pool로 반납하고 다른 쓰레드가 할당이 가능하도록 알린다.

Binary semaphore(=mutex)

    - 0 또는 1 값만 갖을 수 있는 세마포어

 

[뮤텍스와 세마포어의 차이]

세마포어

일종의 카운터로 critical section에 프로세스가 동시에 N개 접근하여 사용할 수 있다.

    - 카운터 값이 0과 1로만 제한된다면 Binary semaphore, 그 이상이면 Counting semaphore

P연산은 임계영역에 들어가기전에 수행된다. 👉 프로세스 진입 여부를 자원의 갯수를 통해 결정한다.

V연산은 임걔영역에서 나올때 수행된다. 👉 자원 반납을 알림, 대기 중인 프로세스를 깨우는 신호이다.

 

뮤텍스

임계영역을 갖고 있는 쓰레드들의 실행시간이 서로 겹치지 않고 단독적으로 실행되게 하는 기술이다.

해당 영역에 접근을 하기 위해 lock과 unlock을 사용한다.

(lcok)

    - 현재 임계영역에 들어갈 권한을 얻는다.

    - 만약 다른 프로세스가 임계영역을 사용중이라면 종료까지 대기한다. 👉 spin lock

(unlock)

    - 현재 임계영역을 모두 사용했음을 알린다.

    - 대기중인 프로세스가 임계영역에 진입할 수 있다.

사용되는 알고리즘은 데커(Dekker) 알고리즘, 피터슨(Peterson) 알고리즘, 제과점(Bakery) 알고리즘이 있다.

'운영체제' 카테고리의 다른 글

[OS]데드락이란?  (1) 2022.09.01
[OS] 쓰레드와 멀티쓰레드  (0) 2022.08.29
[OS]시스템구조 - 컴퓨터 계층구조  (0) 2020.11.22
[OS]동기식/비동기식  (0) 2020.11.21
[OS]인터럽트(Interrupt)  (0) 2020.11.17