武汉大学第一次操作系统实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编号:
武汉大学计算机学院
课程实验(设计)报告
专业(班):2014级计算机科学与技术4班
学号:*************
*名:***
课程名称:操作系统设计
任课教师:
2016年11月21日
实习题目:设计一个按优先数调度算法实现处理器调度的程序
实习内容及设计思想:
1、设计思路:
1、定义数据结构
2、提示接受用户的输入:进程名、运行时间、优先级,暂存到一个二维数组中
3、将二维数组根据优先级排序
4、将有序数组插入到就绪队列中
5、运行队首进程,显示正在运行的进程,遍历输出就绪队列中的进程
6、运行完毕后,修改运行时间、优先级
若该进程结束,修改状态,从队首移除
若该进程未结束,从队首移除,插入队尾
2、主要数据结构:
1、进程pcb:
进程名name
运行时间time
优先级prio
状态status(就绪1或结束0)
指向下一进程的指针next
2、就绪队列queue:
队首指针front
队尾指针rear
3、暂存用户输入temp[5][3]
运行时间temp[][0]
优先级temp[][1]
进程名temp[][2]
3、主要代码结构及代码段分析:
while(q->rear!=NULL){//队列不为空时循环
printf("正在运行PCB%d\n",q->front->name);//运行队首进程并显示
if(q->front!=q->rear)//如果就绪队列中不止剩当前运行进程
{
s=q->front->next;//从当前运行进程之后遍历输出就绪队列中的进程
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;
}
printf("->PCB%d\n",q->rear->name);//输出队尾进程
}
q->front->time--;//当前进程运行结束
q->front->prio--;//修改该进程运行时间和优先级
if(q->front->time==0)//当前进程运行时间结束
{
q->front->status=0;//修改状态
if(q->front==q->rear)//队列只剩一个
q->front=q->rear=NULL;//就绪队列清空
else
q->front=q->front->next;//从就绪队列中取出
}
else//当前进程未结束
if(q->front!=q->rear)//队列不止一个进程
{
q->rear->next=q->front;//插入队尾
q->rear=q->front;
q->front=q->front->next;//从队首删除
}
}
上机实习所用平台及相关软件:windows10、codeblocks 调试过程:
1、测试数据设计:
2、测试结果分析:
可以正确排序用户输入,遍历输出就绪队列
总结:
1、实习中遇到的问题及解决方法:
一开始没有注意到需要按照优先级简历就绪队列,没有设置暂存数组;
之后设置了暂存数组temp[5][2],没有保存用户输入的进程名,直接用遍历的i+1,
作为进程名,遍历输出就绪队列时永远是顺序;
从就绪队列移除和遍历输出进程时分情况讨论,有时捋不清造成空指针。
2、实习中产生的错误及原因分析:
空指针和没有满足需求,主要是对题目理解和算法流程构建不到位。
3、实习体会及收获
第一个实验较简单,只需了解根据优先级时间片轮转的进程调度情况
源代码:
]=t[0];temp[j+1][1]=t[1];temp[j+1][2]=t[2];
}
/* for(i=0;i<5;i++)
{ for(j=0;j<3;j++)
printf("%d ",temp[i][j]);
printf("\n");
}*/
for(i=0;i<5;i++)//将排序好的数组插入就绪队列
{
pcb *p;
p=(pcb *)malloc(sizeof(pcb));
p->name=temp[i][2];
p->status=1;//初始状态为就绪
p->next=NULL;
p->time=temp[i][0];
p->prio=temp[i][1];
if(q->rear==NULL)//若队列为空,插入第一个进程
q->front=q->rear=p;
else
{
q->rear->next=p;
q->rear=p;
}
}
/*s=q->front->next;
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;
}
printf("->PCB%d\n",q->rear->name);
for(i=0;i<5;i++)
{ for(j=0;j<3;j++)
printf("%d ",temp[i][j]);
printf("\n");
}*/
while(q->rear!=NULL){//队列不为空
printf("正在运行PCB%d\n",q->front->name);
if(q->front!=q->rear)//如果就绪队列中不止剩当前运行进程{
s=q->front->next;//从当前运行进程之后开始遍历
while(s!=q->rear)
{
printf("->PCB%d",s->name);
s=s->next;