해당 글은 기초만 정리한 내용입니다.

Critical Section

Mutex

렉이 하나뿐인 헬스장에 다닌다고 가정하자. 렉을 사용하기 위해서는 카운터에서 키를 받아서 가야한다. 내가 스쿼트를 하려고 하는데 카운터에 키가 있으면 렉이 비어있다는 뜻이고 나는 그 키를 이용해 렉 앞으로 가서 스쿼트를 할 수 있다. 내가 신나게 하체를 조지고 있는데 다른 사람이 데드리프트를 하려고 왔다. 하지만 이 사람은 아무리 데드리프트가 하고 싶어도 키가 없기 때문에 렉을 사용할 수 없다. 이 사람은 내가 스쿼트를 끝내고 나올 때까지 카운터에서 기다려야 한다. 곧이어 다른 사람도 데드리프트가 하고 싶어졌고 이 사람 또한 렉을 사용하기 위해서는 카운터에서 대기해야 한다. 이제 내가 스쿼트를 마치고 카운터에 키를 반납했다. 이제 기다리던 사람들 중 맨 앞에 있던 사람이 키를 받을 수 있고 키를 이용해 렉을 사용할 수 있다.

이것이 뮤텍스가 동작하는 방식이다. 렉을 이용하는 사람은 프로세스 혹은 쓰레드이며 렉을 공유자원, 키는 공유자원에 접근하게 위해 필요한 어떤 오브젝트이다. 즉, 뮤텍스 Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한 프로세스 or 쓰레드 만이 공유자원에 접근할 수 있다.

Semaphore

렉이 여러개 있는 헬스장이다. 카운터에는 현재 사용할 수 있는 렉의 개수를 보여주는 전광판이 있다.

내가 렉을 사용하고 싶다면 카운터에서 사용할 수 있는 개수를 확인하고 1개 이상이라면 사용할 수 있는 개수를 하나 뺀 다음에 렉을 사용해야 한다. 그리고 스쿼트가 끝나면 사용할 수 있는 개수를 하나 더 해준다. 모든 렉에 사람이 있을 경우 사용할 수 있는 개수는 0이 되며 이때 렉을 사용하고 싶은 사람이 있다면 사용할 수 있는 개수가 1로 바뀔 떄까지 기다려야 한다.

이처럼 세마포어는 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성한다.

Mutex와 Semaphore의 차이점

  1. 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
  2. 세마포어는 소유 불가능하지만, 뮤텍스는 소유가 가능하다.
  3. 동기화의 개수가 다르다.

정리