배경
- 멀티 프로세싱(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 상태로 전환
- 뮤텍스와 같은 원리이며, 유저 모드-커널 모드 차이만 존재한다.
- 유저 모드는 가볍고 빠르지만 프로세스 단위에서만 조작이 가능하다.
출처
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
'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 |