본문 바로가기
CS/운영체제

[OS] 뮤텍스 락과 세마포어

by yoon_seon 2023. 9. 9.

동기화를 하기 위해서 지켜야 하는 3가지 원칙

  • 상호 배제 : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 대기해야함
  • 진행 : 어떤 프로세스라도 임계 구역에 진입하지 않았다면 진입이 가능해야함
  • 유한 대기 : 한 프로세스가 임계 구역에 진입하기 위해 대기하고 있다면 언젠가 진입이 가능해야 함

 

뮤텍스 락 : 상호 배제를 위한 동기화 도구

상호 배제를 위한 동기화 도구로 한번에 하나의 프로세스만 자원에 접근할 수 있도록 하는 락 메커니즘을 제공한다.

뮤텍스 락은 acquire 함수와 release 함수를 사용한다.

  • 자물쇠 잠그기 역할을 하는 acquire 함수
    락을 얻기 위해 호출되며 락을 얻을 때 까지 대기하거나 스핀한다. 락을 획득했다면 임계구역에 진입한다.
    여기서 락을 얻을 때 까지, 반복적으로 자원에 접근이 가능한지 확인하는 것을 바쁜 대기(busy waiting)라고 한다.
  • 자물쇠 열기 역할을 하는 release 함수
    락을 가지고 있는 프로세스가 자원 사용을 완료하고 임계구역을 빠져나올 때, 즉 락을 해제할 때 호출된다.

 

세마포어 : 상호 배제 & 실행 순서 제어를 위한 동기화 도구

뮤텍스락과 달리 세마포어는 여러 프로세스가 동시에 특정 자원에 접근할 수 있는 허용 가능한 개수를 제어하는 데 사용

  • 임계구역에 진입 여부를 알려주는 wait 함수
    wait 함수는 임계구역에 진입할 수 있는 프로세스 개수가 0이하라면 사용할 수 있는 자원이 있는지 반복적으로 확인하고 임계구역에 진입할 수 있는 프로세스 개수가 하나이상이면 세마포어의 값을 1 감소시키고 임계영역에 진입한다.
    임계구역에 진입할 수 있는 프로세스 개수를 확인하는 과정에서 바쁜 대기(busy waiting)가 발생한다.

    wait 함수는 세마포어의 값을 감소시키는 함수로 세마포어의 자원을 사용하려고 할 때 호출된다. 만약 세마포어의 값이 0 이하라면, 프로세스는 대기 상태로 들어가고 해당 세마포어의 값을 1 감소시키고 리소스를 얻을 때까지 대기하게 된다.

  • 임계구역에 진입가능 신호를 주는 signal 함수
    signal 함수는 임계구역에서 작업을 마친 뒤 사용 가능한 공유자원 개수를 1 증가 시키는 함수이다.

    signal 함수는 대기 중인 프로세스 중 하나를 깨우는 데 사용되며 만약 세마포어의 값이 0 이상이면, 대기 중인 스레드 중 하나가 깨어나고 해당 세마포어의 값을 1 증가시키고 세마포어의 리소스에 접근할 수 있게 된다.

 

바쁜 대기(busy waiting)는 반복적으로 자원에 접근이 가능한지 확인하면서 불필요하게 CPU 자원을 낭비할 수 있기 때문에 프로세스 상태 전이 활용으로 문제를 해결할 수 있다.

  • wait 함수에서는 사용할 수 있는 자원이 있는지 반복적으로 자원에 접근이 가능한지 확인하는 것이 아니라 해당 프로세스 PCB를 세마포어 큐에 삽입하고 대기상태로 만든다.
  • signal 함수에서는 세마포어 큐에 있는 프로세스를 제거하고 프로세스를 대기상태에서 준비상태로 만든다.

 

세마포어의 실행 순서 제어

세마포어는 실행 순서 제어를 위한 동기화도 지원한다.

먼저 실행할 프로세스 뒤에 signal 다음에 실행할 프로세스 앞에 wait를 넣어주면 된다.

 

p1 프로세스가 있고 p2프로세스가 있을때 p1이 먼저 실행해야해서 뒤에 signal 함수가 있고 p2 앞에 wait 함수가 있다고 가정할  때

  • p1 → p2 프로세스 순으로 실행되는경우
    p1에는 앞에 wait가 존재하지 않기 때문에 임계구역에서 실행되고 종료하면서 signal 함수를 실행시킨다. p2 프로세스는 signal 함수에서 세마포어의 값을 증가시켰기 때문에 문제없이 진행된다.

  • p2 → p1 프로세스 순으로 실행되는경우
    p2 앞에 wait가 존재하기 때문에 대기한다. 그다음 p1이 실행되고 signal 함수를 실행시키면서 p2 프로세스는 signal 함수에서 세마포어의 값을 증가시켰기 때문에 실행할 수 있다.
    따라서 p2가 먼저 들어왔다고 해도 p1이 먼저 실행되면서 실행 순서 제어가 보장된다.

 

뮤텍스 락과 세마포어의 가장 큰 차이는 관리하는 동기화 대상의 개수 이며 뮤텍스는 동기화 대상이 오직 하나뿐일 때, 세마포어는 동기화 대상이 여러개 일 때 사용한다.


정리

  • 동기화를 하기 위한 3가지 원칙은 상호 배제, 진행, 유한 대기가 있다.
  • 뮤텍스 락은 락을 사용하여 임계 구역에 진입하는 프로세스/스레드를 제어하는 기술이다. 락을 획득한 스레드만이 임계구역에 진입할 수 있으며 다른 스레드는 대기상태에 있거나 스핀할 수 있다.
  • 세마포어는 정수 카운터를 사용하여 프로세스/스레드의 진입을 제어하는 기술이다. 세마포어 값이 양수인 경우 스레드가 진입할 수 있고, 0인 경우 대기하거나 스핀한다.
  • 뮤텍스락과 세마포어의 가장 큰 차이점은 관리하는 동기화 대상의 개수이다. 뮤텍스는 동기화 대상이 오직 하나뿐일 때, 세마포어는 동기화 대상이 여러개일 때 사용한다.
  • 바쁜 대기(busy waiting)란 락을 획득할 때 까지 반복적으로 자원에 접근이 가능한지 확인하는 작업이다.
  • 바쁜 대기는 반복적으로 자원에 접근이 가능한지 확인하면서 CPU 자원을 낭비할 수 있기 때문에 프로세스 상태 전이 활용으로 문제를 해결할 수 있다.
  • 세마포어는 실행 순서 제어를 위한 동기화를 지원한다. 먼저 실행할 프로세스 뒤에 signal함수, 다음에 실행할 프로세스 앞에 wait를 넣어주면 된다.

 

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

[OS] 교착상태와 해결 방법  (0) 2023.09.10
[OS] 조건 변수와 모니터  (0) 2023.09.09
[OS] 프로세스 동기화  (0) 2023.09.09
[OS] 리눅스 스케줄링  (0) 2023.09.08
[OS] CPU 스케줄링 알고리즘  (0) 2023.09.08

댓글