院 系:计 算 机 学 院
实验课程:计算机操作系统实验
实验名称:进程调度的设计与实现
指导老师:陈红英
开课时间:2011 ~ 2012年度第 2学期
专 业:网络工程
班 级:10 级5班
学 生:袁沛权
学 号:[1**********]
华南师范大学教务处
实验一 进程调度的设计与实现
一、实验目的
1、综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布尔数 组,非阻塞输入,图形用户界面GUI,进程控制块,进程状态转换,多 级反馈队列进程调度算法。
2、加深理解操作系统进程调度的过程。
3、加深理解多级反馈队列进程调度算法。
二、实验内容与主要设计思想
1、采用一种熟悉的语言,如C、PASCAL或C++等,编制程序。
2、采用多级反馈队列调度算法进行进程调度。
3、每个进程对应一个PCB。在PCB中包括进程标识符pid、进程的状态标识status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。
4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid是在1到100范围内的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。
5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。
6、进程优先级priority是0到49范围内的一个随机整数。
7、进程生命周期life是1到5范围内的一个随机整数。
8、初始化时,创建一个邻接表,包含50个就绪队列,各就绪队列的进程优先级priority分别是0到49。
9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个进程,然后将该PCB插入就绪队列中。按ctrl+q退出进程调度循环。
10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪队列中;否则该进程执行完成,撤消其PCB。以上为一次进程调度循环。
三、需求分析 解决多个进程调度的情况,采用多级反馈队列进程调度算法,实现模拟计算机进程管理系统。无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
四、程序流程图
五、实验测试
开始前:
新建进程:(ctrl+f)
开始调度:
停止调度/清空数据:(ctrl+f)
六、实验心得
本次实验主要是利用MFC图形界面来显示进程调度的功能。在这次实验中,我在同一工作区中创建了两个工程,主要是分别用于进程PCB的创建与执行,以及进程调度和实现图形界面。本次实验的算法理解不难,但是因为对于C++系统函数和图形界面设计的不熟悉,导致在设计程序的过程中遇到了很多的困难。
本次实验的难点主要是在于如何将进程调度可视化,即使用MFC界面来显示进程调度的过程,以及如何将进程调度的算法转化为代码。为了解决上述的问题,我通过查阅资料,知道了实现进程调度的方法有多种,而本次实验我只选择了其中一种比较容易理解的。
其实该程序的功能是可以进一步完善的,例如增加暂停功能,改善图形界面使其更便于用户的使用等。
在这次程序设计中,我开始遇到了不少的问题,如Sleep()休眠函数会与pDC->TestOut()发生冲突,可是我又必须需要停顿的效果,所以后来发现了2种解决方法,第一种是为避免最后一个显示与Sleep()冲突,在最后一个显示后面加多一个空显示,其用途是与Sleep()冲突,以保证前面的显示可以正常;第二种解决方法是用setTimer()函数,不过由于百度的内容看不懂,所以借了一本书看,发现这个函数还是很好用的。
另外,我不知道如何修改MFC窗口的标题栏,找了一下资料,发现那个标题的修改分前后2部分,第一部分需要可以重载文档类的虚函数SetTitle(),在函数里调用CDocument::SetTitle(L"你的标题")即可;而第二部分需要将资源文件中的IDR_MAINFRAME修改。
还有一个问题,就是不知道如何添加快捷键,之前以为是在菜单栏直接添加即可,发现并不是这样的。经过问舍友,还是知道了怎么添加。首先,在建立类向导里面的Class name找到View,然后,在Messages里找到PreTranslateMessage,然后添加function,进入函数里面,调用pMsg->message==WM_KEYDOWN,即可用case选择相应的快捷键,然后可以添加响应。
通过此次实验,使我加深理解操作系统进程调度的过程和多级反馈队列进程调度算法,也使我的编程能力有了一定的提高。
院 系:计 算 机 学 院
实验课程:计算机操作系统实验
实验名称:进程调度的设计与实现
指导老师:陈红英
开课时间:2011 ~ 2012年度第 2学期
专 业:网络工程
班 级:10 级5班
学 生:袁沛权
学 号:[1**********]
华南师范大学教务处
实验一 进程调度的设计与实现
一、实验目的
1、综合应用下列知识点设计并实现操作系统的进程调度:邻接表,布尔数 组,非阻塞输入,图形用户界面GUI,进程控制块,进程状态转换,多 级反馈队列进程调度算法。
2、加深理解操作系统进程调度的过程。
3、加深理解多级反馈队列进程调度算法。
二、实验内容与主要设计思想
1、采用一种熟悉的语言,如C、PASCAL或C++等,编制程序。
2、采用多级反馈队列调度算法进行进程调度。
3、每个进程对应一个PCB。在PCB中包括进程标识符pid、进程的状态标识status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。
4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid是在1到100范围内的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程标识号是空闲的,“假”表示下标对应的进程标识号已分配给某个进程。
5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。
6、进程优先级priority是0到49范围内的一个随机整数。
7、进程生命周期life是1到5范围内的一个随机整数。
8、初始化时,创建一个邻接表,包含50个就绪队列,各就绪队列的进程优先级priority分别是0到49。
9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个进程,然后将该PCB插入就绪队列中。按ctrl+q退出进程调度循环。
10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪队列中;否则该进程执行完成,撤消其PCB。以上为一次进程调度循环。
三、需求分析 解决多个进程调度的情况,采用多级反馈队列进程调度算法,实现模拟计算机进程管理系统。无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。
四、程序流程图
五、实验测试
开始前:
新建进程:(ctrl+f)
开始调度:
停止调度/清空数据:(ctrl+f)
六、实验心得
本次实验主要是利用MFC图形界面来显示进程调度的功能。在这次实验中,我在同一工作区中创建了两个工程,主要是分别用于进程PCB的创建与执行,以及进程调度和实现图形界面。本次实验的算法理解不难,但是因为对于C++系统函数和图形界面设计的不熟悉,导致在设计程序的过程中遇到了很多的困难。
本次实验的难点主要是在于如何将进程调度可视化,即使用MFC界面来显示进程调度的过程,以及如何将进程调度的算法转化为代码。为了解决上述的问题,我通过查阅资料,知道了实现进程调度的方法有多种,而本次实验我只选择了其中一种比较容易理解的。
其实该程序的功能是可以进一步完善的,例如增加暂停功能,改善图形界面使其更便于用户的使用等。
在这次程序设计中,我开始遇到了不少的问题,如Sleep()休眠函数会与pDC->TestOut()发生冲突,可是我又必须需要停顿的效果,所以后来发现了2种解决方法,第一种是为避免最后一个显示与Sleep()冲突,在最后一个显示后面加多一个空显示,其用途是与Sleep()冲突,以保证前面的显示可以正常;第二种解决方法是用setTimer()函数,不过由于百度的内容看不懂,所以借了一本书看,发现这个函数还是很好用的。
另外,我不知道如何修改MFC窗口的标题栏,找了一下资料,发现那个标题的修改分前后2部分,第一部分需要可以重载文档类的虚函数SetTitle(),在函数里调用CDocument::SetTitle(L"你的标题")即可;而第二部分需要将资源文件中的IDR_MAINFRAME修改。
还有一个问题,就是不知道如何添加快捷键,之前以为是在菜单栏直接添加即可,发现并不是这样的。经过问舍友,还是知道了怎么添加。首先,在建立类向导里面的Class name找到View,然后,在Messages里找到PreTranslateMessage,然后添加function,进入函数里面,调用pMsg->message==WM_KEYDOWN,即可用case选择相应的快捷键,然后可以添加响应。
通过此次实验,使我加深理解操作系统进程调度的过程和多级反馈队列进程调度算法,也使我的编程能力有了一定的提高。