CS/운영체제9 C#으로 구현한 스핀락 스핀락은 그냥 공회전이라고 생각하면 된다. 특별히 하는건 없지만, 굳이 자원을 소모해가며 스레드의 주도권을 유지하는 것이다. 물론 그렇게 하는 데에는 이유가 있다. 스핀락으로 인한 낭비와 컨텍스트 스위치로 인한 낭비를 비교했을 때 전자가 더 저렴한 경우가 존재하기 때문이다. 예를 들어, 임계 구역에서의 작업이 단시간에 끝나는 경우 모니터락보다 스핀락이 더 효율적일 수 있다. C#에는 이미 내장된 SpinLock 클래스가 존재하지만, 뭐든지 몸소 체득하는 편이 빠르므로 스핀락을 직접 구현해보기로 하였다. 스핀락의 대기는 무한루프로 이루어진다. 따라서 코드를 아래와 같이 작성할 수 있다. class MySpinLock { int flag = 0; //0 = unlocked, 1 = locked public .. 2022. 11. 22. 임계 영역의 문제 해결 (1) 임계 영역의 통제, 즉 임계 영역에 대한 문제를 해결하기 위해서는 아래의 세 요구사항들을 충족시켜야 한다. 1. 상호 배제 (Mutual exclusion) 한 프로세스가 임계 영역에서 실행되고 있다면 다른 프로세스들은 임계 영역에 진입할 수 없다는 뜻이다. 다르게 말하면, 두 개 이상의 프로세스가 동시에 임계 영역에 존재해서는 안 된다는 뜻으로 이는 경쟁 상태(Race condition)를 방지하기 위해, 프로세스의 동기화를 위해 반드시 필요한 기본 조건이다. 2. 진행 (Progress) 임계 영역이 비어 있을 때, 임계 영역에 진입하고자 하는 프로세스가 존재한다면 그 진입은 반드시 이루어져야 한다는 뜻이다. 만약 진입이 영원히 이루어지지 않는다면 다른 프로세스에도 영향을 끼쳐 교착 상태(Deadlo.. 2022. 9. 8. 경쟁 상태와 임계 영역(Critical section) 경쟁 상태에 대해서는 이전 게시글에서도 설명했다. 경쟁 상태(Race condition)의 간단한 예시 전역 변수 count = 5에 대하여 각각의 스레드가 count++, count--를 한 번씩 수행하도록 했다. 그렇다면 두 스레드가 모두 Join되었을 때 count는 5를 그대로 유지하고 있을까? ... 만약 그렇다고 생각했다 sete3683.tistory.com 경쟁 상태는 여러 프로세스(혹은 스레드)가 동시에 공유 자원에 접근하기 때문에 발생한다. 그래서 우리는 공유 자원에 대하여 한 번에 하나의 프로세스만이 이에 접근할 수 있도록 통제해야 하는데, 그러한 통제가 필요한 영역을 임계 영역(Critical section)이라고 부른다. 임계 영역은 입장 영역(Entry section)과 퇴장 영역.. 2022. 9. 6. 경쟁 상태(Race condition)의 간단한 예시 전역 변수 count = 5에 대하여 각각의 스레드가 count++, count--를 한 번씩 수행하도록 했다. 그렇다면 두 스레드가 모두 Join되었을 때 count는 5를 그대로 유지하고 있을까? ... 만약 그렇다고 생각했다면 아래의 설명을 읽어보자. count++는 Low level에서 아래와 같이 동작한다. 그래서 count++를 수행하는 도중에도, 드물긴 하지만 Preemptive 스케쥴러에 의해 Context switch가 발생할 수 있고 이는 count의 일관성을 해치는 결과를 낳는다. 아래는 그 과정이다. 스레드 1에서 count++를 수행하던 도중 Context switch가 발생한 경우다. 원래대로라면 스레드 2는 count = 6을 레지스터로 가져와 연산을 진행했어야 하는데, 문제는.. 2022. 8. 25. FCFS, SJF, SRTF, RR의 계산 및 비교 *Waiting time, Turnaround time의 계산 및 비교입니다. Non-preemptive FCFS (First-Come, First-Served) 가장 간단한 스케쥴링 알고리즘 먼저 도착한 프로세스부터 차례대로 실행 도착 순서에 따라 결과가 달라질 수 있음 Total waiting time : 0 + 7 + 10 + 18 = 35 Avg. waiting time : 35 / 4 = 8.75 Total turnaround time : 8 + 11 + 19 + 23 = 61 Avg. turnaround time : 61 / 4 = 15.25 SJF (Shortest-Job-First) 가장 짧은 CPU Burst time을 가진 프로세스부터 실행 항상 최적의 결과를 도출하며, 이를 증명할 수.. 2022. 8. 23. Context switch란 여러 프로세스들을 동시에 실행(하는 것처럼) 하기 위해 컴퓨터는 그 프로세스들을 번갈아가며 실행하게 되는데, 그 과정에서 일어나는 것이 Context switch이다. Context switch를 직역하면 문맥 교환이라는 뜻이 된다. 즉, Context switch는 프로세스의 문맥(context)인 PCB를 교환(switch)하는 작업이다. PCB의 교환은 Dispatcher에 의해 이루어지고, 아래의 과정을 거친다. 현재 실행중인 프로세스의 PCB를 저장하고, 다음 프로세스의 PCB를 불러온다. PCB에는 다음에 실행될 명령어의 주소(Program counter)를 비롯한 다양한 정보들이 포함되어 있기 때문에 이것을 기억해두지 않으면 다시 처음부터 실행해야 될 수도 있다... 그리고 이로 인한 딜레이.. 2022. 8. 19. 프로세스 상태 전이도 요약 1) new : 프로세스가 생성되고 있는 상태 2) ready : 프로세스가 프로세서에 할당될 수 있고, 할당되기를 기다리는 상태 3) running : 프로세스가 실행되고 있는 상태 4) waiting : 특정 이벤트(I/O 등)의 발생/완료를 기다리는 상태 *특정 이벤트가 선행되어야 CPU를 사용할 수 있다면, CPU는 이를 기다리지 않고 프로세스를 wait queue에 넣어버린다. 바로 ready queue에 넣는 것이 아니다. 넣어봐야 다시 running 상태가 되면 또 이벤트를 기다릴 것이 뻔하니... 5) terminated : 프로세스가 실행을 마친 상태 아래는 queueing이 이루어지는 과정을 묘사한 다이어그램이다. 2022. 8. 19. 멀티스레딩의 장점과 과제 멀티스레딩은 크게 4개의 장점을 가진다. 1. 응답성 (Responsiveness) 싱글스레드로 서버와 클라이언트 간의 통신을 처리하려고 하면 서버는 다수의 통신을 순차적으로 처리하게 된다. 그러나 멀티스레드로 처리한다면 아래 사진처럼 병렬로 처리할 수 있게 된다. 통신이 연결될 때마다 새로운 스레드를 생성하고, 그 스레드에서 통신을 처리하도록 한다. 그러면 뒷 순서의 클라이언트들도 기다릴 필요 없이 빠르게 응답을 받을 수 있다. 응답성이 의미하는 바는 이런 것이다. 2. 자원 공유 (Resource Sharing) 프로세스들 간의 자원 공유는 Shared memory나 Message passing으로 이루어 지는 반면, 스레드 간의 자원 공유는 비교적 간단하다. 위 사진처럼 스레드들은 스택을 제외한 나.. 2022. 8. 13. 이전 1 2 다음