목록OS (17)
BASIC의 개발 노트
보호되어 있는 글입니다.
지금까지 Lock을 구현하면서 계속 spin에 의존해왔다. 그런데 spin은 CPU를 계속 사용하기 때문에 문제가 될 수 있다. 이 문제를 Yield를 사용해서 해결해보려고 한다. yield라고 하는 것은 자기 자신을 스케쥴링 해서 디스케쥴링하는 System Call이다. spin을 사용한 코드와 비교해봤을 때, 다른 것은 다 똑같은데 spin 대신 yield가 들어갔다는 차이가 있다. 여기서 yield는 flag가 1인데 TestAndSet을 통해 1로 바꾸었을 때 작동한다. 이 yield를 호출하게 되면 Running 상태에서 Ready 상태로 바뀌어버린다. Ready 상태로 바뀌었기 때문에 다른 프로그램이 Running 상태가 될 것이다. 즉 yield를 하게 되면 Context Switching이..
보호되어 있는 글입니다.
현재 우리가 계속해서 주목하고 있는 이슈는 Linked List에서 Lock을 사용 해야 하는데 Node 별로 Lock을 분산 시킬 것이냐 아니면 Lock을 하나만 쓸 것이냐 에 대한 것이다. 병행성을 좋게 하면 성능이 좋을 것이라는 기대를 하면서 Lock을 분산 시켜봤지만 Overhead가 커지면서 성능이 오히려 떨어질 수도 있다는 얘기 까지 했다. 이러한 이슈를 그대로 가지고 Concurrent Queues에 대해서 살펴보자. Concurrent Queues 기본 아이디어는 Lock을 두 개를 사용하고, dummy node라는 것을 사용한다. Lock을 하나만 사용했을 때는 bottle neck이 발생할 수 있기 때문에 head와 tail로 분리한다. dummy node는 꺼내는 것 끼리는 경쟁이 발..
지금까지 Multi Threading 환경을 계속 다뤄왔는데, Multi Threading을 다룰 때 중요한 것이 'thread safe' 문제이다. 즉 Library나 System Call 등을 호출 할 때 각 Thread가 경쟁적으로 호출을 하더라도 Race Condition과 같은 문제가 없어야 한다는 뜻이다. 이를 'MT-safe' 라는 용어를 사용한다. 참고로 Multi Thread가 나오면서 많은 라이브러리들이 MT-safe 하도록 수정하는 과정을 거쳐왔다. 지금부터 우리가 다뤄 볼 자료 구조들에서 Race Condition 뿐만 아니라 Performance에도 신경을 쓰면서 어떻게 MT-safe 하게 만들 수 있는지 살펴보자. Concurrent Counters 그동안 counter를 가지고..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
앞에서 Race Condition을 설명할 때 Thread가 공유 자원을 사용하면서 발생한 문제에 대해서 알아봤다. 문제의 근본적인 원인은 counter를 1 더하는 과정이 기계어로 세 단계로 나뉘는데, 이 세 단계가 atomic 하지 않기 때문에 중간에 interrupt가 걸려서 끊어질 수 있고 그렇게 끊어질 경우 우리가 기대했던 counter 값이 나오지 않는다. 이런 문제를 해결하는 방법은 Lock을 사용하는 것이다. Lock은 한 쪽에서 코드에 진입을 하게 되면 다른 쪽에서 진입하려고 할 때 이를 막고 기다리도록 하는 역할을 한다. 먼저 진입한 쪽을 T1, 나중에 진입한 쪽을 T2 라고 하면 T1이 먼저 Critical Section에 진입하면 T1이 Lock을 얻고 코드를 실행하는 동안 T2는 ..
보호되어 있는 글입니다.
사람이 기계에게 일을 시킬 때 한 가지 일만 시킬 수도 있지만, 여러 가지 일을 시킬 수도 있다. 사람이 원하는 것은 동시에 일을 진행하는 것이고 다행스럽게도 CPU가 굉장히 빠르기 때문에 Concurrent 하게 실행이 가능하다. 다만 일1과 일2가 있을 때 이들이 Switching 되면서 일이 처리되는데 이 과정이 워낙 빠르다 보니 사람이 볼 때는 거의 동시에 일을 하는 것처럼 보인다. 기계의 관점에서 보면 물론 동시에는 아니고 단일 흐름으로 엄청나게 빠르게 흘러간다. 그래서 지금부터 이러한 일들을 처리하는 방법에 대해서 살펴볼 것이다. 가정은 두 가지 일을 사람이 볼 때 기준으로 동시에 처리하고자 한다. 또한 하고자 하는 일은 일1을 시키면 일1이 알아서 일2를 시키고 끝나기를 기다렸다가 일1도 끝..