Operating System : 운영체제 (2)

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

(1) Semaphore

@ Instruction Disable과 enable은 너무 강력해서 자주 사용하면 좋지 않습니다.

    // 그래서 다른 Mutual Exclution 매커니즘이 나오는데,

        > 그 중 하나가 Semaphore입니다.

    

@ Semaphore가 무엇인지 개념적으로 먼저 보도록 하겠습니다.

    // 프린터가 있습니다. 이는 Non-preemtive I/O입니다.

        > 한 프린터에 많은 개발자가 몰려있습니다.

            .. 이 때 수플러 설정을 하지 않으면,

            .. 사람들이 프린터 한 내용이 섞여 나오게 됩니다.

        > 그래서 이제는 매번 경비원(OS)에게 물어보고 프린터방 열쇠를 받은 후에 사용합니다.

            .. Resource Sharing에서 문제가 발생하지 않게됩니다.

    // 위에서의 방법이 바로 Semaphore입니다.

        > 이는 Synchronization을 제공하는 Int 변수라고 말할 수 있습니다.

            .. 열쇠가 있다 1

            .. 열쇠가 없다 0

            

@ 이를 사용자 입장에서 이해할 필요가 있습니다.

    // 이를 알기 위해서는 OS와 대화할 수 있게 하는 API를 알아야 합니다.

        > s는 Semaphore 변수(가드guard)를 의미합니다. (1 or 0)

        > 열쇠 줘 Operation

            .. lock(s)

            .. wait(s)

            ,, P(s)

        > 열쇠 받아 (반납) Operation

            .. unlock(s)

            .. signal(s)

            .. V(s)

    

@ Semaphore의 기본 존재의의는 Synchronization에서 만들어졌지만

    // 이보다 더 많은 것을 제공합니다.

        > Wait, Signal(wait -> Ready)(Control siganal)

            .. Scheduling의 관점

    

@ Semaphore를 이용해서 어떻게 프로그래밍할까요?

    

    

@ 프린터를 두개를 사게 되면 어떻게 될까요?

    // Semaphore가 2 or 1 or 0로 범위가 늘게 되고

        > 이런 Semaphore를 counting Semaphore라고 부릅니다

            .. Resourc가 1개이면 binary Semaphore라고 부릅니다.

    // 초기화는 2입니다.

        > 우리가 먼저 알고 있어야 하는 것은 사용가능한 Resource의 개수입니다.

        

@ Synchronization을 보았던 문제로 다시 돌아와보겠습니다.

    // 버퍼를 사용하는 문제입니다.

        > 

        

@ Semaphore가 Scheduling의 관점에서 사용될 때는 어떻게 하면 될까요?

     

    

    // 이 경우에는 페어로 작성하지 않습니다.

    // 초기값은 0으로 두어야 처음에 Wait상태로 기다릴 수 있게 됩니다.

        > 프로세스들이 컨트롤 당하는 것이 가능합니다.

        

@ Semaphore를 이용해서 프로그래밍하는 복잡한 예시를 보겠습니다.

    // Program Consumer입니다.

    

        > Producer 는 계속 생산하고

        > Consumer 는 소비합니다.

            .. 버퍼가 꽉차거나 빌때 문제가 발생합니다.

        > 이 때 Semaphore를 사용하면 굉장히 간단하게 프로그래밍 할 수 있습니다.

            .. Shared Resource는 Data와 Buffer입니다.

            .. 초기값은 Buf = 1(사용가능), Data = 0

            .. Mutual Exclution과 Scheduling이 절묘하게 어울린 문제입니다.

    // 비슷한 예시로 Dining Philosophers (example)

        > (검색)

        > 각 상태에 있는 사람들은 non determinstic합니다.

        > 데드락 문제도 볼 수 있습니다.

        

@ Disable Interrupt를 사용하게 되면 

    // 상관없는 Resource에 대해서도

        > 다른 Process들이 움직이지 못하게 되는 문제가 생깁니다.

        

@ Semaphore에는 치명적인 단점이 있습니다.

    // Structured Construct

        > 프로그래밍할 때 한 부분이 문제가 생기면

            .. 바로 찾아줍니다.(일반적으로)

            .. 예시로는 {}중 하나가 빠지면 찾아줍니다.

    // 하지만 Unstructured Construct이기에

        > P와 V를 같이 사용하지 않아도 

            .. 컴파일러가 찾아줄 수가 없습니다.

            .. 왜냐하면 프로그램의 상황에 따라 사용되는 Semaphore 변수가 달라질 수 있기 때문입니다.

            .. 예시로는 buff를 이용하는 상황을 생각할 수 있겠습니다.

            .. 이렇게 되면 버그를 작성해도 프로그래머가 찾는 것이 힘듭니다.

            .. 이 문제는 어떻게 해결하면 될까요?

            .. 이는 다음시간에 살펴보도록 하겠습니다.

  • 봤어요 (0명)

댓글

댓글 본문
graphittie 자세히 보기