신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

동기화 하드웨어에서 배웠던 방법은 응용프로그래머가 사용할 수 없는방법이기 때문에 운영체제 설계자들이 임계구역 문제를 해결 할 수 있는 도구를 개발해줍니다. 그 중 가장 간단한 도구가 mutex lock 입니다. 사실 mutex는 mutual exclusion(상호배제)를 축약한 형태의 단어 입니다.


Mutex Lock (뮤텍스 락)

프로세스는 임계구역에 들어가기전에 lock을 획득하고, 나올때는 lock을 반환해야합니다.

mutex lock에서는 available이라는 변수를 가지고, 이 available 변수를 가지고 lock의 가용 여부를 판단합니다.


만약 lock이 가용하다면 acquire()를 호출해서 lock을 획득하고, 다른 프로세스가 접근하지 못하도록 lock은 곧 사용불가가 됩니다.

lock을 반환 할때는 release()를 호출합니다.




함수의 코드를 살펴보면 이전에 배운 test_and_set()과 비슷한 것을 알 수 있습니다.



지금까지 설명한 구현방식의 단점은 Busy Waiting (바쁜 대기)을 해야한다는 것입니다. 임계구역에 들어가기 위해서 계속해서 acquire()를 호출하는 반복문을 실행합니다. lock이 가용해지기를 기다리면서 프로세스가 계속 반복 회전하고 있기 때문에 spinlock이라고 부르기도 합니다. busy waiting은 CPU cycle을 낭비하게 됩니다.


mutex lock이랑 비슷하지만, 보다 정교하게 동기화 할 수 있는 Semaphore에 대해 알아보겠습니다.


Semaphore (세마포어) 

운영체제에서는 종종 카운팅 세마포어, 이진 세마포어를 구분합니다. 여기서 이진 세마포어는 0과 1를 가지고 동작하고, mutex lock과 유사하게 동작합니다.



   



카운팅 세마포어에 대해 알아보겠습니다. 세마포어(S)는 프로세스가 임계구역에 들어가려할때(wait() 호출할때) 값이 감소하고, 임계구역의 작업을 끝내고 lock을 반납할때 (signal() 호출할때) 값이 증가합니다. 만약 세마포어(S)가 0이 된다면 모든 자원들이 프로세스들에의해 모두 사용중이라는것을 나타냅니다. 이후 자원을 사용하려면 세마포어(S)가 0보다 커지기를 기다려야 합니다.





  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기