西安石油大学操作系统原理实验一进程及其管理.docx
《西安石油大学操作系统原理实验一进程及其管理.docx》由会员分享,可在线阅读,更多相关《西安石油大学操作系统原理实验一进程及其管理.docx(14页珍藏版)》请在冰豆网上搜索。
![西安石油大学操作系统原理实验一进程及其管理.docx](https://file1.bdocx.com/fileroot1/2022-12/31/d71b7d34-1f21-419f-a465-9ba8df7d3738/d71b7d34-1f21-419f-a465-9ba8df7d37381.gif)
西安石油大学操作系统原理实验一进程及其管理
实验报告
课程名称操作系统原理
实验名称进程及其管理
姓名张文江
学号201107010122
专业班级计科1201
成绩
指导教师赵安科
实验一进程及其管理
进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度
1.内容:
设计一个简单的进程调度算法,模拟OS中的进程调度过程
2.要求:
①进程数不少于5个;
②进程调度算法任选;
最好选用动态优先数法,每运行一个时间片优先数减3
③用C++(或C)语言编程;
④程序运行时显示进程调度过程。
3.步骤:
①设计PCB及其数据结构:
进程标识数:
ID
进程优先数:
PRIORITY(优先数越大,优先级越高)
进程已占用时间片:
CPUTIME
进程尚需时间片:
ALLTIME(一旦运行完毕,ALLTIME为0)
进程队列指针:
NEXT,用来将PCB排成队列
进程状态:
STATE(一般为就绪,不用)
②设计进程就绪队列及数据结构;
③设计进程调度算法,并画出程序流程图;
④设计输入数据和输出格式;
结构格式:
当前正运行的进程:
0
当前就绪队列:
2,1,3,4
⑤编程上机,验证结果。
4.提示:
假设调度前,系统中有5个进程,其初始状态如下:
ID
0
1
2
3
4
可否考虑用二维数组去实现
PRIORITY
9
38
30
29
0
CPUTIME
0
0
0
0
0
ALLTIME
3
3
6
3
4
STATE
ready
ready
ready
ready
ready
①以时间片为单位调度运行;
②每次总是从ALLTIME中不为0,且PRIORITY最大的进程调度运行一个时间片;
③上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③
④直到所有进程的ALLTIME均变为0。
5.书写实验报告
①实验题目;
②程序中所用数据结构及说明;
③程序清单及描述;
④执行结果。
6.实验源代码:
#include
#include
typedefintStatus;
#defineERROR0
#defineOK1
typedefstructPCB{
charNAME[10];//进程名字
intPRIO;//进程优先数
intROUNT;//轮转时间片
intCOUNT;//计数器
intNEEDTIME;//需要的CPU时间
intCPUTIME;//占用cpu时间
char*STATE;//进程状态
}ElemPCB;
typedefstructQNode{
ElemPCBpcb;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{//就绪队列
QueuePtrRUN;//当前运行进程指针
QueuePtrREADY;//头指针
QueuePtrTAIL;//尾指针
}READYQueue;
typedefstruct{//完成队列
QueuePtrFINISH;//头指针
QueuePtrTAIL;//尾指针
}FINISHQueue;
StatusCreate(READYQueue&ready);
StatusPrint(READYQueueready,FINISHQueuefinish);
StatusPrintr(READYQueueready,FINISHQueuefinish);
StatusFisrt(READYQueue&ready);
StatusInsert1(READYQueue&ready);
StatusInsert2(READYQueue&ready);
StatusPrisch(READYQueue&ready,FINISHQueue&finish);
StatusRoundsch(READYQueue&ready,FINISHQueue&finish);
voidmain(){
charch;
READYQueueready;
FINISHQueuefinish;
ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode));//存储分配
ready.RUN=(QueuePtr)malloc(sizeof(QNode));
ready.RUN->next=NULL;
finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode));
Create(ready);
//创建后就绪对列中
printf("\n就绪对列中初始值:
\n");
Print(ready,finish);
Fisrt(ready);
printf("请输入要选择调度的算法(p--优先数调度,r--时间片轮转法):
\n");
while
(1){
do{
ch=getchar();
scanf("%c",&ch);
}while(ch!
='p'&&ch!
='r');
switch(ch){
case'p':
//优先数调度
Prisch(ready,finish);
break;
case'r':
//时间片轮转法
Roundsch(ready,finish);
break;
}
}
}
StatusPrint(READYQueueready,FINISHQueuefinish){//打印就绪队列中的进程状态
QueuePtrp,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!
=NULL)
{
printf("%s",ready.RUN->next->pcb.NAME);
printf(":
%s\t",ready.RUN->next->pcb.STATE);
printf("优先数:
%d\n",ready.RUN->next->pcb.PRIO);
}
//就绪队列的进程
while(p!
=ready.TAIL){
printf("%s",p->next->pcb.NAME);
printf(":
%s\t",p->next->pcb.STATE);
printf("优先数:
%d\n",p->next->pcb.PRIO);
p=p->next;
}
//完成队列的进程
while(q!
=finish.TAIL){
printf("%s",q->next->pcb.NAME);
printf(":
%s\t",q->next->pcb.STATE);
printf("优先数:
%d\n",q->next->pcb.PRIO);
q=q->next;
}
returnOK;
}
StatusPrintr(READYQueueready,FINISHQueuefinish){//打印就绪队列中的进程状态
QueuePtrp,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!
=NULL)
{
printf("%s",ready.RUN->next->pcb.NAME);
printf(":
%s\t",ready.RUN->next->pcb.STATE);
printf("剩余时间:
%d\n",ready.RUN->next->pcb.NEEDTIME);
}
//就绪队列的进程
while(p!
=ready.TAIL){
printf("%s",p->next->pcb.NAME);
printf(":
%s\t",p->next->pcb.STATE);
printf("剩余时间:
%d\n",p->next->pcb.NEEDTIME);
p=p->next;
}
//完成队列的进程
while(q!
=finish.TAIL){
printf("%s",q->next->pcb.NAME);
printf(":
%s\t",q->next->pcb.STATE);
printf("剩余时间:
%d\n",q->next->pcb.NEEDTIME);
q=q->next;
}
returnOK;
}
StatusCreate(READYQueue&ready){
QueuePtrp;
inti=0;
intn;
printf("请输入进程个数:
");
scanf("%d",&n);
while(i{
p=(QueuePtr)malloc(sizeof(QNode));
printf("输入第%d进程名:
",i+1);
scanf("%s",p->pcb.NAME);
printf("输入进程需要的时间:
");
scanf("%d",&p->pcb.NEEDTIME);
printf("输入进程的进程优先数:
");
scanf("%d",&p->pcb.PRIO);
p->pcb.STATE="W";
p->pcb.ROUNT=2;
p->pcb.COUNT=0;
i++;
p->next=NULL;
ready.TAIL->next=p;
ready.TAIL=p;
}
returnOK;
}
StatusFisrt(READYQueue&ready){
if(ready.READY==ready.TAIL)
returnERROR;
ready.RUN->next=ready.READY->next;
ready.RUN->next->pcb.STATE="RUN";//修改进程状态
if(ready.TAIL==ready.READY->next)
ready.READY=ready.TAIL;
else
ready.READY->next=ready.READY->next->next;//头指针后移
printf("\n%s被从就绪队列调度运行\n",ready.RUN->next->pcb.NAME);
returnOK;
}
StatusInsert1(READYQueue&ready){
inti=0,j=0;
QueuePtrp=ready.READY,q;
ElemPCBtemp;
QueuePtrs=(QueuePtr)malloc(sizeof(QNode));
s->pcb=ready.RUN->next->pcb;
s->next=NULL;//将未完成的进程插入就绪队列
ready.TAIL->next=s;
ready.TAIL=s;
//按优先数从大到小排序
for(p;p!
=ready.TAIL;p=p->next)
{
for(q=p->next;q!
=ready.TAIL;q=q->next)
{
if(p->next->pcb.PRIOnext->pcb.PRIO)
{
temp=p->next->pcb;
p->next->pcb=q->next->pcb;
q->next->pcb=temp;
}
}
}
returnOK;
}
StatusInsert2(READYQueue&ready){
QueuePtrp=ready.RUN->next;
if(p->pcb.NEEDTIME>0)
{
ready.TAIL->next=p;//插入到就绪队列
ready.TAIL=p;
ready.RUN->next=NULL;
}
returnOK;
}
StatusPrisch(READYQueue&ready,FINISHQueue&finish){
inti=0;
while(ready.RUN->next!
=NULL)
{
ready.RUN->next->pcb.CPUTIME++;
ready.RUN->next->pcb.NEEDTIME--;
ready.RUN->next->pcb.PRIO-=3;
if(ready.RUN->next->pcb.NEEDTIME==0)
{
finish.TAIL->next=ready.RUN->next;//插入到完成队列
finish.TAIL=ready.RUN->next;//尾指针后移
ready.RUN->next->pcb.STATE="FINISH";
ready.RUN->next=NULL;
if(ready.READY!
=ready.TAIL)
{
Fisrt(ready);
}
}
elseif(ready.READY!
=ready.TAIL&&(ready.RUN->next->pcb.PRIO)<(ready.READY->next->pcb.PRIO))
{
ready.RUN->next->pcb.STATE="W";
printf("%s被调到就绪队列里\n",ready.RUN->next->pcb.NAME);
Insert1(ready);
Fisrt(ready);
}
i++;
printf("\n进程执行第%d个时间片的结果:
\n",i);
Print(ready,finish);
}
returnOK;
}
StatusRoundsch(READYQueue&ready,FINISHQueue&finish){
inti=0;
while(ready.RUN->next!
=NULL)
{
ready.RUN->next->pcb.CPUTIME++;
ready.RUN->next->pcb.NEEDTIME--;
ready.RUN->next->pcb.COUNT++;
if(ready.RUN->next->pcb.NEEDTIME==0)
{
finish.TAIL->next=ready.RUN->next;//插入到完成队列
finish.TAIL=ready.RUN->next;//尾指针后移
ready.RUN->next->pcb.STATE="FINISH";
ready.RUN->next=NULL;
if(ready.READY!
=ready.TAIL)
{
Fisrt(ready);
}
}
elseif(ready.RUN->next->pcb.COUNT==ready.RUN->next->pcb.ROUNT)
{
ready.RUN->next->pcb.COUNT=0;
if(ready.READY!
=ready.TAIL)
{
ready.RUN->next->pcb.STATE="W";
printf("%s被调到就绪队列里\n",ready.RUN->next->pcb.NAME);
Insert2(ready);
Fisrt(ready);
}
}
i++;
printf("\n进程执行第%d个时间片的结果:
\n",i);
Printr(ready,finish);
}
returnOK;
}
7.运行结果截图:
8.实验心得
操作系统是计算机系统中必不可少的系统软件,它是计算机系统中各种资源的管理者和各种活动的
组织者、指挥者。
操作系统采用时间片法调度进程,是系统资源得到充分利用,用户可以花更少的时间
完成过多的工作。
通过这次实验,将以前只会做题的过程转化外程序执行的过程,模拟了在单处理机情
况下的处理及调度问题,体会到了程序执行的过程,加深了对进程调度的理解。