본문 바로가기

23년 1학기 학교공부/운영체제및실습

[OS] Semaphore

목차

    728x90
    반응형
    SMALL

    📁 Semaphore

    testset 함수를 사용하는 하드웨어 방법의 단점을 극복하는 또 다른 하드웨어 지원 방법.

    semaphore는 음수, 0, 양수가 될 수 있는 만들어진 특별한 변수이다.

     

    semaphore 변수의 값을 증가시키는 함수와 감소시키는 함수가 운영체제 내에 미리 구현되어 있어서, 이들을 불러 값을 변경한다.

    semWait(s) : semaphore 값을 1 감소시킴. P(s), Wait(s), donw(s)라고도 부름.

    semSignal(s) : semaphore 값을 1 증가시킴. V(s), Signal(s), up(s), sem_post(s)라고도 부름.

    이때 s는 프로그래머가 선언한 세마포어 이름.

    testset과 같이 하드웨어 지원을 받는 특별한 함수이며, 즉 automic하게 실행되는 함수이다.

    semWait나 semSignal을 실행하는 동안에는 interrupt를 비활성화한다.

     

    semaphore란, 변수 값 자체가 저장되는 곳과 semaphore 자신의 block queue가 함께 있는 특별한 변수

     

    📁 testset과 semaphore의 차이점

    testset의 단점은 busy waiting을 한다는 것이었다. 이를 개선한 방법이 바로 semaphore이다.

    semaphore는 critical section으로 진입할 수 없을 때, 바깥에서 busy waiting하며 진입 가능 여부를 계속 체크하지 않고, 바로 프로세스가 cpu를 놓고 block상태로 바꾼다.

    특별한 점은, semaphore에서 일반 프로그래머가 위와 같은 상황에서 바로 cpu를 놓고 blcok 상태로 만들도록 코딩하는 것이 아니라, 운영체제가 알아서 cpu를 다른 프로세스에게 주고 block상태로 만드는 것이다.

     

    📁 Semaphore의 장점

    1. semaphore를 쓰게 되면 cpu가 담장 밖에서 기다리는 동안 쓸데없이 조건문을 체크하는 일에 쓰이며 낭비되지 않고, 다른 프로세스가 더 유용한 목적으로 일하는데 쓰이기 때문에 컴퓨터 효율이 좋아진다.

    2. critical section probelm이 가져야할 세가지 요구사항을 모두 만족한다.

     

    📁 semWait(s), semSignal(s)

     

    두 함수의 특징은 automic operation. interrupt가 걸린다 하더라도 함수를 끝낸 후에야 처리한다.

    먼저 semWait(s)는 다음과 같다.

    변수 s을 1 감소시킨 후, 0보다 작은지 검사한다.

    만약 0보다 크거나 같다면 함수를 바로 끝내지만, 0보다 작다면 남아있는 컴퓨팅 자원이 없다는 뜻이므로 운영체제는 이 프로세스를 semaphore에 달린 queue에 집어넣고 block상태로 바꾼다.

    이후 cpu는 스케쥴러에 의해 다른 프로세서에게 주어지므로 cpu의 활용성이 좋아진다.

     

    예를 들어 p1, p2, p3 프로세서가 있다고 하자. p1 프로세서가 먼저 시작하여 semWait 함수에서 semaphore 변수를 0으로 만들고 critical section에 들어갔다. 그러다 critical section을 전부 수행하지 못하고 p2로 context change가 되면, 이때 semWait에서 semaphore 변수의 값은 -1이 되고 p2는 슬립상태가 된다. 이후 p3으로 context change가 되면 semWait에서 semaphore 변수의 값은 -2이 되고 p3은 슬립상태가 된다.

    위 예시를 확인해 보면 semaphore 변수의 값은 그 semaphore가 나타내는 자원을 차지하기 위해서 기다리는 프로세스의 개수를 음수로 바꾼것과 같다.

     

    semSignal(s)는 다음과 같다.

    변수 s를 1 증가시킨 후 0보다 작거나 같은지 검사한다.

    1을 증가시킨 후에도 0보다 작거나 같다면 연산 전에는 음수였으며 이는 기다리고 있는 프로세스가 있다는 뜻이다. 그 기다리고있는 프로세스는 semaphore에 달린 queue에서 제일 앞에 있는 프로세스이므로 꺼내고 ready상태로 보낸다.

    아래는 Semaphore를 사용한 코드이다.

     

    728x90
    반응형
    LIST