进程调度算法磁盘调度算法银行家算法操作系统课程设Word格式文档下载.docx
《进程调度算法磁盘调度算法银行家算法操作系统课程设Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《进程调度算法磁盘调度算法银行家算法操作系统课程设Word格式文档下载.docx(37页珍藏版)》请在冰豆网上搜索。
一.进程调度算法4-----23页
二.银行家算法24-----34页
三.磁盘调度算法35------46页
进程调度算法
1.设计目的
在多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略决定哪个进程优先占有处理机,因而必须解决进程调度的问题,进程调度算法就是要解决进程调度的问题。
2.任务及要求
2.1设计任务
设计程序来模拟进程的四种调度算法,模拟实现调度的基本功能。
2.2设计要求
产生的各种随机数要加以限制,如alltime限制在40以内的整数。
进程的数量n不能取值过大。
3.算法及数据结构
3.1算法的总体思想(流程)
每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:
(1)进程优先数ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。
(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。
(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。
(4)进程总共需要运行时间Alltime,利用随机函数产生。
(5)进程状态,0:
就绪态;
1:
运行态;
2:
阻塞态。
利用链表将数据连接起来,实现数据的存储。
3.2链表模块
3.2.1功能
实现链表的存储功能,以及实现存储的查找功能。
3.2.2数据结构
构造链表这个数据结构,以及链表的初始化,链表的插入,链表的长度。
3.2.3算法
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
StatusInitList(SqList&
l)
{
l.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
l.elem)exit(OVERFLOW);
l.length=0;
l.listsize=LIST_INIT_SIZE;
returnOK;
}
intListLength(SqListl)
return(l.length);
StatusListInsert_Sq(SqList&
L,inti,ElemTypee){
//在顺序表L的第i个位置前插入元素e,i的合法值为1..L.length+1
if(i<
1||i>
L.length+1)
returnERROR;
if(L.length>
=L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
ElemType*q=&
L.elem[i-1],*p=&
L.elem[L.length-1];
while(p>
=q)
*(p+1)=*p;
--p;
}//插入位置后的元素右移
*q=e;
++L.length;
StatusGetElem(SqListL,inti,ElemType&
e)
=0||i>
L.length)
returnERROR;
else
e=*(L.elem+i-1);
voidOutputlist(SqList&
L)
if(0==L.length)
printf("
空集!
"
);
for(inti=0;
i<
L.length;
++i)
{
printf("
%c"
*(L.elem+i));
}
3.3主函数模块
3.3.1功能
实现进程调度的四种算法,以及人机交互的菜单。
3.3.2数据结构
主要包括五个部分,分别是四种算法,和进程的输入和菜单部分,功能分别实现。
3.3.3算法
voidmain()
for(1;
;
){
intnumber;
PCBpcb[100];
srand(time(0));
intmax;
intppp[100];
inttime=0;
inttime1;
intm;
inta[100];
a[0]=0;
\n*************************进程调度算法的模拟***************************\n"
*1.先到先服务调度2.最短作业优先调度*\n"
*3.优先权调度4.轮转发调度*\n"
**********************************************************************"
\n请选择调度的方法:
"
scanf("
%d"
&
m);
if(m!
=1&
&
m!
=2&
=3&
=4)
{
输入错误!
重新输入:
if(m!
printf("
if(m!
{
printf("
}
}
}
请输入进程的个数:
number);
\n开始时用户进程均为就绪状态,运行时间随机产生\n\n"
SqListsq;
InitList(sq);
for(intr=0;
r<
number;
r++)
pcb[r].CPUtime=0;
for(inti=0;
i++)
pcb[i].Priority=rand()%50;
while
(1)
if(pcb[i].Priority<
20)
pcb[i].Priority=rand()%50;
else
break;
pcb[i].Alltime=rand()%40;
if(pcb[i].Alltime<
10)
pcb[i].Alltime=rand()%40;
}
else
break;
for(intj=0;
j<
j++)
ListLength(sq);
ListInsert_Sq(sq,ListLength(sq),pcb[i]);
if(m==1)
\n****************程序演示开始*****************\n"
intcoun=0;
//计数变量
intwait[100];
//等待时间数组
wait[0]=0;
intAllwait=0;
for(inti1=0;
i1<
i1++)
下面开始调用第%d个进程;
\n"
i1);
开始时间为%d执行时间为%d\n"
coun,pcb[i1].Alltime);
coun+=pcb[i1].Alltime;
if(i1!
=0)
{
wait[i1]=pcb[i1-1].Alltime+wait[i1-1];
}
for(inti2=0;
i2<
i2++)
Allwait=wait[i2]+Allwait;
平均等待时间为:
%d\n"
Allwait/number);
if(m==2)
intmin=pcb[0].Alltime;
intwait1[100];
wait1[0]=0;
intin=0;
intcoun1=0;
*****************最短作业优先调度!
********************\n"
cout<
<
进程所需时间分别是:
endl;
for(i=0;
cout<
pcb[i].Alltime<
进程调度的顺序为:
min=50;
for(j=0;
if(pcb[j].Alltime<
min)
min=pcb[j].Alltime;
in=j;
}
%d"
in+1);
pcb[in].Alltime+=50;
if(m==3)
ID优先级运行总时间进程状态\n"
for(intk=0;
k<
k++)
%d%d%d就绪\n"
k+1,pcb[k].Priority,pcb[k].Alltime);
\n***********************程序调度演示开始***********************\n"
for(intf=1;
f<
1000;
f++)
intcount=0,count1=0;
for(inti=0;
ppp[i]=pcb[i].Priority;
if(p