윈도우의 프로세스와 스레드 (6)
윈도우의 프로세스와 스레드 (6)
뮤텍스
뮤텍스와 크리티컬 섹션의 가장 큰 차이점은 뮤텍스는 커널객체라는 점입니다.
따라서 크리티컬 섹션이 하나의 스레드의 일정 영역에 한정되었다면 뮤텍스는 그 자체로 하나의 객체로 다루어지기때문에,
다른 스레드가 핸들을 획득하여 접근이 가능합니다.
따라서 크리티컬 섹션과 달리 자원 자체를 다루는것이 하나의 별도 객체로 생성되는 셈입니다.
결국 프로세스나 스레드를 형성하는것과 비슷한 루틴이 작용하는것을 생각해볼수있습니다.
뮤텍스는 cpp 에서 CreateMutex() 함수를 사용하여 생성되는데 이 함수는 매번 생성될때
뮤텍스의 이름을 사용자로 부터 요구합니다.
사용자가 임의로 뮤택스의 이름을 정하는 셈입니다. 이것은 고유한 이름 체계가 사용되기 이전에 제작된 운영체제의 단점이
계승된것입니다. 따라서 어떤 뮤텍스를 생성할때, 혹은 생성된 뮤텍스를 사용할때 같은 문제점이 발생하게 됩니다.
뮤텍스는 이 이름들을 사용하여 핸들을 얻을수있습니다. 따라서 다른 프로세스로 부터 뮤텍스 핸들을 얻기위해서는 이름을 공유해야합니다.
만약 뮤텍스가 공유된다면 많은 작업자 사이에서 뮤텍스이름이 겹칠 가능성이 다분해집니다.
결국 멀티프로세스 프로그램 설계자들은 설계하기전에 뮤텍스 이름에 대해서 나름대로 표준적인 체계를 지정해 줄 필요가있습니다.
뮤텍스는 다음 루틴으로 적용됩니다.
1. 뮤텍스 생성
2. 생성된 뮤텍스로 부터 핸들 획득
3. 핸들 제거
4. 뮤텍스 제거
뮤텍스는 다른 커널 객체와 마찬가지로 상태가 변할떄 자신의 상태를 객체 관리자에게 송신합니다.
따라서 해당 뮤택스가 상태변경 신호를 보냈을떄를 기준으로 다른 작업을 실행하면됩니다.
계속 언급하고 있지만, 상태변화 신호를 보낸다는것은 그만큼 시스템이 느려짐을 의미하게 됩니다.
뮤텍스는 일정 시간이상 반응이 나타나지않으면 프로그램은 뮤텍스를 기다리지않고 독자적으로 다른 작업을 수행할수있습니다.
앞서말한 화장실 대기열같은 경우, 화장실내의 사람이 이상을 감지하는것이 아니라, 이상상태가 존재하면
그것을 외부의 시간으로 부터 감지되며, 객체가 별도의 신호를 관리자에게 보내지않는다면 프로그램이 나름대로 시간을 잰뒤,
문제가 있으면 다음 동작을 취할수있습니다.
따라서 대기열 문제는 뮤텍스의 특성이 아니라 커널 객체이기때문에 동작할수있는 방법론 입니다.
뮤택스는 다른 프로세스에 점유되거나 점유되지않는 두가지 상태를 가지고있습니다.
뮤텍스는 한번에 하나의 스레드만이 사용할수있기때문에 앞에서 언급한 참조숫자가 나타나는것이 아니라
점유/비점유 두가지 상태를 나타낼뿐이며, 뮤텍스는 점유 해제가 일어날경우 객체 관리자에게 자신이
비점유 상태라는것을 알리게 됩니다.
뮤텍스를 사용하고자하는 스레드는 커널관리자에게 뮤텍스가 비점유 상태라는것을 알아낸 이후로 부터 사용이 가능합니다.
Reference
https://karfn84.tistory.com/entry/%ED%8E%8C%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C