본문 바로가기

Computer Engineering/시스템프로그래밍

[시스템 프로그래밍] Semaphore란??

** 본 게시물은 광운대학교 컴퓨터공학과 김태석 교수님의 시스템 프로그래밍 강의를 참고하여 만들어졌습니다. **



* 목차

- Race Condition이란?


- Critical Section이란?


- Semaphore란?

ㄴ semaphore의 두 가지 연산

ㄴ semaphore case


- 결론




- Race Condition이란?


경쟁 상태(Race Condtion)이란 공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다. 이를 방지하기 위해서는 프로세스 협력 기법이 필요하다.


입출금 예제를 통해, 자료의 일관성에 대해 설명하겠다.


잔고가 105달러일 때, 서로 다른 ATM에서 동시에 남편이 100달러, 아내가 50달러를 출금 했다고 생각해보자.

그럴 경우, 일관성이 유지되는 경우와 아닌 경우로 나뉠 수 있다.


=> 일관성이 유지되는 경우 : 잔고에 남편 또는 아내 중 한 명만이 접근할 수 있도록 한다.

  이 경우, 한 명이 잔고에 접근 -> 잔고 업데이트 -> 대기 중인 또 다른 한 명이 잔고 접근 -> 잔고 업데이트의 과정으로      이루어질 수  있다.

// 공유 자원에 접근을 제한하는 것이 일관성 유지되도록 한다.


=> 일관성이 유지되지 않는 경우 :  잔고에 접근 제한을 두지 않는다면, 잔고에는 100달러만 있는데도 불구하고, 남편과 아내가 각각 100달러, 50달러를 모두 뽑아가는 불상사가 일어난다.


//공유 자원에 접근을 제한하지 않는다면, 위와 같은 문제점 발생



- Critical Section이란?

공유 자원에 접근하는 구역(코드)를 말한다.

공유 자원은 동시에 하나의 process 이상 접근하면 안된다. 


 entry section  // 입장 구역

 critical section // 공유 자원

 exit section // 퇴장 구역




만약, critical section을 사용하고 있는 프로세스가 있다면, 나머지 다른 프로세스들은 critical section을 들어오지 않고,

entry section에서 대기한다.

critical section을 사용하던 프로세스가 exit section을 통해 나가게 되면, 그제서야 다른 process가 critical section으로 들어올 수 있다.



- Semaphore란?


여러 프로세스들이 한정된 수의 자원을 이용할 때, 한정된 수의 프로세스만 이용할 수 있게 하는 방법을 제시하는 개념.
즉, Critical Section에 들어가는 자원을 한정짓는다.

semaphore는 두 가지 연산을 가지고 있다.

=> 공유 자원(shared resource)를 obtain(=acquire)하는 연산 && release하는 연산 

ㄴ obtain(=acquire)하는 과정

1. semaphore의 값이 positive라면, process는 공유 자원을 사용할 수 있다.
   이런 경우에 semaphore value를 1을 감소

2. semaphore의 값이 0이라면,  추가적으로 들어오는 process에 대해서는 1이 될 때까지 대기 시킨다.
    1이상이 된다면, process는 깨어난다.


ㄴ release하는 과정

1. semaphore에 의해 control되는 공유 자원에 대해 process가 exit section로 들어선다면,
   semaphore value를 1 증가시킨다.

2. 만약 다른 잠자고 있는 process가 있다면, process를 깨운다.



semaphore에는 총 3가지 case가 존재한다.



c 코드는 https://blog.naver.com/tacma/20100065245

java 코드는 http://asuraiv.blogspot.com/2017/11/java-2.html 를 참고하시면 좋을 듯합니다. 



- 결론


공유 자원(shared resource)를 Critical Section으로 정의하고, 이를 Semaphore를 통해 관리한다.


그리하여, 여러 process가 공유 자원에 동시에 접근하는 것을 막는다.





< 참고 자료 > 


Race Condition : https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C 

입출금 문제 : https://ko.wikipedia.org/wiki/%EC%9E%85%EC%B6%9C%EA%B8%88_%EB%AC%B8%EC%A0%9C

임계 구역 : https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD





** 제가 잘못 작성한 내용이나 설명을 이렇게 바꾸면 좋겠다 등등 댓글에 달아주시면 감사하겠습니다 **



** 질문은 언제나 환영입니다!!!! **