计算机操作系统试验_线程调度的优化与控制
西北工业大学西北工业大学 操作系统实验操作系统实验 实验报告实验报告 一、实验目的一、实验目的 掌握 GeekOS 系统的线程调度算法以及线程同步与互斥方法, 实现线程调度 的优化与控制。 二、实验要求二、实验要求 1. 按照实验讲义 P146 页中的设计要求,增加线程调度算法的选择策略,使 系统可以在时间片轮转调度和四级反馈队列调度之间切换, 并且实现四级反馈队 列调度算法,给出关键函数的代码以及实验结果。 2. 在 GeekOS 中实现信号量,使用信号量保证用户程序运行时的线程同步, 给出关键函数的代码以及实验结果。 三、实验过程及结果三、实验过程及结果 答: 1 1、进程间的调度实现:、进程间的调度实现: Get_Next_RunnableGet_Next_Runnable代码如下:代码如下: struct Kernel_Thread* Get_Next_Runnable(void) { struct Kernel_Thread* best = 0; int i, best_index_queue = -1; if (g_schedulingPolicy == ROUND_ROBIN) { struct Kernel_Thread* best_in_queue = NULL; for (i = 0; i priority best-priority) { best = best_in_queue; best_index_queue = i; } } -1- } } } else if (g_schedulingPolicy == MULTILEVEL_FEEDBACK) { if ( g_currentThread-priority != PRIORITY_IDLE ){ if ( g_currentThread-blocked } for (i = 0; i currentReadyQueue currentReadyQueue++; } KASSERT(best != NULL); Remove_Thread( return best; 结果如图: -2- 2 2、信号量操作、信号量操作 P P、、V V 操作代码如下:操作代码如下: i int P(int sid) { if(!validateSID(sid)){ return EINVALID; } bool atomic = Begin_Int_Atomic(); if(g_Semaphores[sid].resources == 0){ Wait( KASSERT(g_Semaphores[sid].resources == 1); } KASSERT(0 g_Semaphores[sid].resources); g_Semaphores[sid].resources--; End_Int_Atomic(atomic); return 0; } int V(sid) { if(!validateSID(sid)){ return EINVALID; } bool atomic = Begin_Int_Atomic(); g_Semaphores[sid].resources++; if(g_Semaphores[sid].resources == 1){ Wake_Up_One( -3- } End_Int_Atomic(atomic); return 0; } 修改后的修改后的 Ping.cPing.c 代码如下:代码如下: #include #include #include #include #include int main(int argc , char ** argv) { int i,j ;/* loop index */ int scr_sem;/* id of screen semaphore */ int time;/* current and start time */ int ping,pong; /* id of semaphores to sync processes b scr_sem = Create_Semaphore (“screen“ , 1) ;/* register for screen use */ ping = Create_Semaphore (“ping“ , 1) ; pong = Create_Semaphore (“pong“ , 0) ; for (i=0; i 5; i++) { P(pong); for (j=0; j 35; j++); time = Get_Time_Of_Day() - time; P(src_sem); Print(“Process Ping is done at time: %d\n“,time); V(src_sem); V(ping); } time = Get_Time_Of_Day() - time; P (scr_sem) ; Print (“Process Ping is done at time: %d\n“, time) ; V(scr_sem); Destroy_Semaphore(pong); Destroy_Semaphore(ping); Destroy_Semaphore(scr_sem); return (0); } 修改后的修改后的 Pong.cPong.c 代码如下:代码如下: #include #include -4- #include #include #include int main(int argc , char ** argv) { int i,j ;/* loop index */ int scr_sem;/* id of screen semaphore */ int time;/* current and start time */ int ping,pong; /* id of semaphores to sync processes b scr_sem = Create_Semaphore (“screen“ , 1) ;/* register for screen use */ ping = Create_Semaphore (“ping“ , 1) ; pong = Create_Semaphore (“pong“ , 0) ; for (i=0; i 5; i++) { P(ping); for (j=0; j 35; j++); time = Get_Time_Of_Day() - time; P(src_sem); Print(“Process Pong is done at time : %d\n“,time); V(src_sem); V(pong); } time = Get_Time_Of_Day() - time; P (scr_sem) ; Print (“Process Pong is done at time: %d\n“, time) ; V(scr_sem); return (0); } 结果如图: -5- 四、实验分析四、实验分析 1.调度: M