본문 바로가기

컴퓨터 공학/운영체제

[Nachos] 1. KThread.join() 구현

[Nachos] 1. KThread.join() 구현

 

1. 문제제기

a) 목표

Nachos 소스코드에 아직 불완전하게 정의되어 있는 KThread 클래스에 join 기능을 추가하여, 여러 개의 스레드를 동시에 작동시킬 때Serialize(직렬화)를 가능하게 하게한다.

 

b) 상황

현재 KThread에는 Join 기능이 구현되어 있지 않다. 따라서 먼저 job을 실행한 스레드가 나중에 job을 실행한 스레드 보다 일찍 끝난다는 보장이 없다. 때문에 어떤 한 스레드가 일련의 작업을 수행한 뒤, 그 결과를 바탕으로 다른 작업을 수행해야 한다면 병렬처리를 포기하고 하나의 프로세서로 batch 프로그래밍을 해야 하는 상황이다. 하지만 join기능을 이용하면 병렬처리를 하면서, CPU자원을 최대로 활용하면서 스레드간의 동기화 문제도 처리할 수 있다.

 

 

2. 분석 및 알고리즘

 

a) KThread.join() 코드 분석

 

b)       KThread.finish() 코드 분석

 

 

c)       KThreadTest() 코드분석

 

d) 알고리즘

스레드의 맴버변수로 벡터 타입의 joinedQueue 변수를 선언하고, join을 호출하는 스레드를 벡터의 뒤에 추가하고 호출한 스레드의 상태를 sleep으로 바꾼다. 예를들면, 스레드 A B.join()을 호출하면 스레드 Bjoined_QueueA를 추가하고, Asleep상태로 바꾼다.

이후 B스레드가 주어진 일을 다 하고 finish함수를 호출 할 때, 자신의 joined_Queue에 적혀있던 A를 꺼내서 sleep->ready 상태로 바꾸어주고 자기 자신의 상태를 sleep 바꾼다.

이렇게 하면 병렬처리에서 프로그래머가 busy waiting하지 않고, 스레드간의 실행순서를 정해줄 수 있다.

 

3. 결과 화면

 

a)  Join을 호출하지 않았을 때

아래의 결과처럼 스레드를 포크한 스레드(0번쓰레드가) 먼저 끝났음을 알 수 있다.

 

 

 

 

 

b)  Join을 호출 하였을 때

T1, T2 스레드를 포크시킨 0번 스레드가 T2가 끝날 때까지 sleep상태에 있다가 T2가 종료된 이후, join()뒤에 코드를 실행함을 알 수 있다. join method를 통해 스레드간의 sync를 조율할 수 있음을 확인하였다.

 

 

 

 

 

4. 결론 및 고찰

다중 스레드 작업에서 발생할 수 있는 동기화 문제를 어떻게 효율적으로 해결할 수 있는지를 코드를 작성하면서 느낄 수 있었다. 프로세스의 상태처럼, 스레드에서도 TCB를 통해 관리되는 스레드의 상태가 어떻게 바뀌는 지도 다시한번 눈으로 확인할 수 있었다.

전반적인 Nachos 프로그램의 구조를 잘 몰라서, 자유롭게 코드를 수정할 수 없었고 수많은 security 오류를 만났다. 주말에 Eclips 디버거를 이용하여 전반적인 Nachos의 흐름을, OS의 흐름을 깊게 공부 해야겠다라는 생각이 들었다.

OS의 내부 구조를 볼 수 있고 내가 직접 바꿔볼 수 있어서 꽤 흥미로운 과제였던 것 같다.

 

 

Khread_KThreadTest.zip
0.00MB

KThread 소스코드