武汉大学第一次操作系统实验

  • 格式:docx
  • 大小:89.26 KB
  • 文档页数:7

下载文档原格式

  / 7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;