西安交通大学自动化系操作系统进程调度实验.docx
- 文档编号:8476253
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:18
- 大小:491.23KB
西安交通大学自动化系操作系统进程调度实验.docx
《西安交通大学自动化系操作系统进程调度实验.docx》由会员分享,可在线阅读,更多相关《西安交通大学自动化系操作系统进程调度实验.docx(18页珍藏版)》请在冰豆网上搜索。
西安交通大学自动化系操作系统进程调度实验
西安交通大学
电子信息与工程学院自动化科学与技术系
操作系统实验报告
实验名称 :
操作系统实验
实验者姓名:
XXX
实验者学号:
21105040XX
所在班级:
自动化1X
报告完成日期:
2014年11月18日
操作系统实验报告
—、实验的意义和目的
操作系统质量的好坏,直接影响整个计算机系统的性能和用户对计算机的使用。
一个精心设计的操作系统能极大地扩充计算机系统的功能,充分发挥系统中各种设备的使用效率,提高系统工作的可靠性。
由于操作系统涉及计算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。
要学好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。
培养学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。
通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。
使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二、实验运行环境及上机前的准备
●实验运行环境:
C语言编程环境
●上机前的准备工作包括:
⏹按实验要求事先编好程序;
⏹准备好需要输入的中间数据;
⏹估计可能出现的问题;
⏹预计可能得到的运行结果。
三、实验内容
进程调度实验
●目的要求
用VC编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
●内容
设计一个有N个进程并行的进程调度程序。
其中:
1)进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。
2)每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:
进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
3)进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
4)进程的运行时间以时间片为单位进行计算。
5)每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
6)就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
7)如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程;如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
8)每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
9)重复以上过程,直到所要进程都完成为止。
调度算法的流程图如下:
四、编程实现
1.主要变量定义
structpcb{//进程控制块PCB,注:
进程序列以进程控制块为基本单位
charname[10];//进程名
charstate;//进程状态
intsuper;//进程优先级
intntime;//进程所需运行时间
intrtime;//进程已运行时间
structpcb*link;//定义指向PCB控制块的指针,用于创建进程序列
}*ready=NULL,*p;//定义两个PCB结构的全局变量ready和p,ready初始值为空
typedefstructpcbPCB;//用PCB来申明进程控制块变量
2.主要模块
VoidInitialInterface()//初始化界面
Voidmenu()//算法选择的主菜单
VoidScheduling(intflag)//调度算法的程序入口
Voidinput(intflag)//进程控制块输入函数
Voidsort(intflag)//进程序列的排序函数
Intspace()//计算进程等待序列中进程控制块的个数
Voidrunning(intflag)//进程运行函数
Voidcheck(intflag)//进程序列的查看函数
Voiddisplay(PCB*pr,intflag)//显示进程控制块的信息
Voiddestroy()//进程撤销函数
3.代码
#include
#include
#include
#definegetpch(type)(type*)malloc(sizeof(type))
structpcb{
charname[10];
charstate;
intsuper;
intntime;
intrtime;
structpcb*link;
}*ready=NULL,*p;
typedefstructpcbPCB;
voidInitialInterface()//初始界面
{
printf("\n\t\t***********************************************\t\t\n");
printf("\t\t\t操作系统进程调度实验\n");
printf("\t\t***********************************************\t\t\n");
printf("\n\n\n\t\t\t电信学院\n\n");
printf("\t\t\t班级:
自动化1X\n\n");
printf("\t\t\t姓名:
XX\n\n");
printf("\t\t\t学号:
21105040XX\n\n");
printf("\t\t\t完成时间:
2014年11月17号\n\n\n\n");
printf("\t\t\t请输入任意键进入演示过程......");
getch();
}
voidsort(intflag)//进程排序函数,flag==1表示对优先级进程的等待序列进行排序,flag==0表示对FCFS进程的等待序列进行排序
{
PCB*first,*second;
if(flag==1)//flag==1,对优先级进程的等待序列进行排序
{
intinsert=0;//insert用来判断新近进程是否插入队尾,仅在优先级进程的排序中使用
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;//insert==1,表示新近的进程在序列中间插入
}
else
{
first=first->link;
second=second->link;
}
}
if(insert==0)first->link=p;//insert==0,表示序列已经检索到队尾,新近进程插入序列尾部
}
}
else//flag==0,对FCFS进程的等待序列进行排序
{
first=ready;
if(ready==NULL)ready=p;
else
{
while(first->link!
=NULL){first=first->link;}
first->link=p;
}
}
}
voidinput(intflag)//初始化时进程序列输入函数,flag==1表示优先级进程序列的输入,flag==0表示FCFS进程序列的输入
{
inti,N;
system("cls");
printf("\n\n\t\t*********************************************\t\t\n");
if(flag==1)
printf("\t\t\t\t最高优先数优先算法\n");
else
printf("\t\t\t\t先来先服务算法\n");
printf("\t\t*********************************************\t\t\n");
printf("\n请输入进程数:
");
scanf("%d",&N);
if(flag==1)//优先级进程序列输入
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 (1); } else for(i=0;i { printf("\n进程号No.%d: \n",i); p=getpch(PCB); printf("\n输入进程名: "); scanf("%s",p->name); printf("\n输入进程运行时间: "); scanf("%d",&p->ntime); printf("\n"); p->rtime=0;p->state='w'; p->link=NULL; sort(0); } } intspace()//计算进程等待序列中的进程个数,从ready开始算起 { intl=0;PCB*pr=ready; while(pr! =NULL) { l++; pr=pr->link; } return(l); } voiddisplay(PCB*pr,intflag)//进程信息显示,flag==1表示优先级进程的显示,flag==0表示FCFS进程的显示 { if(flag==1)printf("\npname\tstate\tsuper\tndtime\truntime\n"); elseprintf("\npname\tstate\tndtime\truntime\n"); printf("|%s\t",pr->name); printf("|%c\t",pr->state); if(flag==1)printf("|%d\t",pr->super); printf("|%d\t",pr->ntime); printf("|%d\t",pr->rtime); printf("\n"); } voiddestroy()//释放进程 { printf("\n进程[%s]此次运行之后已完成,将退出进程序列.\n",p->name); free(p); } voidcheck(intflag)//进程查看函数,flag==1表示优先级进程查看,flag==0表示FCFS进程查看 { PCB*pr; printf("\n****当前正在运行的进程是: %s",p->name); if(flag==1)display(p,1); elsedisplay(p,0); pr=ready; printf("\n****当前就绪队列状态为: \n"); if(flag==1)//查看优先级进程序列 while(pr! =NULL) { display(pr,1); pr=pr->link; } else//查看FCFS进程序列 while(pr! =NULL) { display(pr,0); pr=pr->link; } } voidrunning(intflag)//进程运行函数,flag==1表示优先级进程的运行,flag==0表示FCFS进程的运行 { (p->rtime)++; if(p->rtime==p->ntime) destroy();//进程已运行时间等于所需运行时间时将被释放,自动从进程序列中消失 else { if(flag==1)//优先级进程运行时的规则: 运行时间加一,优先级减一,同时进入等待状态,进入等待序列重新排序 { (p->super)--; p->state='w'; sort (1); } else//FCFS进程运行时的规则: 运行时间加一,直接进入等待状态并插入队尾 { p->state='w'; sort(0); } } } voidScheduling(intflag)//调度算法,flag==1表示优先级算法,flag==0表示FCFS算法 { intlen,h=0; charch; system("cls"); if(flag==1)input (1); elseinput(0); len=space(); while((len! =0)&&(ready! =NULL)) { ch=getchar(); h++; printf("\nTheexecutenumber: %d\n",h); p=ready; ready=p->link; p->link=NULL; p->state='R'; if(flag==1)//flag==1,优先级进程的查看和运行 { check (1); running (1); } else//flag==0,FCFS进程的查看和运行 { check(0); running(0); } printf("\n按回车键继续......"); } printf("\n\n进程已经完成.\n"); ch=getchar(); } /***********************模块结束*************************/ voidmenu()//界面主菜单 {intm; system("cls"); printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t进程调度实验\n"); printf("\t\t*********************************************\t\t\n"); printf("\n\n\n\t\t\t1.最高优先数优先算法."); printf("\n\t\t\t2.先来先服务算法."); printf("\n\t\t\t0.退出程序."); printf("\n\n\t\t\t\t请按键选择进程调度方法: "); scanf("%d",&m);//注意: 主菜单中只能输入整型数 switch(m) {case1: Scheduling (1); system("cls"); menu(); break; case2: Scheduling(0); system("cls"); menu(); break; case0: system("cls"); break; default: system("cls"); menu(); } } voidmain()//主main()函数 { InitialInterface();//初始化界面 menu();//主菜单界面 } 五、使用说明 1.初始化界面 (在此省略……) 2.调度算法选择界面 3.最高优先数优先算法 4.输入3个进程控制块a,b,c 进程a的优先数为3,运行时间为2 进程b的优先数为2,运行时间为2 进程c的优先数为5,运行时间为2 5.输入完所有进程信息后按回车键,进程开始运行,控制窗口显示正在运行进程的信息和进程等待序列中进程的信息,直至所有进程运行结束 6.先来先服务算法 7.输入2个进程控制块a和b,进程a的运行时间为2 进程b的运行时间为2 8.输入完所有进程信息后按回车键,进程开始运行,控制窗口显示正在运行进程的信息和进程等待序列中进程的信息,直至所有进程运行结束 9.在算法选择菜单中输入0,按回车键退出程序 六、结果分析 1.最高优先数优先算法 初始化时输入的三个进程信息是: a的优先数为3,运行时间为2 b的优先数为2,运行时间为2 c的优先数为5,运行时间为2 按照优先级算法的规则(进程每运行一次,已运行时间加一,优先数减一,同时按优先级插入就绪队列),进程运行时的顺序应该是: c→c→a→b→a→b,进程c在第二次运行之后就退出进程序列,进程a和b在轮流运行两次之后分别退出进程序列,以上分析结果与使用说明中的程序运行结果相一致,所以最高优先级算法的实现满足实验要求。 2.先来先服务算法 初始化时输入的两个进程信息是: 进程a的运行时间为2,进程b的运行时间为2 按照先来先服务算法的规则(进程每运行一次,已运行时间减一,同时插入进程等待序列的队尾),进程运行时的顺序应该是: a→b→a→b,两个进程在轮转运行两次之后分别退出进程序列,以上分析结果与使用说明中的程序运行结果一致,所以先来先服务算法的实现满足实验要求。 七、设计体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安交通大学 自动化 操作系统 进程 调度 实验