Mutex와 Semaphore
멀티 프로세스, 멀티 스레드 시스템에서 공유자원에 대한 동시 간섭을 막기위한 동기화 방법 중 유저모드 동기화, 커널모드 동기화가 있다. 유저모드동기화에는 Critical Section, 커널모드동기화에는 Mutex, Semaphore가 있다.
Context-switching이란? 하나의 프로세스가 CPU를 사용중 인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전 프로세스의 상태를 Context에 보관하고, 새로운 프로세스의 상태를 적재하는 작업을 말한다. Context는 PCB에 기록되어 있다.
Critical Section(임계 영역)
멀티 프로세스의 각 프로세스가 데이터를 공유하며 수행될 때, 동시 접근 가능한 프로그램 코드영역을 말한다. 이 공유자원의 독점사용을 제공하는 역할을 한다.
전역변수를 이용한 thread간의 데이터를 공유하고자할때 쓰이는 방법이 Critical Section을 사용하는 것이다.
동일 프로세스 내의 스레드 사이에서만
커널 모드 객체(Mutex, Semaphore)보다 가볍고, 빠르다.
먼저 접근한 Thread는 LOCK을 획득하고, 그 이후 접근하는 Thread는 대기한다. 일을 마치면 LOCK을 해제하고, 다른 Thread가 접근할 수 있게 된다.
이때 작업 Thread 교환에 따른 Context switching비용이 따르게 되고, LOCK가 해제되어 대기중이던 Thread가 깨어나면 Context switching이 일어나게 된다.
선점한 Thread를 기다리는 시간이 길지 않다면 이런 switching비용은 불필요하기 때문에 생긴것이 스핀락이다.
스핀락이란? Critical Section에 진입하지 못한 Thread가 대기모드로 들어가는 대신, 진입이 가능할 때까지 계속 무한루프를 돌며 Busy-waiting 상태로 만들어 LOCK을 얻을 수 있을 때까지 재시도하는 방식으로 구현된 LOCK를 말한다.\
하지만, 무한루프를 도는 시간이 길어지면 오히려 더 많은 자원을 낭비할 수 있다.
Mutex
공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것이다.
Thread들의 running time이 서로 겹치지 않게, 단독으로 실행되도록 하는 기술이다.
상호간에 asynchronously 작동하는 Thread, process간 통신을 위한 방법이다.
Semaphore
공유된 자원의 데이터를 여러 프로세스가 접근하도록 막는 것.
Thread가 Critical Section에 접근할때, 해당 Thread는 semaphore의 count를 감소시키고, 종료된 후에는 semaphore의 count를 원래대로 증가시킨다.
한정된 수의 사용자만을 지원할 수 있는 공유자원에 대한 접근을 통제하는데 사용된다.
프로세스와 쓰레드
프로세스 - fork()하여 만든 자식 프로세스와 부모 프로세스가 각각 독립적인 메모리공간(data, heap, stack)을 가진다.(운영체제가 보는 일의 단위)
쓰레드 - 다른 메모리공간은 공유하고, stack만 독립적인 공간을 가진다. 이 점이 쓰레드를 더 가볍게 해준다. CPU는 한번에 한가지연산밖에 못하므로 context switching을 해준다. 이때 프로세스는 data,heap,stack을 모두 메모리에 올렸다, 내렸다 하지만 쓰레드는 stack만 올렸다 내렸다를 반복한다. (프로세스가 바라보는 일의 단위)
멀티프로세스 - 서버에서 fork()를 이용하여 프로세스를 여러개 복제한뒤 각각이 클라이언트와 통신하게 하는 방법. 클라이언트가 많아지면 부하가. 걸린다. 그래서 멀티쓰레드가 나왔다.
멀티쓰레드 - 2개의 쓰레드에 의해 동시에 실행되면 안 되는 영역이 존재하는데, 이것을 critical section이라고 한다.
'ALGORITHM' 카테고리의 다른 글
13458_시험감독 (0) | 2018.06.12 |
---|---|
14502_연구소 (0) | 2018.06.12 |
1181_단어정렬 (0) | 2018.05.11 |
10989_수 정렬하기3 (0) | 2018.05.11 |
1427_소트인사이드 (0) | 2018.05.11 |