크리티컬섹션, 뮤텍스
Posted 2012. 9. 4. 14:59크리티컬 섹션
크리티컬 섹션 오브젝트를 이용해 임계영역( 접근 제어가 필요한 영역 ) 에 하나의 스레드만 접근 할 수 있도록 하는 동기화 방법
유저레벨의 동기화 방법중 유일하게 커널 객체를 사용하지 않음
내부 구조가 단순하여 동기화 처리에 대한 속도가 빠르다
동일한 프로세스내에서만 사용 가능
커널객체를 사용하지 않기 때문에 핸들을 사용하지 않고 CRITICAL_SECTION이라는 정의를 사용
이미 Lock() 상태인 크리티컬섹션에 대해 다른 쓰레드가 Lock()을 호출하면 크리티컬섹션이 Unlokc() 될때까지 대기하도록 유도하는 구조
따라서 여러개의 스레드가 동기화 하려면 반드시 하나의 크리티컬 섹션을 공유해야 한다.
각 스레드 마다 별도의 크리티컬 섹션을 사용하는 경우 동기화는 불가능 하다.
뮤텍스
두개 이상의 스레드가 동시에 공통자원에 접근하지 않도록 하기 위해서 만들어진 알고리즘
커널 객체중 유일하게 소유권 개념을 가지고 있다.
스레드의 ID가 0( 유효하지 안는 스레드ID ) 면 뮤텍스의 소유권은 어느 스레드에게도 없다는 의미이고 뮤텍스 오브젝트는 시그널 된 상태이다
스레드 ID가 0이 아닌 값이면 해당 쓰레드가 소유권을 가지면 뮤텍스 오브젝트는 non-signal상태다
뮤텍스를 해제할때의 ID와 생성할때 설정한 쓰레드의 ID가 맞지 않으면 해제를 실패하고 시스템은
해당 뮤텍스의 시그널 상태를 기다리는 다른 쓰레드를 스케쥴링 한다
뮤텍스의 소유권을 가진 스레드가 뮤텍스를 해제하지 않고 종료되면 시스템은 해당 뮤텍스를 abandoned 상태로 두고 이 뮤텍스를 기다리는 스레드를 찾아 기다리고 있는 스레드에 뮤텍스의 소유권을 주고 해당 스레드를 스케쥴링 한다
두 가지의 차이
크리티컬 섹션은 단일 프로세스의 스레드에 대해서만 동작하고 뮤텍스는 여러 프로세스의 스레드에 대해서도 동작한다
커널 객체 : 커널( kernel ) 에서 관리되는 객체를 말하며 그 종류는 파일객체, 쓰레드객체, 이벤트 객체, 뮤텍스객체, 세마포어 객체 등이 있다.
특징
접근 하는 방식이 다른 객체와 틀리다. 보통 객체들은 사용자가 직접 접근하여 데이터를 바꾸고 추가하고 지울수 있지만 커널객체는 윈도우즈가 제공하는 특정한 함수를 사용하여야만 가능하다. 외관적으로 보기에는 커널객체는 우리가 생성하는 것처럼 보일 수 있지만 실제로 생성을 하는 것은 커널이다. 우리는 단지 그것을 생성해 달라고 특정한 함수를 이용해 커널에거 요청을 하고 커널은 요청을 받아 그 객체에 대한 메모리 공간을 할당하고 객체를 식별해주는 핸들 이란 것을 우리에게 반환해 준다
커널 객체의 소멸 시점이 틀리다
커널 객체가 아닌 다른 객체의 경우 보통은 객체를 생성한 프로세스가 소멸하면 객체도 같이 소멸하지만 커널객체는 그것을 생성한 프로세스가 소멸한다고 꼭 같이 소멸하는 것이 아니다. 이유는 모든 커널 객체에는 데이터멤버로서 usage count라는 것을 가지고 있는데 이것은 객체가 생성될때 1로 되었다가 다른프로세스들이 그 커널객체의 접근권한을 가지게 될떄 usage count는 1씩 자동적으로 증가하고 접근 권한을 가진 프로세스소멸할떄 usage count는 1씩 자동감소한다. 그래서 커널은 그 커널객체의 usage count가 0이 될떄 객체를 소멸한다
스케쥴링 : 처리할 일들의 진행순서. 즉 우선순위를 정하는 일
'Server' 카테고리의 다른 글
Connection Error] IOCP : GetQueuedCompletionStatus (0) | 2013.10.18 |
---|---|
데드락 (0) | 2012.09.04 |
3way hand shake (0) | 2012.08.13 |
라우팅 (0) | 2012.08.13 |
OS의 종류와 차이점 (0) | 2012.08.13 |
- Filed under : Server