计算机操作系统进程调度实验报告.docx
- 文档编号:27363499
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:12
- 大小:630.07KB
计算机操作系统进程调度实验报告.docx
《计算机操作系统进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《计算机操作系统进程调度实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
计算机操作系统进程调度实验报告
操
作
系
统
实
验
报
告
姓名:
王宇菲
学号:
1228524012
操作系统实验报告
2014年12月03日
学号
1228524012
姓名
王宇菲
时间
2014.12.03
专业
Java
班级
2012级
实验题目:
进程调度实验
实验目的:
本实验要求采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法编写和调试一个简单的进程调度程序。
通过本实验可以加深理解有关进程控制块、进程队列的概念。
实验内容与步骤:
一、实验内容
进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、需要运行时间。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
二、实验算法流程
三、源程序
#include"stdio.h"
#include
#definegetpch(type)(type*)malloc(sizeof(type))
structpcb{//定义进程控制块
charname[10];
charstate;
intsuper;
intntime;
intrtime;
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
sort()
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->super)>(ready->super)))
{
p->link=ready;
ready=p;
}
else
{
first=ready;
second=first->link;
while(second!
=NULL)
{
if((p->super)>(second->super))
{
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;
}
}
input()
{
inti,num;
printf("\n请输入进程个数:
");
scanf("%d",&num);
for(i=0;i { printf("\n进程号No.%d: \n",i); p=getpch(PCB); printf("\n输入进程名: "); scanf("%s",p->name); printf("\n输入进程优先数: "); scanf("%d",&p->super); printf("\n输入进程运行时间: "); scanf("%d",&p->ntime); printf("\n"); p->rtime=0;p->state='w'; p->link=NULL; sort();//将进程p插入就绪队列ready中 } } //获得就绪队列中进程的个数 intspace() { intl=0;PCB*pr=ready; while(pr! =NULL) { l++; pr=pr->link; } return(l); } //显示进程 disp(PCB*pr) { printf("\nqname\tstate\tsuper\tndtime\truntime\n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state); printf("|%d\t",pr->super); printf("|%d\t",pr->ntime); printf("|%d\t",pr->rtime); printf("\n"); } //显示当前运行进程和就绪队列中进程的信息 check() { PCB*pr; printf("\n****当前正在运行的进程是: %s",p->name); disp(p); pr=ready; printf("\n****当前就绪队列状态为: \n"); while(pr! =NULL) { disp(pr); pr=pr->link; } } //撤消进程 destroy() { printf("\n进程[%s]已完成.\n",p->name); free(p); } //使当前进程运行一个时间片,若结束则撤消,否则其优先数减1并插入就绪队列 running() { (p->rtime)++; if(p->rtime==p->ntime) destroy(); else { (p->super)--; p->state='w'; sort(); } } main() { intlen,h=0; charch; input();//输入进程并形成就绪队列 len=space();//获得就绪队列中进程的个数 while((len! =0)&&(ready! =NULL))//若就绪队列不为空 { printf("\nTheexecutenumber: %d\n",h); h++; p=ready; ready=p->link; p->link=NULL; p->state='R'; check();//查看当前所有进程的信息 running(); } printf("\n\n所有进程已经完成.\n"); } 四、运行结果分析 结果分析: 根据上述输入的三个进程的信息可以得到: 优先级最高的是进程P3,所以最先调度进程P3,它的状态为运行态,需要执行的时间为5。 而当前就绪队列状态为: 进程P1的优先级比较高,处于就绪队列前面,而进程P2的优先级是三者中最低的,所以处于就绪队列的最后。 而此时这两个进程的状态都为就绪态。 结果分析: 当进程P3执行了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程P1。 按照这种方式一直运行下去,直到: 结果分析: 当进程P3的CPU占用时间等于它需要的执行时间时,进程ping调度完成。 则这时进程调度中还有两个进程: 进程P2和进程P1。 结果分析: 当调度进程中只剩下进程P2和进程P1时,这时根据进程优先级的大小,进程P2将进入运行态。 结果分析: 当进程P1完成调度时,进程调度程序中直剩下进程P2了,这时进程P2将进入运行态,而当前就绪队列将为空。 结果分析: 当进程P2的CPU占用时间等于所需要的执行时间时,进程P2调度完成,则这时进程调度中已经没有需要调度的进程了,则整个进程调度完成。 分析与体会: 该实验利用进程调度中的优先级算法调度进程,开始给每一个进程设定一个优先级数,对于优先级高的进程先调度,优先级低的进程后调度,在调度一个进程时,其他进程将处于就绪态,而正在被调度的进程应处于运行态。 一开始在做这个实验的时候,我感觉大脑一片空白,不知道该从哪里动笔。 后来根据书上的内容和从网上下载的资料,我慢慢地了解了大致的流程。 通过这次实验,首先加深了我对进程调度方法和功能的认识,其次让我更加深刻地理解了操作系统中进程调度中优先级调度的基本原理。 优先级调度算法只是进程调度算法的一种,我们还应依照书本去学习进程调度的其它算法,以便更好地了解进程调度。 实验成绩 备注: 要求学生每次实验结束后把实验报告填好交给实验指导教师。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 进程 调度 实验 报告