西安交通大学自动化系操作系统进程调度实验Word下载.docx

上传人:b****6 文档编号:21612482 上传时间:2023-01-31 格式:DOCX 页数:18 大小:491.23KB
下载 相关 举报
西安交通大学自动化系操作系统进程调度实验Word下载.docx_第1页
第1页 / 共18页
西安交通大学自动化系操作系统进程调度实验Word下载.docx_第2页
第2页 / 共18页
西安交通大学自动化系操作系统进程调度实验Word下载.docx_第3页
第3页 / 共18页
西安交通大学自动化系操作系统进程调度实验Word下载.docx_第4页
第4页 / 共18页
西安交通大学自动化系操作系统进程调度实验Word下载.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

西安交通大学自动化系操作系统进程调度实验Word下载.docx

《西安交通大学自动化系操作系统进程调度实验Word下载.docx》由会员分享,可在线阅读,更多相关《西安交通大学自动化系操作系统进程调度实验Word下载.docx(18页珍藏版)》请在冰豆网上搜索。

西安交通大学自动化系操作系统进程调度实验Word下载.docx

三、实验内容

  进程调度实验

●目的要求

  用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<

stdio.h>

stdlib.h>

conio.h>

#definegetpch(type)(type*)malloc(sizeof(type))

structpcb{

voidInitialInterface()//初始界面

{

printf("

\n\t\t***********************************************\t\t\n"

);

\t\t\t操作系统进程调度实验\n"

\t\t***********************************************\t\t\n"

\n\n\n\t\t\t电信学院\n\n"

\t\t\t班级:

自动化1X\n\n"

\t\t\t姓名:

XX\n\n"

\t\t\t学号:

21105040XX\n\n"

\t\t\t完成时间:

2014年11月17号\n\n\n\n"

\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->

(second->

super))

link=second;

first->

link=p;

second=NULL;

insert=1;

//insert==1,表示新近的进程在序列中间插入

first=first->

second=second->

if(insert==0)first->

//insert==0,表示序列已经检索到队尾,新近进程插入序列尾部

}

else//flag==0,对FCFS进程的等待序列进行排序

first=ready;

if(ready==NULL)ready=p;

while(first->

link!

=NULL){first=first->

voidinput(intflag)//初始化时进程序列输入函数,flag==1表示优先级进程序列的输入,flag==0表示FCFS进程序列的输入

{

inti,N;

system("

cls"

printf("

\n\n\t\t*********************************************\t\t\n"

if(flag==1)

\t\t\t\t最高优先数优先算法\n"

\t\t\t\t先来先服务算法\n"

\t\t*********************************************\t\t\n"

\n请输入进程数:

"

scanf("

%d"

&

N);

if(flag==1)//优先级进程序列输入

for(i=0;

i<

N;

i++)

\n进程号No.%d:

\n"

i);

p=getpch(PCB);

\n输入进程名:

%s"

p->

name);

\n输入进程优先数:

super);

\n输入进程运行时间:

ntime);

rtime=0;

state='

w'

;

link=NULL;

sort

(1);

for(i=0;

i++)//FCFS进程序列输入

sort(0);

}

intspace()//计算进程等待序列中的进程个数,从ready开始算起

intl=0;

PCB*pr=ready;

while(pr!

l++;

pr=pr->

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"

|%s\t"

pr->

|%c\t"

state);

|%d\t"

rtime);

voiddestroy()//释放进程

\n进程[%s]此次运行之后已完成,将退出进程序列.\n"

free(p);

voidcheck(intflag)//进程查看函数,flag==1表示优先级进程查看,flag==0表示FCFS进程查看

PCB*pr;

\n****当前正在运行的进程是:

if(flag==1)display(p,1);

elsedisplay(p,0);

pr=ready;

\n****当前就绪队列状态为:

if(flag==1)//查看优先级进程序列

display(pr,1);

else//查看FCFS进程序列

display(pr,0);

voidrunning(intflag)//进程运行函数,flag==1表示优先级进程的运行,flag==0表示FCFS进程的运行

(p->

rtime)++;

if(p->

rtime==p->

ntime)

destroy();

//进程已运行时间等于所需运行时间时将被释放,自动从进程序列中消失

if(flag==1)//优先级进程运行时的规则:

运行时间加一,优先级减一,同时进入等待状态,进入等待序列重新排序

(p->

super)--;

else//FCFS进程运行时的规则:

运行时间加一,直接进入等待状态并插入队尾

p->

voidScheduling(intflag)//调度算法,flag==1表示优先级算法,flag==0表示FCFS算法

intlen,h=0;

charch;

if(flag==1)input

(1);

elseinput(0);

len=space();

while((len!

=0)&

&

(ready!

=NULL))

ch=getchar();

h++;

\nTheexecutenumber:

%d\n"

h);

p=ready;

ready=p->

R'

if(flag==1)//flag==1,优先级进程的查看和运行

check

(1);

running

(1);

else//flag==0,FCFS进程的查看和运行

check(0);

running(0);

\n按回车键继续......"

\n\n进程已经完成.\n"

/***********************模块结束*************************/

voidmenu()//界面主菜单

{intm;

\t\t\t\t进程调度实验\n"

\n\n\n\t\t\t1.最高优先数优先算法."

\n\t\t\t2.先来先服务算法."

\n\t\t\t0.退出程序."

\n\n\t\t\t\t请按键选择进程调度方法:

m);

//注意:

主菜单中只能输入整型数

switch(m)

{case1:

Scheduling

(1);

menu();

break;

case2:

Scheduling(0);

case0:

default:

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,两个进程在轮转运行两次之后分别退出进程序列,以上分析结果与使用说明中的程序运行结果一致,所以先来先服务算法的实现满足实验要求。

七、设计体会

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

当前位置:首页 > 法律文书 > 起诉状

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

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