반응형

배경

멀티 프로세싱(or 멀티 스레딩)으로 공유 자원을 접근하는데서 발생하는 문제를 해결하기 위한 방법.

 

1. n개의 리소스를 가지고 있는 영역에 n개를 초과하는 개수의 프로세스가 접근한다면 문제가 발생할 수 있다.

(ex. 각 프로세스에게 1 리소스를 제공하는 5 리소스를 포함한 공유 자원이 있다

만약 6개의 프로세스가 이 공유 자원에 접근하면 문제 발생)

 

2. 두개 이상의 스레드가 작업을 하는 중, 하나의 공유 데이터에 동시에 접근하게 된다면 문제가 발생할 수 있다.

(ex. 공유 데이터A = 0, 스레드1 = 1증가 작업, 스레드2 = 1감소 작업

스레드1과 스레드2가 한 번씩 A에서 작업을 한다면 A의 값은 0으로 유지되야 한다.

하지만 스레드1, 2가 동시에 A에 접근했다면 A에는 -1 or 1이 저장될 것이다.)

 

위와 같이 공유 자원에 대한 접근 제어 방법으로 사용하는 것이 세마포어와 뮤텍스이다.

 

뮤텍스

공유 자원에 대한 접근을 단 하나의 스레드(or 프로세스)에게만 허용하도록 하는 동기화 방법이다.

  • 뮤텍스 객체에 하나의 스레드가 진입하면, 진입과 동시에 lock(unSignal 상태로 전환)
  • 공유 자원을 모두 사용하고 빠져나갈 때 unlock(Signal 상태로 전환)
  • 따라서 뮤텍스 객체를 lock한 주체와 unlock한 주체가 같다.

세마포어

한정된 공유 자원에 대해 허용 가능한 만큼의 스레드(or 프로세스)에게 권한을 주는 동기화 방법이다.

  • 접근 가능한 스레드 개수 만큼의 count를 가지고 있다.(if count > 0, Signal state)
  • 스레드가 세마포어 객체에 진입하기 위해 wait연산에 들어간다.
  • 만약 세마포어 내부 count가 1 이상이면 해당 스레드가 count를 1 감소시키고 공유 자원을 사용한다.
  • 사용하고 빠져나갈 때 signal 동작으로 count를 다시 1 증가시킨다.
  • count가 1인 세마포어는 뮤텍스와 같은 역할을 한다.

 

뮤텍스와 세마포어는 커널객체를 사용한다.

- 커널 모드에서는 컴퓨터의 모든 공유 자원(CPU, 드라이버, 메모리, etc)을 이용할 수 있기 때문에 서로 다른 프로세스나 서로 다른 프로세스의 스레드끼리 동기화 작업이 가능하다.

 

유저모드의 Critical Section 동기화

- 같은 프로세스 내부의 스레드들을 동기화 할 수 있다.

  • 한 스레드가 임계 영역에 들어가면 unsignal 상태, 나오면 signal 상태로 전환
  • 뮤텍스와 같은 원리이며, 유저 모드-커널 모드 차이만 존재한다.
  • 유저 모드는 가볍고 빠르지만 프로세스 단위에서만 조작이 가능하다. 

 

 

 

 

 

 

출처

worthpreading.tistory.com/90

velog.io/@conatuseus/OS-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AE%A4%ED%85%8D%EC%8A%A4

richong.tistory.com/48

반응형

'IT study > Notebooks' 카테고리의 다른 글

OS - Deadlock  (0) 2021.04.11
OS - Cache(feat. Page 교체)  (0) 2021.04.08
Network - HTTPS(대칭키&비대칭키)  (0) 2021.04.05
OS - Process & Thread  (0) 2021.03.31
Network - API  (0) 2021.03.31

+ Recent posts