操作系统 进程管理 报告.docx
- 文档编号:9957916
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:12
- 大小:66.86KB
操作系统 进程管理 报告.docx
《操作系统 进程管理 报告.docx》由会员分享,可在线阅读,更多相关《操作系统 进程管理 报告.docx(12页珍藏版)》请在冰豆网上搜索。
操作系统进程管理报告
昆明理工大学信息工程与自动化学院学生实验报告
(200—200学年第学期)
课程名称:
操作系统开课实验室:
计算机中心2042010年4月20日
年级、专业、班
学号
姓名
成绩
实验项目名称
进程管理
指导教师
教师评语
教师签名:
年月日
注:
报告内容按实验须知中七点要求进行。
1、实验目的:
运用优先权法和轮转法来模拟进程的控制,掌握进程的状态转换、进程的整个控制工作。
二、实验原理及基本技术路线图(方框原理图)
实验原理:
用C语言或C++语言开发。
需要定义PCB的数据结构,用链表的形式管理进程,采用多级反馈队列调度的算法模拟进程的控制。
要求有创建、撤销、调度、阻塞、唤醒进程等功能。
(1)PCB的数据结构:
1.进程ID:
其中0为idle进程,用户进程为1,2,3……)
2.进程优先级priority:
idle进程为0,用户优先级大于0且随机产生,数值越大优先级越高
3.进程占用CPU的执行时间CPUT:
4.进程总共需要运行时间AllT:
用随机数生成
5.进程状态:
0—表示就绪,1—表示运行,2—表示阻塞
6.队列指针next,存放多个进程的PCB链表
(2)优先数的改变策略
1.进程在就绪队列每呆一个时间片优先数+1
2.进程每运行一次,优先数-3
(3)执行可通过循环、睡眠等多种方式模拟,阻塞和唤醒可通过捕获键盘按键来执行。
是
排放在对手,ready指向p
获取就绪队列的长度
检查并打印出正在运行的进程和等待中的进程
如果执行时间和进程所需时间相同,则释放该进程的空间,否则进程优先数减1,并且将状态改为等待
P要进程长度len不为0,就不断循环执行,直至len=0
循环比较,将p放在适当的位置
否
比较进程优先级,p优先级高
输入进程信息
开始
程序框图:
三、所用仪器、材料(设备名称、型号、规格等):
VC++6.0
4、实验方法、步骤
源程序:
#include
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))//将申请内存空间函数自定义为getpch(type)
structpcb{//定义进程控制块的结构
charname[10];//进程名称
charstate;//进程状态
intsuper;//进程优先级
intneedtime;//进程总共需要的cpu时间
intrtime;
inttijiaotime;
intstarttime;
intfinishtime;
intzztime;
intdzztime;
structpcb*link;//进程指向下一个进程的指针
}*ready=NULL,*p;//ready表示指向就绪队列中首元素的指针,初始化为NULL,p用来存放当前刚输入的PCB
typedefstructpcbPCB;//自定义PCB结构体
intpzztime=0;
intpdzztime=0;
intnum;
inttime=10000;
voidsort()
{
PCB*first,*second;
intinsert=0;//insert用于记录当前PCBp是否插在就绪队列的尾部
if((ready==NULL)||((p->super)>(ready->super)))//如果就绪队列为空或当前process的super比就绪队列中的第一各元素大,则:
{//注:
就绪队列中的元素按优先级从高到低排的
p->link=ready;//把P放在队首,并且让ready指向p
ready=p;
}
else//就绪队列不为空,p的super不比首元素大,那就循环进行比较
{
first=ready;
second=first->link;//first和second都是两个用于循环的变量
while(second!
=NULL)//一直比较到就绪队列的末尾
{
if((p->super)>(second->super))//当前进程的优先级大于原就绪队列中second所指向的元素时,就把p插入到first和second所指向的元素之间
{
p->link=second;
first->link=p;
second=NULL;
insert=1;//插入队列记录符号
}
else
{
first=first->link;//两个循环变量继续后移,为下一轮循环做准备
second=second->link;
}
}
if(insert==0)first->link=p;//循环到最后了,如果insert仍为0的话,就把P放在队尾
}
}
//*******************************PCB输入模块*********************************************
voidinput()
{
inti;
printf("\n请输入进程数:
");
scanf("%d",&num);
for(i=0;i { printf("\n第%d个进程: \n",i); p=getpch(structpcb); printf("\n进程名: "); scanf("%s",p->name); printf("\n优先数: "); scanf("%d",&p->super); printf("\n运行时间: "); scanf("%d",&p->needtime); printf("\n提交时间: "); scanf("%d",&p->tijiaotime); p->rtime=0; p->state='w';//所有进程的初始状态都是等待状态 p->link=NULL; sort(); } } //*******************************PCB就绪队列中元素计数模块******************************** intspace()//计算就绪队列中PCB的总数 { intl=0; PCB*pr=ready;//获取就绪队列的头指针ready while(pr! =NULL)//循环计数 { l++; pr=pr->link; } return(l); } //*******************************打印PCB信息模块***************************************** voiddisp(PCB*pr) { printf("\nqname\tstate\tpriority\n"); time=pr->tijiaotime>time? pr->tijiaotime: time; pr->starttime=time; time+=pr->needtime; pr->state='R'; pr->finishtime=time; pr->zztime=pr->finishtime-pr->tijiaotime; pr->dzztime=pr->zztime/pr->needtime; pzztime=pr->zztime+pzztime; pdzztime=pr->dzztime+pdzztime; printf("|%s\t",pr->name); printf("|%c\t",pr->state); printf("|%d\t\t\n",pr->super); printf("作业名提交时间开始时间所需时间结束时间周转时间带权周转时间\n"); printf("%s%d%d%d%d%d%d",pr->name,pr->tijiaotime,pr->starttime,pr->needtime,pr->finishtime,pr->zztime,pr->dzztime); } //****************************检查当前有哪些进程在运行,那些处于wait状态******************************* voidcheck() { PCB*pr; printf("\nThecurrentrunningprocessis: %s\n",p->name); disp(p); pr=ready; printf("\nThestateoftheWaitingList: \n"); while(pr! =NULL)//打印其它等待的进程 { disp(pr); pr=pr->link; } } //*******************************打印已经完成的进程并释放内存空间********************************** voiddestroy() { printf("\nAfterthisdispatch,theprocess[%s]willfinish.\n",p->name); free(p); } //*******************************本程序实行的是动态优先级调度************************************ //进程运行一段时间(这里设为5)后将其优先级减一,插入后续队列 voidrunning() { (p->rtime)+=5; if(p->rtime==p->needtime)//如果执行时间和该进程所需时间相等则撤销该进程 destroy(); else//未执行完毕则优先级减一并将状态改为w { (p->super)--; p->state='w'; sort();//加入队列并重新排序 } } //*******************************主函数模块************************************************* voidmain()//主函数 { intlen,h=0;//h表示进程调度的次数,每调度一次,h++ charch; input();//输入程序 len=space();//获取就绪队列长度 while((len! =0)&&(ready! =NULL)) { ch=getchar(); h++; printf("\nTheexecutenumber: %d\n",h); p=ready;//以下三行是将P从就绪队列的队首摘除 ready=p->link; p->link=NULL; p->state='R';//将P的状态改为R check(); running(); pzztime=pzztime/num; pdzztime=pdzztime/num; printf("\n平均周转时间,平均带权周转时间\n"); printf("%d,%d",pzztime,pdzztime); printf("\nProcessAnyKeytoContinue..."); ch=getchar(); } printf("\n\nAlltheprocesseshasfinishedrunning");//所有进程已经完成 ch=getchar(); } 5、实验过程原始记录 1.输入进程数 2.输入第0个进程 3.3输入第1个进程 4.输入第2个进程 5.运行结果 6、实验总结: 操作系统是计算机系统中必不可少的系统软件,它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。 操作系统采用时间片法调度进程,是系统资源得到充分利用,用户可以花更少的时间完成过多的工作。 通过这次实验,将以前只会做题的过程转化外程序执行的过程,模拟了在单处理机情况下的处理及调度问题,体会到了程序执行的过程,加深了对进程调度的理解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程管理 报告 进程 管理