1. 과제 주제 (문제 개요)
- 기본적으로 과제를 위한 세팅이 되어있는 (조교가 제공한) GeekOS 에 작업을 한다.
조교님께서 project3.tar.gz 라는 뼈대 프로젝트를 제공해 주셨다.
내부에는 [ elf.c / kthread.c / user.c / userseg.c ] 들에 베이스 코드가 세팅되어있다.
추가로 우리가 앞으로 해야 할 것들(앞으로 코딩해야 할 부분들, 생성해야할 함수 이름들,
파라미터들에 대한 내용들)을 PPT로 제공해 주심으로써 실제로 우리가 해야 할 일은 적다.
- 1. GeekOS 안에 Scheduling 을 구현한다.
총 4 가지 스케줄러를 구현한다. [ Round-Robin, Multilevel Feedback Scheduling, Shortest Job First (Priority based), 그리고 마지막으로 우리 조만의 User made Scheduling algorithm ]
구체적인 요구 함수와 구현을 요구하는 내용은 아래와 같다.
[ kthead.c : 일반적으로 스케줄링 부분에 대한 코딩 ]
1. Extern int g_Quantum 설정된 Quantum 값
2. Int g_scheduleSelector 어떠한 스케줄러가 선택되었는지를 저장하는 변수
3. Int sel_time = 0 스케줄러
4. Find_Best
위에서 언급한 4 가지 스케줄러들은 각자 ‘최적의 Thread’룰 찾는 방법은 다양하다.
어느 알고리즘은 Thread나 Process의 Priority 를 기반으로 가장 중요한 Thread 혹은
Process를 선택한다. / 어느 알고리즘은 Time 시간을 기반으로 가장 최적의 Thread 혹은
Process를 선택한다. 이렇게 각 알고리즘에 맞는 최고의 Thread 를 찾기 위한 함수이다.
그래서 이름이 Find_Best 이다.
5. Get_Next_Runnable( void )
선택된 스케줄링에 대해 처리를 하는 함수. 각각의 스케줄링 케이스에 대해
그에 맞는 Find_Best를 호출하여 최적의 Thread(혹은 Process)를 찾아서 bestQueue 라는
곳에 저장을 하고, 지금 현재 처리한 큐 다음의 Thread 를 받아서 그 새로 받은 Thread
에 대한 또 Get_Next_Runnable 을 처리하기 위해 준비한다.
6. Set_Scheduling_Policy( int policy, int quantum )
선택된 스케줄링에 대해 처리를 하는 함수. Policy 라는 변수로 받은 스케줄링 정책에
대한 Setting 을 담당한다. 실제로 스케줄링에 맞는 처리를 하는 것은 Get_Next_Runnable
이고 이 Sys_Set 부분에서는 단순히 받은 Parameter 값들을 변수에다 세팅해
놓는 것 뿐이다.
- 2. GeekOS 안에 Semaphore 를 구현한다.
Thread들은 멀티 Thread 프로그램의 경우 동시에 Thread 가 돌아가면서 각자의 코드에
(각 Thread 들의 코드에) 서로 영향을 미칠 수 있다. 이를 방지하기 위해 Semaphore를
이용하여 다중 Line의 Thread 내부 코드를 Atomic 하게 묶어서 서로 다른 Thread들의
코드들이 영향을 주지 못하도록 보호한다.
[ syscall.c : 일반적으로 세마포어 부분에 대한 코딩 ]
1. typedef struct Semaphore 세마포어 구조체(type)를 만들어 준다.
2. Is_Thread_In_List 현재 선택된 Thread 가 특정 List 안에 있는가?
3. Is_Thread_List_Empty 현재 선택된 Thread 가 특정 List 안에 없는가?
4. Remove_Thread_List 현재 선택된 Thread 를 특정 List 에서 제거하라.
5. Sys_SetSchedulingPolicy Set_Scheduling_Policy(policy, quantum) 를 호출하라
6. Sys_GetTimeOfDay 현재 시간을 return 하라
7. Sys_CreateSemaphore 세마포어 생성
8. Sys_P 세마포어 -
9. Sys_V 세마포어 +
10. Sys_DestroySemaphore 세마포어 제거
- 3. GeekOS 안에 Timing 을 구현한다.
스케줄링마다 각각 Process (혹은 Thread)들의 각각 다른 대기시간에 따라 다른 총 소요
시간이 도출된다. 이 총 소요 시간을 계산하여 각각의 스케줄링마다의 소요시간을 도출해
내어 그들의 값을 비교하고 어느 상황에서 어느 스케줄링이 알맞는지 선택할 수 있게 한다.
[ timer.c : 일반적으로 타이밍 부분에 대한 코딩 ]
1. Extern int g_scheduleSelector 어떠한 스케줄러가 선택되었는지를 저장하는 변수
2. Int g_Quantum = DEFAULT_MAX_TICKS 설정된 Quantum 값
3. PrintQ(void)
현재의 g_Quantum 값을 알려주는 프린트 함수이다.
4. Timer_Interrupt_Handler
모든 Quantum이 모두 소모되기 이전에 현재의 프로세스를 낮은 우선순위의 큐로 이동시킨다.