西安石油大学操作系统原理实验一进程及其管理.docx

上传人:b****5 文档编号:5802899 上传时间:2023-01-01 格式:DOCX 页数:14 大小:157.91KB
下载 相关 举报
西安石油大学操作系统原理实验一进程及其管理.docx_第1页
第1页 / 共14页
西安石油大学操作系统原理实验一进程及其管理.docx_第2页
第2页 / 共14页
西安石油大学操作系统原理实验一进程及其管理.docx_第3页
第3页 / 共14页
西安石油大学操作系统原理实验一进程及其管理.docx_第4页
第4页 / 共14页
西安石油大学操作系统原理实验一进程及其管理.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

西安石油大学操作系统原理实验一进程及其管理.docx

《西安石油大学操作系统原理实验一进程及其管理.docx》由会员分享,可在线阅读,更多相关《西安石油大学操作系统原理实验一进程及其管理.docx(14页珍藏版)》请在冰豆网上搜索。

西安石油大学操作系统原理实验一进程及其管理.docx

西安石油大学操作系统原理实验一进程及其管理

实验报告

 

课程名称操作系统原理

实验名称进程及其管理

姓名张文江

学号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.实验心得

操作系统是计算机系统中必不可少的系统软件,它是计算机系统中各种资源的管理者和各种活动的

组织者、指挥者。

操作系统采用时间片法调度进程,是系统资源得到充分利用,用户可以花更少的时间

完成过多的工作。

通过这次实验,将以前只会做题的过程转化外程序执行的过程,模拟了在单处理机情

况下的处理及调度问题,体会到了程序执行的过程,加深了对进程调度的理解。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1