'운영체제 / 커널/과제, 실습'에 해당되는 글 1건

  1. 2013.06.17 1

1

 

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’룰 찾는 방법은 다양하다.

어느 알고리즘은 ThreadProcessPriority 를 기반으로 가장 중요한 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

이용하여 다중 LineThread 내부 코드를 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이 모두 소모되기 이전에 현재의 프로세스를 낮은 우선순위의 큐로 이동시킨다.

 

 

 

 

 

Posted by 하늘_