计算机操作系统2.docx
《计算机操作系统2.docx》由会员分享,可在线阅读,更多相关《计算机操作系统2.docx(10页珍藏版)》请在冰豆网上搜索。
![计算机操作系统2.docx](https://file1.bdocx.com/fileroot1/2022-11/23/ba82f69c-ed1c-47b4-8f82-e5e56c8f1f76/ba82f69c-ed1c-47b4-8f82-e5e56c8f1f761.gif)
计算机操作系统2
计算机操作系统实验报告
姓名:
班别:
学号:
一,实验题目:
进程(处理器)调度
二,实验目的:
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。
本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三,实验内容:
设计一个按优先数调度算法(即把处理机分配给优先数最高的进程)的程序。
[提示]:
(1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
到达时间
要求运行时间
优先数
进程状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
进程到达时间――进程的输入时间。
要求运行时间——假设进程需要运行的单位时间数。
以时间片为单位进行。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
可以事先人为指定,也可以求随机函数产生。
状态——可假设有两种状态,“就绪”状态和“结束”状态。
五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2)在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(4)处理器调度总是选队首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:
在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。
在这里省去了这些工作。
(5)进程运行一次后,若要求运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
(6)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(7)在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
要求:
为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
四,实验步聚:
(1)明确设计思路。
(2)编写程序。
(3)输入数据,程序显示结果。
五,实验结果:
六,实验总结:
本次实验做的是进程的调度。
通过这次实验,我知道了进程的到达时间,优先级在进程调度中的作用。
在不同的进程同时要处理时,系统如果通过判断进程的优先级和到达时间来优先给调度进程。
七,附录
#include
#include
#include
#definePCBSIZE5
typedefstruct//存放PCB
{
charname[5];
intarrtime;
intruntime;
intpriority;
charstatus;
}PCB;
typedefstructNode//带PCB结构的队列
{
PCBpcb;
structNode*next;
}Node,*QNode;
inttime=0;
PCB*InitPCB()//初始化进程
{
PCB*p=(PCB*)malloc(PCBSIZE*sizeof(PCB));
printf("namearriverunpriority\n");
for(inti=0;i{
strcpy(p[i].name,"pcb");
itoa(i+1,&p[i].name[3],10);
printf("%s",p[i].name);
scanf("%d",&p[i].arrtime);
scanf("%d",&p[i].runtime);
scanf("%d",&p[i].priority);
p[i].status='R';
}
returnp;
}
QNodeEnQNode(PCB*p,QNodeq,int&count)//将到达时间=time的pcb添加到队列中
{
if(count==5)
returnq;
QNodeLastNode,NewNode;
for(inti=0;i{
if(p[i].arrtime==time)
{
count++;
if(!
q->next)
{
NewNode=(QNode)malloc(sizeof(Node));
NewNode->pcb=p[i];
NewNode->next=NULL;
q->next=NewNode;
NewNode=NewNode->next;
}
else
{
for(LastNode=q;LastNode->next&&LastNode->next->pcb.priority>=p[i].priority;LastNode=LastNode->next);
NewNode=(QNode)malloc(sizeof(Node));
NewNode->pcb=p[i];
NewNode->next=LastNode->next;
LastNode->next=NewNode;
}
}
}
returnq;
}
QNodeInitQNode(PCB*p)//初始化队列
{
QNodeFirstNode=(QNode)malloc(sizeof(Node));
FirstNode->next=NULL;
returnFirstNode;
}
QNodeRun(QNodeq)//队首进程运行
{
if(q->next)
{
q->next->pcb.priority--;
q->next->pcb.runtime--;
if(q->next->pcb.runtime==0)
q->next->pcb.status='E';
}
returnq;
}
QNodeSchedule(PCB*p,QNodeq)//调整队列
{
QNodeLastNode;
if(q->next)//若队首的status为"E"则将队首移除队列,否则调整队列顺序
{
QNoder=q->next;
q->next=q->next->next;
if(r->pcb.status=='E')
{
free(r);
}
else
{
for(LastNode=q;LastNode->next&&LastNode->next->pcb.priority>=r->pcb.priority;LastNode=LastNode->next);
r->next=LastNode->next;
LastNode->next=r;
}
}
returnq;
}
voidPrintQNode(QNodeq)//打印队列信息
{
QNoder;
printf("namearriverunprioritystatus\n",time);
for(r=q->next;r;r=r->next)
{
printf("%s%d%d%d%c\n",r->pcb.name,r->pcb.arrtime,r->pcb.runtime,r->pcb.priority,r->pcb.status);
}
}
intmain()
{
PCB*p;
QNodeq;
intcount=0;
p=InitPCB();
q=InitQNode(p);
while(count!
=PCBSIZE||q->next)
{
printf("time=%d\n",time);
EnQNode(p,q,count);
printf("beforerunning:
\n");
PrintQNode(q);
time++;
q=Run(q);
printf("afterrunning:
\n");
PrintQNode(q);
q=Schedule(p,q);
system("pause");
}
printf("Thetotalruntimeis%d\n",time);
return0;
}