멀티 스레드를 구현하는 3가지 방식 중에서 Context Switching에 대해 알아보겠습니다.
Context Switching은 다른 스레드가 자원을 점유하는 동안
대기하지 않고 하던 일을 마저 하다가 일정 시간 후에 자원 점유 여부를 확인합니다.
이러한 Context Switching을 구현하는 방법은 총 3가지로 구분할 수 있습니다.
1) Thread.Sleep(n)
위와 같이 사용할 수 있으며 이때 n은 0이 아닌 수를 의미합니다.
스레드는 자신의 작업을 계속 수행하다가 n초 후에 자원이 점유되었는지 확인합니다.
자원이 점유되어있다면 자신의 작업을 계속 진행하고
점유되어 있지 않다면 기존의 작업을 RAM에 저장한 뒤 해당 자원의 작업을 수행하게 됩니다.
2) Thread.Sleep(0)
Thread.Sleep(0)은 기존의 Thread.Sleep(n)과는 차이점이 존재합니다.
조건부적으로 자원의 점유 여부를 확인한다는 것이 가장 큰 차이점입니다.
운영체제의 스케줄러가 판단하기에 기존의 자원을 점유하는 스레드의 우선순위가 낮다고 판단하면
기존의 작업을 RAM에 저장한 뒤 해당 자원의 작업을 수행하게 됩니다.
만약 우선순위가 높거나 같다면 자신의 작업을 계속 수행하게 됩니다.
3) Thread.Yield()
Thread.Yield()의 경우도 기존의 Sleep 방식들과 차이점이 존재합니다.
Thread.Sleep(0)이 조건을 따져가며 자원의 점유 여부를 확인한다면
Thread.Yield()의 경우
해당 자원에 대해 실행가능한 다른 스레드가 있다면 자신의 작업을 계속 진행합니다.
반대로 실행가능한 스레드가 없다면 그제서야 자신의 작업을 RAM에 저장하고 해당 자원의 작업을 수행합니다.
- Context Switching의 문제점
ContextSwitching을 수행하는 3가지 방법을 모두 살펴보았습니다.
그런데 3가지 방법에서 모두 드러나는 공통적인 사항이 보입니다.
바로 기존의 작업내용을 RAM에 저장한다는 것입니다.
만일 자원을 점유하는 스레드가 바뀌면 기존의 스레드는 자신이 기존에 수행하던 작업을 이어나가야 합니다.
따라서 기존에 저장된 작업내용을 레지스터가 RAM에서 가져와 스레드에게 전달해야 합니다.
그리고 문제는 바로 이 부분에서 막대한 이동비용이 발생하게 됩니다.
따라서 양보가 빈번할수록 ContextSwichig 방식은 많은 비용문제를 발생시키게 됩니다,
'C#' 카테고리의 다른 글
Lock 구현 훑어내리기 + ReaderWriterLock 기초 (0) | 2024.12.04 |
---|---|
Event를 통한 Lock 구현 (0) | 2024.12.04 |
SpinLock (0) | 2024.12.04 |
DeadLock과 Lock구현 (0) | 2024.12.02 |
Lock 기초 (1) | 2024.12.02 |