@ 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를 이용하는 상황을 생각할 수 있겠습니다.
.. 이렇게 되면 버그를 작성해도 프로그래머가 찾는 것이 힘듭니다.
.. 이 문제는 어떻게 해결하면 될까요?
.. 이는 다음시간에 살펴보도록 하겠습니다.