实验1 单通道程序运行耗时程序
1、实验目的
通过书本例题,三道程序运行时,计算多通道运行消耗的时间以及处理机调度程序进行程序状态转换耗费时间。
2、实验思路
多道程序并行处理机制,当优先级高的程序占用计算通道时,下一优先级程序等待,当优先级高的程序占用io通道时,次高优先级的程序就可以占用计算通道,以此类推,以节约多程序总体运行时间。
3、实验内容
实验程序
#include <iostream>
using namespace std;
class process
{
public:
int priority;//优先级
int runtime_1;//计算第一次时间
int iotime;//io通道占用时间
int runtime_2;//第二次计算时间
int end;//进程结束标志
process(int x,int y,int z,int k,int m);
};
process::process(int x,int y,int z,int k,int m)
{
priority=x;
runtime_1=y;
iotime=z;
runtime_2=k;
end=m;
}
int Time_1(process a, process b, process c)//三个进程ABC
{
int T = 0;//开始时将T清零
T=T+a.runtime_1;//加上第一次a进程计算时间
if(a.priority>b.priority)//比较a、b两进程优先级
{
T+=a.iotime+a.runtime_2;//加上a进程第二次计算时间和io通道占用时间
a.end=0;//a进程结束
}
if(a.end==0)//当a进程结束时
T+=(b.runtime_1-a.iotime);// b进程第一次计算时间减进程aio通道占用时间
if(b.priority>c.priority&&b.iotime>c.runtime_1&&b.iotime<c.iotime)//计算通道可以与io通道并行计算
{
T+=(b.iotime+b.runtime_2);
b.end=0;
}
if(b.end==0)//当b进程结束
T=T+(c.iotime-b.runtime_2)+c.runtime_2;
return T;
}
int Time_2(process a, process b, process c)//加入状态转换的时间
{
int T = 0;
T=T+a.runtime_1+1;
if(a.priority>b.priority)
{
T+=a.iotime+1+a.runtime_2+1;
a.end=0;
}
if(a.end==0)
T+=(b.runtime_1-a.iotime)+2;
if(b.priority>c.priority&&b.iotime>c.runtime_1&&b.iotime<c.iotime)
{
T+=(b.iotime+b.runtime_2)+2;
b.end=0;
}
if(b.end==0)
T=T+(c.iotime-b.runtime_2)+c.runtime_2+3;
return T;
}
int main()
{
int T=0;
process a(3,30,40,10,1),b(2,60,30,10,1),c(1,20,40,20,1);
cout<<"三个进程消耗时间为:"<<Time_1(a, b, c)<<"ms"<<endl;
cout<<"加入程序状态转换时间后三个进程消耗时间为:"<<Time_2(a, b, c)<<"ms"<<endl;
}
4、实验结果
5、总结思考
通过本次实验掌握了单通道程序运行耗时程序,通过书本例题,三道程序运行时,计算多通道运行消耗的时间以及处理机调度程序进行程序状态转换耗费时间,从而更进一步的学习操作系统。
实验2 进程调度算法
1、实验目的
了解熟悉先来先服务和短作业优先两个进程调度算法的内容并使用
2、设计思路
创建进程类,定义时间排序函数(先来先服务)和内存大小排序函数(短作业优先),将abc三个进程放入算法中进行排序
3、实验内容
实验程序
#include<iostream>
#include<algorithm>
using namespace std;
class pcb
{
public:
int runtime;//运行时间
int arrivetime;//到达时间
int reg;//内存占用大小
char name;
pcb(int x,int y,int z,char n);
};
pcb::pcb(int x,int y,int z,char n)
{
runtime=x;
arrivetime=y;
reg=z;
name=n;
}
pcb arriveque[3]={pcb(20,6,30,'a'),pcb(30,4,50,'b'),pcb(10,8,5,'c')};//到达时间排序队列
pcb regque[3]={pcb(20,6,30,'a'),pcb(30,4,50,'b'),pcb(10,8,5,'c')};//内存大小排序队列
//到达时间排序
void timesort(pcb x[3])
{
int i,j;
pcb temp(0,0,0,'x');
for(i=0;i<2;i++)
{
for(j=0;j<2-i;j++)
{
if(x[j].arrivetime>x[j+1].arrivetime)
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
cout<<"此时运行顺序为:"<<endl;
for(int m=0;m<3;m++)
cout<<arriveque[m].name<<"到达"<<endl;
for( i= 0; i < 3; i++)
cout<<x[i].name<<"运行"<<" "<<x[i].name<<"运行结束"<<endl;
}
//内存大小排序
void regsort(pcb x[3],pcb y[3])
{
int i,j;
pcb temp(0,0,0,'x');
for(i=0;i<3;i++)
{
for(j=0;j<2-i;j++)
{
if(x[j].reg>x[j+1].reg)
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
cout<<"此时运行顺序为:"<<endl;
for(int m=0;m<3;m++)
cout<<arriveque[m].name<<"到达"<<endl;
for( i= 0; i < 3; i++)
cout<<x[i].name<<"运行"<<" "<<x[i].name<<"运行结束"<<endl;
}
int main()
{
cout<<"**********请选择要进行的功能:**********"<<endl;
cout<<"**********1.展示目前进程信息**********"<<endl;
cout<<"**********2.先来先服务**************"<<endl;
cout<<"**********3.短作业优先**************"<<endl;
cout<<"**********4.退出**************"<<endl;
int n;
int t,y;
while(1)
{
int i=0;
cout<<endl;
cout<<"请输入你的选择"<<endl;
cin>>n;
switch(n)
{
case 1:
cout<<"进程名"<<" "<<"运行时间"<<" "<<"到达时间"<<" "<<"存储大小"<<endl;
for( i=0;i<3;i++)
cout<<arriveque[i].name<<" "<<arriveque[i].runtime<<" "<<
arriveque[i].arrivetime<<" "<<arriveque[i].reg<<endl;
break;
case 2:
timesort(arriveque);
break;
case 3:
regsort(regque,arriveque);
break;
case 4:
exit(0);
}
}
return 0;
}
4、实验结果
5、总结思考
通过本次实验掌握了进程调度算法,了解熟悉先来先服务和短作业优先两个进程调度算法的内容并使用,从而更好的学习操作系统。