计算机操作系统实验_线程调度的优化与控制_第1页
计算机操作系统实验_线程调度的优化与控制_第2页
计算机操作系统实验_线程调度的优化与控制_第3页
计算机操作系统实验_线程调度的优化与控制_第4页
计算机操作系统实验_线程调度的优化与控制_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西北工业大学 操作系统实验 实验报告 一、实验目的掌握GeekOS系统的线程调度算法以及线程同步与互斥方法,实现线程调度的优化与控制。二、实验要求1. 按照实验讲义P146页中的设计要求,增加线程调度算法的选择策略,使系统可以在时间片轮转调度和四级反馈队列调度之间切换,并且实现四级反馈队列调度算法,给出关键函数的代码以及实验结果。2. 在GeekOS中实现信号量,使用信号量保证用户程序运行时的线程同步,给出关键函数的代码以及实验结果。三、实验过程及结果答:1、进程间的调度实现:Get_Next_Runnable代码如下:struct Kernel_Thread* Get_Next_Runnab

2、le(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 < MAX_QUEUE_LEVEL; i+)best_in_queue = Find_Best(&s_runQueuei);if (best = NULL) best = best_in_queue;best_index_queue = i; else if

3、(best_in_queue != NULL)if (best_in_queue->priority > best->priority) best = best_in_queue;best_index_queue = i; else if (g_schedulingPolicy = MULTILEVEL_FEEDBACK) if ( g_currentThread->priority != PRIORITY_IDLE )if ( g_currentThread->blocked && g_currentThread->currentReady

4、Queue > 0 ) g_currentThread->currentReadyQueue-;for (i = 0; i < MAX_QUEUE_LEVEL; i+)best = Find_Best(&s_runQueuei);best_index_queue = i;if (best != NULL)break;if ( best->currentReadyQueue < MAX_QUEUE_LEVEL-1 )best->currentReadyQueue+;KASSERT(best != NULL);Remove_Thread(&s_r

5、unQueuebest_index_queue, best);return best;结果如图:2、信号量操作P、V操作代码如下:int P(int sid)if(!validateSID(sid)return EINVALID;bool atomic = Begin_Int_Atomic();if(g_Semaphoressid.resources = 0)Wait(&g_Semaphoressid.waitingThreads);KASSERT(g_Semaphoressid.resources = 1);KASSERT(0 < g_Semaphoressid.resourc

6、es);g_Semaphoressid.resources-;End_Int_Atomic(atomic);return 0;int V(sid)if(!validateSID(sid)return EINVALID;bool atomic = Begin_Int_Atomic();g_Semaphoressid.resources+;if(g_Semaphoressid.resources = 1)Wake_Up_One(&g_Semaphoressid.waitingThreads);End_Int_Atomic(atomic);return 0;修改后的Ping.c代码如下:#i

7、nclude <conio.h>#include <process.h>#include <sched.h>#include <sema.h>#include <string.h>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 sy

8、nc processes b & c */ time = Get_Time_Of_Day(); 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 =

9、Get_Time_Of_Day() - time; P(src_sem); Print("Process Ping is done at time: %dn",time); V(src_sem); V(ping); time = Get_Time_Of_Day() - time; P (scr_sem) ; Print ("Process Ping is done at time: %dn", time) ; V(scr_sem); Destroy_Semaphore(pong); Destroy_Semaphore(ping); Destroy_Sem

10、aphore(scr_sem); return (0);修改后的Pong.c代码如下:#include <conio.h>#include <process.h>#include <sched.h>#include <sema.h>#include <string.h>int main(int argc , char * argv)int i,j ; /* loop index */int scr_sem; /* id of screen semaphore */int time; /* current and start time

11、*/int ping,pong;/* id of semaphores to sync processes b & c */time = Get_Time_Of_Day();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(pi

12、ng);for (j=0; j < 35; j+);time = Get_Time_Of_Day() - time;P(src_sem);Print("Process Pong is done at time : %dn",time);V(src_sem);V(pong);time = Get_Time_Of_Day() - time;P (scr_sem) ;Print ("Process Pong is done at time: %dn", time) ;V(scr_sem);return (0);结果如图:四、实验分析1.调度:MLF调度算

13、法的主要思想是系统有多个就绪队列,每个队列对应相应优先级,第一队列的优先级最高,然后优先级逐渐降低。同时给高优先级的任务分配较短的时间片,给低优先级的任务分配较长的时间片。对于同一优先级的任务,采用FCFS调度算法。如果把优先级队列数量降低到一,则MLF算法退化为Round Robin调度算法。MLF调度算法最大的问题是会导致饥饿问题,因为低优先级的任务有可能会长时间得不到执行,所以在实际的操作系统中,调度器会给长时间未执行的任务动态的提高优先级,避免饥饿现象。由实验分析可知,在短作业情况下,mlf调度相较于rr缩短了三分之一的执行时间,优越性明显。2.信号量信号量的目的是保障进程的同步或互斥

14、,若信号量为1,则确保互斥。因为当争抢一个临界资源时,首先获取到信号量的进程会把信号量减少为0,其余进程请求该资源时候必须要等待该进程释放才能获取。如果信号量为0时,则是保障进程的同步。因为当某一个信号量执行到某一步时,该信号量为0,进程阻塞掉,必须要等待其他的进程增加该信号量才能继续执行,从而实现了进程间的同步。五、所遇问题及解决方法经过这次试验,我对操作系统中进程的调度算法和调度过程、尤其是对基于时间片轮转的进程多级反馈算法有了更深的理解,对使用P、V操作来进行进程间的同步与互斥过程也有了更深的体会。实验中,首先就是要求我们实现调度算法的选择策略,使系统可以在时间片轮转调度和四级反馈队列调

15、度之间切换。由于大部分代码老师都已经给出,所以只需实现一个取得下一个运行线程的函数,实现高优先队列为空时继续在低优先级中查找就可以了。代码编写不是很难,只要能基本了解了思想和结构就可以编写。对于实现进程间的同步和互斥,只需要利用P、V操作实现对临界资源的保护即可。虽然在过程中遇到很多困难,但所幸在老师同学们的帮助下,以及自己查资料,还是完成了实验项目。其次,也是同过这几次操作系统实验让我对计算机操作系统学习有了一个新的认识,通过这次实验又一次让理论运用于实践,而实践是需要系统的知识,去分析设计一个完整的东西,因此不仅是某个具体的细节自己要知道,还要了解好全局,一个小问题都有可能使得实验失败。  总之,这次实验让我学习了很多,通过这次实验设计,让我对整个系统有了更深的了解,虽然还有很多地方还没有完全明白,比如说,如何进行进程调度,如何处理中断,如何管理内存,因为后面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论