操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法Word文档下载推荐.docx
- 文档编号:16936975
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:13
- 大小:93.46KB
操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法Word文档下载推荐.docx
《操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
(2)概要设计:
确定程序的总体结构、模块关系和总体流程;
(3)详细设计:
确定模块内部的流程和实现算法;
(4)上机编码和调试;
(5)运行测试;
(6)编写实验报告。
流程图:
(先来先服务流程图)
(高优先权流程图)
(按时间片轮转调度)
程序说明及实现:
1)先来先服务调度算法:
高响应比优先实现进程调度.(用C语言实现),
2)优先级调度程序:
该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。
3)时间片轮转法程序:
在此程序中由于程序比较小,未进行分模块设计。
直接采用单一模块。
1先来先服务
#include<
stdio.h>
floatt,d;
/*定义两个全局变量*/
struct/*定义一个结构体数组,包括进程的信息*/
{
intid;
floatArriveTime;
floatRequestTime;
floatStartTime;
floatEndTime;
floatRunTime;
floatDQRunTime;
intStatus;
}arrayTask[4];
/*定义初始化的结构体数组*/
GetTask()/*给结构体数组赋值,输入到达,服务时间*/
{inti;
floata;
for(i=0;
i<
4;
i++)
{arrayTask[i].id=i+1;
printf("
inputthenumber"
);
inputthetheArriveTimeofarrayTask[%d]:
"
i);
/*用户输入进程的时间,初始为零*/
scanf("
%f"
&
a);
arrayTask[i].ArriveTime=a;
inputtheRequestTimeofarrayTask[%d]:
arrayTask[i].RequestTime=a;
arrayTask[i].StartTime=0;
arrayTask[i].EndTime=0;
arrayTask[i].RunTime=0;
arrayTask[i].Status=0;
/*开始默认的标志位零*/
}
intfcfs()/*定义FCFS中寻找未执行的进程的最先到达时间*/
{
inti,j,w=0;
/*在结构体数组中找到一个未执行的进程*/
i++)
if(arrayTask[i].Status==0)
t=arrayTask[i].ArriveTime;
w=1;
}
if(w==1)
break;
i++)/*查找数组中到达时间最小未执行的进程*/
if(arrayTask[i].ArriveTime<
t&
&
arrayTask[i].Status==0)
}/*返回最小到达时间的数组的下标*/
if(arrayTask[i].ArriveTime==t)
returni;
intsjf()/*定义FCFS中寻找未执行的进程的最先到达时间*/
inti,x=0,a=0,b=0;
/*判断是不是第一个执行的进程*/
floatg;
if(arrayTask[i].Status==1)
{g=arrayTask[i].EndTime;
x=1;
if(x==0)/*第一个执行的进程按FCFS*/
t=arrayTask[0].ArriveTime;
t)
{t=arrayTask[i].ArriveTime;
a=i;
returna;
else
{if(arrayTask[i].EndTime>
g)
g=arrayTask[i].EndTime;
{if(arrayTask[i].Status==0&
arrayTask[i].ArriveTime<
=g)
{t=arrayTask[i].RequestTime;
b=1;
}/*判断有没有进程在前个进程完成前到达*/
if(b!
=0)/*有进程到达则按SJF*/
{for(i=0;
if(arrayTask[i].Status==0&
arrayTask[i].ArriveTime<
=g&
arrayTask[i].RequestTime<
else{/*否则按FCFS*/
{if(arrayTask[i].Status==0)
{t=arrayTask[i].ArriveTime;
new(ints)/*定义执行进程后相关数据的修改*/
inti,g=0;
if(arrayTask[i].Status==0)
continue;
g=1;
if(g==0)/*当处理的是第一个未执行的进程时执行*/
arrayTask[s].StartTime=arrayTask[s].ArriveTime;
arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;
arrayTask[s].RunTime=arrayTask[s].RequestTime;
arrayTask[s].Status=1;
g=2;
if(g==1)/*当处理的不是第一个未执行的进程时执行*/
d=arrayTask[i].EndTime;
i++)/*查找最后执行的进程的完成时间*/
if(arrayTask[i].EndTime>
d&
arrayTask[i].Status==1)
if(arrayTask[s].ArriveTime<
d)/*判断修改的进程的到达时间是否在前一个执行的进程的完成时间前面*/
arrayTask[s].StartTime=d;
arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;
arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;
arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;
Printresult(intj)/*定义打印函数*/
%d\t"
arrayTask[j].id);
%5.2f\t"
arrayTask[j].ArriveTime);
arrayTask[j].RequestTime);
arrayTask[j].StartTime);
arrayTask[j].EndTime);
arrayTask[j].RunTime);
%5.2f\n"
arrayTask[j].DQRunTime);
main()
{inti,b,k,a,c=0;
intd[4];
clrscr();
\tF.FCFS\n"
\tS.SFJ
\n"
\tQ.EXIT\n"
;
{if(c)
pleaseinputthenumbera:
%d"
switch(a)
caseQ:
c=1;
caseF:
pleaseinputthedifferent-ArriveTimeofarrayTasks\n"
GetTask();
*****************************theresultoffcfs\n"
Number\tArrive\tServer\tStart\tFinish\tTurnove\tTakepowerturnovertime\n"
for(b=0;
b<
b++)/*调用两个函数改变结构体数的值*/
k=fcfs();
d[b]=k;
new(k);
b++)
Printresult(d[b]);
/*调用打印函数打出结果*/
caseS:
printf("
pleaseinputthedifferent-RequestTimeofarrayTasks\n"
******************************theresultofsjf\n"
Number\tArrive\tRequest\tStart\tEnd\tRun\tDQRuntime\n"
k=sjf();
default:
thenumberError.pleaseinputanothernumber!
2时间片轮转法:
#include"
string.h"
#include
"
stdio.h"
conio.h"
graphics.h"
#define
NULL
0
typedef
struct
quen
/*定义结构*/
{
char
pname[8];
int
time1;
time2;
state;
*next;
}
QUEN;
main()/*主程序*/
QUEN
*q,*p,*head,*m;
str[8],f;
t,d,n;
clrscr();
textmode(C80);
textbackground(0);
textcolor(15);
Enterthemaxnumberofnodes(n):
/*输入进程数*/
scanf("
n);
d=n;
if(d>
0)
enterthepname:
%s"
str);
enter
the
need
time:
t);
head=p=(QUEN
*)malloc(sizeof(QUEN));
strcpy(p->
pname,str);
p->
time1=t;
time2=0;
state='
R'
next=NULL;
head=p;
getchar();
--d;
}
while(d>
{/*构建队列表*/
pname:
q=(QUEN
strcpy(q->
q->
next=q;
p=q;
next=head;
q=head;
processnameneedtimerunnedstatic\n"
do{
%s%d%d%c\n"
q->
pname,q->
time1,q->
time2,q->
state);
q=q->
next;
}while(q!
=head);
if(head->
time2<
head->
time1)
{head->
time2++;
if(head->
time2==head->
head->
E'
Therunningprocessis%s\n"
pname);
processnamelefttimerunnedstatic\n"
/*输入队列表*/
%s%d%d%c\n"
q=q->
while(q!
head=head->
else{
do{
printf(“%s%d%d%c\n"
}while(q!
p=p->
Isitneedingnewprocess?
(yorn)\n"
/*是否加入新的进程*/
%c"
f);
if(f=='
Y'
||f=='
y'
){
Enterthenewpname:
Enterthenewneededtime:
m=(QUEN
strcpy(m->
m->
if(q->
next->
state=='
)
{p=m;
head=m;
else{p->
next=m;
p=m;
}}
}}while(q->
state!
='
Theprocessesarefinished\n"
3优先级调度方法:
<
pcb/*定义结构*/
{charname[5];
structpcb*next;
needtime;
priority;
charstate[5];
}NODE;
NODE
*create_process(int
n)/*创建队列*/
{NODE
*head,*s,*t;
time,i=0,j;
pname[5];
head=(NODE
*)malloc(sizeof(NODE));
please
input
process
name:
pname);
strcpy(head->
name,pname);
time);
needtime=time;
priority:
j);
priority=j;
state,"
ready"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 编程 进程 作业 先来先 服务 优先权 按时 轮转 调度 算法