操作系统课程设计处理机管理.docx
《操作系统课程设计处理机管理.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计处理机管理.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统课程设计处理机管理
操作系统课程设计
题目:
处理机管理
学生:
XXX
学院:
信息工程学院
系别:
计算机系
专业:
软件工程
班级:
软件09-1
指导教师:
XXX教授
XXX教授
2011年12月30日
XXX大学课程设计任务书
学院(系):
课程名称:
操作系统课程设计指导教师(签名):
专业班级:
软件工程09-1学生:
XXX学号:
XXXXXXXXX
一、课程设计题目
处理机管理
二、课程设计的目的
学生通过设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。
使学生初步具有研究、设计、编制和调试操作系统模块的能力。
三、课程设计的主要容和要求(包括原始数据、技术参数、设计要求、工作量要求等)
原始数据:
进程控制块PCB结构体。
技术参数:
WindowsXP系统,VC++6.0开发工具。
设计要求:
1.设计基于时间片轮转法的处理机调度算法;
2.或设计基于先来先服务或基于优先权的处理机调度算法;
3.画出以上算法流程图;
4.编程实现算法功能;
5.编写课程设计说明书。
工作量要求:
完成以上设计要求中的所有算法功能。
四、工作进度安排
周一:
布置、讲解题目,收集资料;
周二:
系统分析,算法设计;
周三:
编制、调试程序;
周四:
测试系统,形成设计结论,编写课设报告;
周五:
系统与材料验收,课设答辩。
五、主要参考文献
[1]尧学编.计算机操作系统教程(第三版)习题解答与实验指导.:
清华大学,2006
[2]汤子瀛主编.计算机操作系统(第三版).:
电子科技大学,2001
[3]坤等编.操作系统实验教程.:
清华大学,2008
审核批准意见
系(教研室)主任(签字)
第一章系统概述
1.1功能简介
处理机调度是操作系统中非常重要的部分。
在多道程序设计系统中,存中有多道程序运行,他们相互争夺处理机这一重要的资源。
处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
本系统就是设计了一个模拟单处理机调度的算法,以模拟实现处理机调度的基本功能。
本系统是采用时间片轮转算法模拟单处理机调度。
1.2设计思路
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小由输入确定。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间获得一时间片的处理机执行时间。
换言之,系统能在给定的时间响应所有用户的请求。
每个进程用一个进程控制块PCB来代表。
PCB的格式如图1-1所示。
进程名
指针
到达时间
估计运行时间
进程状态
图1-1进程控制块
其中,进程名即进程标识。
第二章系统功能分析和设计
在本章中,主要是介绍各个功能函数的设计思路和实现方法。
2.1系统主要结构模块
本系统主要分为:
主函数,创建进程队列函数,对进程队列按到达时间进行排序,输出所创建的进程信息,执行时间片调度算法。
在程序执行过程过主函数调用各个子函数来一次实现系统的各个功能。
系统主要结构模块如图2-1:
图2-1程序结构模块
2.2创建进程队列功能
在此函数中输入所要创建进程的总个数n,然后再通过for循环语句来控制,依次输入各个进程的属性值,再把刚创建的进程加入进程就绪队列的队尾,循环上述操作n次。
其中,在创建进程的过程中,进程的状态默认为就绪状态s,指向下一进程的指针默认为空NULL。
程序流程图如图2-2所示:
图2-2创建进程队列
2.3对进程排序
此函数的主要功能就是:
按照进程的到达时间进行升序排序,在该函数中采用的排序方法是冒泡排序法。
程序流程图如图2-3所示:
2.4输出所创建的信息
此函数所实现的主要功能就是:
按照进程的到达时间依次输出各个进程的详细信息。
再此函数中,首先定义一个进程控制块指针,指向进程队列中的第一个节点,通过while语句(当p!
=NULL时)来控制p=p->next循环,依次输出进程就绪队列中的各进程的详细信息。
流程图如图2-4所示:
图2-4输出所创建的进程信息
第三章调试与运行结果
3.1输入界面
在此,先输入要创捷的进程总数,然后依次输入各进程的进程名、到达时间、估计运行时间,如图3-1所示:
图3-1输入界面
3.2输出界面
此界面是,输出经过排序后的进程队列,如图3-2所示:
图3-2输出界面
3.3运行结果
输出经过时间片轮转算法后的运行结果,如图3-3所示:
图3-3运行结果
3.4各种情况的运行结果
下图是各种不同情况的运行结果,如图3-4,图3-5,图3-6:
图3-4运行结果
图3-5运行结果
图3-6运行结果
第四章总结
4.1遇到的问题以与解决方法
首先,是对时间片算法以与处理机的具体调度过程不够熟练,通过看书和搜集一些资料解决了这个问题;其次,是在对单链表按到达时间进行排序时遇到了一些麻烦,后来经过认真思考与分析,成功地对单链表进行了排序;最后,是在编写程序的过程中出现了一些语法错误,后通过调试逐一解决。
4.2收获和体会
此次操作系统课程设计,在指导教师的精心教导下,以与同学们的积极讨论中,对处理机的调度问题有了深刻的理解和认识,同时对其它的几个题目也有了一定的了解。
首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。
根据操作系统课程所学的概念、理论和方法,按照程序设计的基本步骤,设计出一个适当规模的程序;进一步加深了对处理机调度问题的理解和掌握。
理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。
我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高实践编程能力。
参考文献:
[1]尧学主编.计算机操作系统教程(第三版).:
清华大学,2006
[2]尧学编.计算机操作系统教程(第三版)习题解答与实验指导.:
清华大学,2006
[3]汤子瀛主编.计算机操作系统(第三版).:
电子科技大学,2001
[4]坤等编.操作系统实验教程.:
清华大学,2008
[5]丽芬等编.操作系统实验教程.:
清华大学,2006
[6]屠祁等编.操作系统基础(第三版).:
清华大学,2000
[7]耀霖等编.操作系统.:
电子科技大学,2001
[8]左万历.计算机操作系统教程(第二版).:
高等教育,2004
附录程序源代码
#include
#include
#include
//定义进程控制块//
typedefstructpcb
{
charpname[20];//进程名
intarrivetime;//到达时间
intruntime;//运行时间
charstate;//运行后的状态
structpcb*next;
}PCB;
//封装头结点,指针分别指向队头和队尾//
typedefstruct
{
PCB*front,*rear;
}queue;
//进程队列置空//
queue*init()
{
queue*head;
head=(queue*)malloc(sizeof(queue));
head->front=NULL;
head->rear=NULL;
returnhead;
}
//检验进程队列是否为空//
intempty(queue*head)
{
return(head->front?
0:
1);
}
//进程队列入队,往后插入//
queue*append(queue*head,charc[20],inta,intr,chars)
{
PCB*p;
p=(PCB*)malloc(sizeof(PCB));
strcpy(p->pname,c);
p->arrivetime=a;
p->runtime=r;
p->state=s;
p->next=NULL;
if(empty(head))
head->front=head->rear=p;
else
{
head->rear->next=p;
head->rear=p;
}
returnhead;
}
//创建进程队列//
queue*creat(queue*head)
{
charc[20];chars='R';
inta,r,i,n;
printf("请输入共有几个进程:
\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请分别输入第%d个进程的进程名、到达时间、估计运行时间:
\n",i);
scanf("%s%d%d",c,&a,&r);
head=append(head,c,a,r,s);
}
returnhead;
}
//按到达时间排序//
queue*sort(queue*head)
{
PCB*h,*p,*r1,*r2,*min=head->front,*max=head->front;intflag;
h=(PCB*)malloc(sizeof(PCB));
h->next=head->front;
while
(1)
{
flag=0;
for(p=h;p->next->next!
=NULL;p=p->next)
{
r1=p->next;
r2=p->next->next;
if(r1->arrivetime>r2->arrivetime)
{
if(r2->arrivetimearrivetime)min=r2;
if(r1->arrivetime>max->arrivetime)max=r1;
flag=1;
p->next=r2;
r1->next=r2->next;
r2->next=r1;
}
}
if(flag==0)
break;
}
head->front=min;head->rear=max;
h->next=head->front;
returnhead;
}
//输出创建的进程队列//
voidprint(queue*head)
{
PCB*p;
p=head->front;
if(!
p)printf("时间片轮转调度队列为空!
\n");
while(p)
{
printf("pname=%sarrivetime=%druntime=%dstate=%c",p->pname,p->arrivetime,p->runtime,p->state);
printf("\n");
p=p->next;
}
}
//时间片轮转调度算法的实现//
voidRR(queue*head,intq)
{
intt=head->front->arrivetime,
lt=head->rear->arrivetime;
if(head->front->runtimet=t+head->front->runtime;
else
t=t+q;
//进程队列不为空才可调度//
while(!
empty(head))
{
PCB*p1,*p2;
/*第一种情况:
当前运行的时间小于最后一个进程到达的时间做以下操作*/
while(t{
p1=head->front;
printf("运行的时刻为%d\t运行的进程为%s\t",t,p1->pname);
p1->runtime=p1->runtime-q;
//1.运行时间小于0,删除队首//
if(p1->runtime<=0)
{
p1->state='C';
printf("运行后的状态为%c\n",p1->state);
head->front=p1->next;
free(p1);
}
//2.运行时间大于0,向后找位置插入//
else
{
printf("运行后的状态为%c\n",p1->state);
p2=p1->next;
while(p2->next&&p2->arrivetime!
=t)
{p2=p2->next;}
/*此时无新进入队列的进程时,有两种情况:
1.不用找位置往后插入,队首不变,不做操作2.找位置往后插入*/
if(p2->arrivetime!
=t)
{
PCB*p3=p1,*p4;
while(p3->next&&p3->arrivetime{p4=p3;p3=p3->next;}
if(p3->arrivetime>t)
{
if(p4!
=p1)//p1插在p4后,头为p1->next
{
head->front=p1->next;
p1->next=p4->next;
p4->next=p1;
}
else//不做操作//
p4=p3=p2=NULL;
}
else
p4=p3=p2=NULL;
}
//此时有新进入队列的进程时:
p1插在新进入队列的进程p2后,队首为p1->next//
else
{
head->front=p1->next;
p1->next=p2->next;
p2->next=p1;
}
}
/*时刻变化*/
if(head->front->runtimet=t+head->front->runtime;
else
t=t+q;
}
//第一种情况结束//
/*第二种情况:
当前运行的时间大于最后一个进程到达的时间做以下操作*/
while(t>=lt)
{
p1=head->front;
printf("运行的时刻为%d\t运行的进程为%s\t",t,p1->pname);
p1->runtime=p1->runtime-q;
//1.运行时间小于0,删除队首//
if(p1->runtime<=0)
{
p1->state='C';
printf("运行后的状态为%c\n",p1->state);
head->front=p1->next;
free(p1);
}
//2.运行时间大于0,直接插在队尾//
else
{
printf("运行后的状态为%c\n",p1->state);
//若原队列只有一个进程,不必往队尾插//
if(!
p1->next)head->front=p1;
//若原队列有多个进程//
else
{
head->front=p1->next;
head->rear->next=p1;
head->rear=p1;
p1->next=NULL;
}
}
/*时刻变化,队列为空时不做时刻变化*/
if(empty(head))return;
else
{
if(head->front->runtimet=t+head->front->runtime;
else
t=t+q;
}
}
//第二种情况结束//
}
}
voidmain()
{
queue*head;intq;
head=init();
head=creat(head);
head=sort(head);
printf("您输入的时间片轮转进程队列为:
\n");
print(head);
printf("请输入时间片轮转调度的时间片为:
\n");
scanf("%d",&q);
RR(head,q);
}