블로그 이미지
LanSaid

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Recent Post

Recent Comment

Recent Trackback

Archive

2012. 4. 6. 14:17 Study/운영체제
세마 포어를 공부하면서 느낀 점은.. 확 와닿지 않는다는 것이었다.
물론 개념적으로는 상호배제를 위하여 p와 v를 도입하여 이 동작에 의해 자원 점유를 제어한다는 것이지만
말이야 쉽지 구체적으로 어떤식으로 돌아가는지 감이 안잡히기 때문이다.

이 때문에 이와 관련한 자료를 수집하면서 좀더 확실한 개념을 잡고자 한다.

참고 자료 : http://ko.wikipedia.org/wiki/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4 위키 백과

* 세마포어란?
세마포어
(Semaphore)는 에츠허르 데이크스트라가 고안한, 두 개의 원자적 함수로 조작되는 정수 변수로서, 멀티프로그래밍 환경에서 공유 자원에 대한 접근을 제한하는 방법으로 사용된다. 이는 철학자들의 만찬 문제의 고전적인 해법이지만 모든 교착 상태를 해결하지는 못한다.


구성

세마포어 S는 정수값을 가지는 변수이며, 다음과 같이 P와 V라는 명령에 의해서만 접근할 수 있다. (P와 V는 각각 test와 increment를 뜻하는 네덜란드어 ProberenVerhogen의 머릿글자를 딴 것이다.)

P는 임계 구역에 들어가기 전에 수행되고, V는 임계 구역에서 나올 때 수행된다. 이때 변수 값을 수정하는 연산은 모두 원자성을 만족해야 한다. 다시 말해, 한 프로세스(또는 스레드)에서 세마포어 값을 변경하는 동안 다른 프로세스가 동시에 이 값을 변경해서는 안 된다.

[편집] 적용

[편집] 방법 1

최초 제시된 방법은 바쁜 대기(busy waiting)을 이용한 방법이다.

 P(S) {
     while S <=0
         ; // 아무 것도 하지 않음 (반복문)
     S--;
 }
 
 V(S) {
     S++;
 }

이 방법은 임계 구역에 들어갈 수 있을 때까지 빈 반복문을 수행하기 때문에, 단일처리기 다중프로세스 환경에서 처리기 효율이 떨어진다. 또한 대기 중인 프로세스들 중 어느 것을 먼저 임계 구역에 진입시킬지를 결정할 수 없다.

[편집] 방법 2

최초 방법의 단점을 보완한 방법으로서 재움 큐를 활용하여 프로세스를 재우는 방식이다.

 P(S) {
     S--;
     if S < 0
         // 이 프로세스를 재움 큐에 추가 (잠 듦)
 }
 
 V(S) {
     S++;
     if S <= 0
         // 재움 큐로부터 프로세스를 제거 (깨어남)
 }

[편집] 종류

[편집] 계수 세마포어

계수 세마포어(counting semaphore)에서는 초기값은 가능한 자원의 수로 정해지며, 세마포어 값의 범위는 정해져 있지 않다.

[편집] 이진 세마포어

이진 세마포어(binary semaphore)에서는 세마포어 값으로 0 또는 1을 가진다. 계수 세마포어보다 간단히 구현할 수 있으며, Test and Set 등 하드웨어가 지원하는 기능을 이용하여 구현하기도 한다. 또한, 이진 세마포어를 이용하여 계수 세마포어를 구현할 수도 있다.

[편집] 약점

  • P함수와 V함수의 동작은 독립적이기 때문에 잘못 사용하는 경우, 문제가 발생한다.
    • P - 임계 구역 - P : 현재 프로세스가 임계 구역에서 빠져나갈 수 없게 된다. 또한 다른 프로세스들은 임계 구역에 들어갈 수 없으므로 교착 상태(Deadlock)가 발생한다.
    • V - 임계 구역 - P : 2개 이상의 프로세스가 동시에 임계구역에 들어갈 수 있으므로 상호 배제(Mutual Exclusion)를 보장할 수 없게 된다.
  • 고급 언어에서 동기화를 제공해야 한다.

[편집] 참고

세마포어(semaphore)의 원래 뜻은 기차 등에서 사용하는 '까치발 신호기'이다.


* 원자성

원자성(atomicity)은 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다. 어떤 것이 원자성을 가지고 있다면 원자적(atomic)이라고 한다. 어떠한 작업이 실행될때 언제나 완전하게 진행되어 종료되거나, 그럴 수 없는 경우 실행을 하지 않는 경우를 말한다. 원자성을 가지는 작업은 실행되어 진행되다가 종료하지 않고 중간에서 멈추는 경우는 있을 수 없다.

기계어 수준의 실행 명령어들은 각각 원자성을 가지고 있다. 예를 들어, ADD와 LOAD의 명령어 자체는 각각 원자적이므로 ADD, LOAD의 각각의 명령어 단위는 실행하는 도중에는 인터럽트 등에 의해 중단될 수 없다. 반면, ADD와 LOAD각각의 명령어 자체만이 원자적이므로 ADD 명령어를 끝낸 후와 LOAD명령어를 실행하기 전 그 사이에는 인터럽트가 걸릴 수 있다.

세마포어를 찾다가 나온 개념이다.  병행 프로세스의 상호배제를 배우다보면 언제나 프로세스나 스레드의 일시정지를 두고 이야기한다. 허나 이 원자성을 보유한 작업은 일시중지라는 개념이 없고 오로지 실행 가능,불가능 만 가능하다는 것이 특징이다. 
이는 어찌보면 강제적으로 자원을 점유하여 작업을 처리하는 방식이 아닐까 라고 의문점을 가져본다.

posted by LanSaid