바이너리 세마포어가 리소스를 원자적으로 보호할 수 있다면 뮤텍스 잠금의 이점은 무엇입니까?
예를 들어,
sem_init(&sem, 0, 1);
sem_wait(&sem);
critical session;
sem_post(&sem);
세마포어에 비해 뮤텍스의 이점을 명확히 해주세요.
답변1
Robert Love의 "Linux Kernel Development"(3판)에 따르면 뮤텍스는 세마포어보다 새로운 발명품이지만 "인터페이스가 더 간단하고 성능이 더 효율적이며 사용에 대한 추가 제한이 있습니다"(195페이지). 개수가 1인 세마포어와 유사하지만 세마포어처럼 더 높은 개수를 얻는 것은 불가능합니다. 또한 하나의 태스크만 뮤텍스 잠금을 보유할 수 있고, 라커는 뮤텍스 잠금을 잠금 해제만 할 수 있으며(즉, 다른 컨텍스트에서는 잠금을 해제할 수 없음), 재귀 잠금 및 잠금 해제가 금지되고, 뮤텍스 잠금을 보유하는 동안 프로세스가 종료될 수 없습니다. 프로세스에서 뮤텍스 잠금을 획득할 수 없습니다. 인터럽트 핸들러 또는 "하위 절반"은 공식 API를 통해서만 관리할 수 있습니다. 위의 제약 조건 위반을 찾는 데 도움이 되는 디버그 모드도 있습니다.
위의 제한 사항 중 하나가 문제가 되지 않는 한 기본적으로 뮤텍스를 사용할 것을 권장합니다. 특히 긴 잠금 시간과 잠금이 유지되는 동안 잠자기 상태여야 하는 항목에는 뮤텍스가 선호됩니다. (읽을 가치가 있는 뮤텍스 및 스핀록에 관한 관련 토론도 있습니다.)
답변2
뮤텍스의 경우 뮤텍스를 잠근 스레드만 뮤텍스를 잠금 해제할 수 있습니다. 그러나 모든 스레드는 세마포어를 늘리거나 줄일 수 있습니다.