操作系统实习报告.docx
《操作系统实习报告.docx》由会员分享,可在线阅读,更多相关《操作系统实习报告.docx(8页珍藏版)》请在冰豆网上搜索。
操作系统实习报告
2011年秋—操作系统小学期
《操作系统小学期》
实习报告
成绩:
评阅人:
学院:
信息科学与技术
专业:
计算机科学与技术
年级:
2008级
班级:
信080班
姓名:
学号:
2003
日期:
2011年9月
一、问题描述
1.分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟;
2.编写允许进程并行执行的进程调度程序,在常用的进程(作业)调度算法:
先来先服务算法、短作业优先算法、最高响应比优先算法、高优先权优先算法等调度算法中至少选择三种调度算法进行模拟,并输出平均周转时间和平均带权周转时间。
二、问题分析
1、进程管理是操作系统的职能之一,主要是对处理机进行管理。
为了提高CPU的利用率而采用多道程续技术。
通过进程管理来协调多道程序之间的关系,使CPU得到充分的利用。
2、在问题的解决过程中,用到了三种算法:
首先用到了先来先服务算法,通过sort函数判断各个进程的的到达时间,并将先到达的进程先运行;其次用到了最短作业优先算法,首先将第一个进程先运行,然后从第二个开始判断时间长短,将短作业先运行;最后用到了最高响应比优先算法,每次运行完一个进程之后将剩余进程重新比较优先级,将优先级高的进程先运行;然后用deal函数求出周转时间的总和和带权周转时间的总和,并将二者除以总数N(此处我设置的是3)后输出。
三、数据模型描述
算法中需要的数据结构:
#defineN3//一个宏定义,将N的值定义为3
structtime;//定义的一个结构,其中包含五个时间变量和一个名称变量
用到的辅助函数:
voidInputTime//输入作业名、到达时间、运行时间的函数
voidPrint//帮助输出运行次序及平均周转时间和平均带权周转时间的函数
voidsort//将到达时间早的进程排在作业队列的前面
voiddeal//求出周转时间和带权周转时间之和
四、算法描述
1解题算法的设计思路介绍
a、先来先服务算法(FCFS):
安服务请求的顺序处理请求。
b、短作业优先算法(SJF):
对预计执行时间短的作业(进程)优先分派处理机。
c、高响应比算法(TRRF):
把CPU分配给就绪队列中响应比最高的进程。
2、程序结构、模块划分
Main()函数
sort()函数
deal()函数
FCFS算法
SWF算法
TRRF算法
3、主要程序代码
#include
#defineN3
structtime{
floatarriveTime;
floatrunTime;
floatfinishTime;
floattotalTime;
floatweightTotalTime;
charname;
};//定义一个时间结构
voidInputTime(time*p)
{
inti;//counter
cout<<"inputname&arrivetime&runtime:
"<for(i=0;i<=N-1;i++){
floattemp1,temp2;
charname;
cout<<"作业名:
"<cin>>name;
p[i].name=name;
cout<<"到达时:
"<cin>>temp1;
p[i].arriveTime=temp1;
cout<<"运行时间:
"<cin>>temp2;
p[i].runTime=temp2;
}
}//输入时间函数,用于输入作业名、到达进程名、运行时间
voidPrint(time*p,floattotalTimeSum,floatweightTotalTimeSum){
cout<<"运行次序:
";
for(intk=0;k<=N-1;k++)
{
cout<
}
cout<cout<<"平均周转时间:
"<cout<<"平均带权周转时间:
"<}//输出函数,用于输出运行次序、平均周转时间和平均带权周转时间
voidsort(time*p)
{
for(inti=0;i<=N-1;i++)
for(intj=0;j<=i;j++)
if(p[i].arriveTime
{
timetemp;
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
}//将先到达的进程排在前面
voiddeal(time*p,float&totalTimeSum,float&weightTotalTimeSum)
{intk;//counter
for(k=0;k<=N-1;k++)
{
if(k==0)
p[k].finishTime=p[k].arriveTime+p[k].runTime;
else
p[k].finishTime=p[k-1].finishTime+p[k].runTime;
}
for(k=0;k<=N-1;k++)
{
p[k].totalTime=p[k].finishTime-p[k].arriveTime;
p[k].weightTotalTime=p[k].totalTime/p[k].runTime;
totalTimeSum+=p[k].totalTime;
weightTotalTimeSum+=p[k].weightTotalTime;
}
}//用于计算周转时间和带权周转时间之和
voidFCFS(time*p)
{
floattotalTimeSum=0,weightTotalTimeSum=0;
sort(p);
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"先来先服务:
"<Print(p,totalTimeSum,weightTotalTimeSum);
}//先来先服务算法,p标识进程
voidSWF(time*p)
{
floattotalTimeSum=0,weightTotalTimeSum=0;
sort(p);
for(intm=0;m{
if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;
inti=0;
for(intn=m+1;n<=N-1;n++)
{if(p[n].arriveTime<=p[m].finishTime)
i++;
}
floatmin=p[m+1].runTime;
intfollow=m+1;
for(intk=m+1;k{
if(p[k+1].runTime{min=p[k+1].runTime;
follow=k+1;}
}
timetemp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"短作业优先:
"<Print(p,totalTimeSum,weightTotalTimeSum);
}//短作业优先算法,p标识进程
voidTRRF(time*p){
floattotalTimeSum=0,weightTotalTimeSum=0;
sort(p);
for(intm=0;m{
if(m==0)
p[m].finishTime=p[m].arriveTime+p[m].runTime;
else
p[m].finishTime=p[m-1].finishTime+p[m].runTime;
inti=0;
for(intn=m+1;n<=N-1;n++)
{
if(p[n].arriveTime<=p[m].finishTime)
i++;
}
floatmax=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;
intfollow=m+1;
for(intk=m+1;k{
if(max<=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime){max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;
follow=k+1;
}
}
timetemp;
temp=p[m+1];
p[m+1]=p[follow];
p[follow]=temp;
}
deal(p,totalTimeSum,weightTotalTimeSum);
cout<<"最高响应比优先:
"<Print(p,totalTimeSum,weightTotalTimeSum);
}//最高响应比优先算法,p标识进程
voidmain(){
timea[N];
InputTime(a);
time*b=a;time*c=a;
FCFS(a);
SWF(b);
TRRF(c);
}
五、运行结果
六、实习心得
本次实习是模拟操作系统的实现,我做的是其中的进程管理,其中用了三种进程管理算法:
先来先服务算法、短作业优先算法和高响应比优先算法,这几个原理以前学的时候感觉挺简单,但实现起来就有些力不从心了,其中第一个是最容易实现的,第三个是最难实现的,但编程过程中遇到的问题我都通过网上查资料和与同学讨论一一解决了。
通过这次课程设计,使我又一次深刻体会到了编程的简单与困难,加深了对编程的喜爱,对以后的就业情况有了进一步的认识。