操作系统——进程调度模拟实验

用 C++语言实现对 N (N=5)个进程的调度模拟,可以采用如先到先服务FCFS,简单轮转法 Round Robin、 优先权高者优先算法 Highest Priority First,高响应比优先调度算法HRRN 等,运行结果显示了模拟调度算法的具体过程和给出了周转时间和平均周转时间的结果。

这里我只是用了普通的数组来实现的,较简单,实现的功能也比较少。本人三流学校大三还是编程菜鸟,这也是我在博客园的第一篇博客,各位大佬将就着看看,有什么建议也希望你们能不吝赐教!
以下是具体实现代码和调试结果:

#include<iostream>
#include<stdio.h>
using namespace std;
int rr()
{
int l=1;
int d=0;
int b[6];
int running[6];
int arrivetime[6];
cout<<"输入进程工作所需时间 running 队列"<<endl;
for(int i=1;i<=5;i++)
{
cin>>running[i];
}
cout<<"输入进程到达时间 arrivetime 队列"<<endl;
for(int i=1;i<=5;i++)
{
cin>>arrivetime[i];
}
int k=0;
for(int m=1;m<6;m++)
{
k=k+running[m];
}
for(int j=1;j<=k;j++)
{
if(l>=6)
{
l=l%5;
if(l==0)
{
l=5;
}
if(running[l]==0)
{
bool x=false;
for(int c=l+1;c<6;c++)
{
if(running[c]!=0)
{
running[c]--;
x=true;
break;
}
}
if(x==false)
{
for(int c=1;c<l;c++)
{
if(running[c]!=0)
{
running[c]--;
break;
}
}
}
l=l+1;
}
else
{
running[l]--;
l=l+1;
}
}
else
{
if(running[l]==0)
{
bool x=false;
for(int c=l+1;c<6;c++)
{
if(running[c]!=0)
{
running[c]--;
x=true;
break;
}
}
if(x==false)
{
for(int c=1;c<l;c++)
{
if(running[c]!=0)
{
running[c]--;
break;
}
}
}
l=l+1;
}
else
{
running[l]--;
l=l+1;
}
}
cout<<"完成第"<<j<<"个时间片的情况是:"<<endl;
cout<<"running 队列"<<endl;
for(int f=1;f<6;f++)
{
cout<<running[f]<<'\t';
if(running[f]==0)
{
b[f]=j-arrivetime[f];
running[f]=-1;
}
}
cout<<'\n'<<"arrivetime 队列"<<endl;
for(int r=1;r<6;r++)
{
cout<<arrivetime[r]<<'\t';
}
cout<<'\n';
}
cout<<"周转时间队列为:"<<endl;
for(int u=1;u<6;u++)
{
cout<<b[u]<<'\t';
d=d+b[u];
}
cout<<'\n';
cout<<"平均周转时间为:"<<d/5<<endl;
cout<<"进程共需运行"<<k<<"个时间片这么长时间"<<endl;
return 0;
}

int fcfs()
{
int h=0;
double b[6];
int running[6];
int arrivetime[6];
cout<<"输入进程工作所需时间 running 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>running[i];
}
cout<<"输入进程到达时间 arrivetime 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>arrivetime[i];
}
int a=arrivetime[1];
for(int j=1;j<6;j++)
{
a=a+running[j];
running[j]=0;
b[j]=a-arrivetime[j];
cout<<"第"<<j<<"个进程结束的时间是"<<a<<endl;
cout<<"running 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<running[k]<<'\t';
if(running[k]==0)
{
running[k]=-1;
}
}
cout<<'\n'<<"arrivetime 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<arrivetime[k]<<'\t';
}
cout<<'\n';
}
cout<<"周转时间队列为:"<<endl;
for(int j=1;j<6;j++)
{
cout<<b[j]<<'\t';
h=h+b[j];
}
cout<<'\n';
cout<<"平均周转时间为:"<<h/5<<endl;
return 0;
}

int hpf()
{
int d=0;
int b[6];
int running[6];
int arrivetime[6];
int por[6];
int r;
cout<<"输入进程工作所需时间 running 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>running[i];
}
cout<<"输入进程到达时间 arrivetime 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>arrivetime[i];
}
int a=arrivetime[1];
cout<<"输入进程优先级 priority 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>por[i];
}
por[1]=0;
r=running[1];
running[1]=0;
b[1]=r-arrivetime[1];
cout<<"第1个进程结束的时间是"<<r<<endl;
cout<<"running 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<running[k]<<'\t';
if(running[k]==0)
{
running[k]=-1;
}
}
cout<<'\n';
cout<<"priority 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<por[k]<<'\t';
}
for(int j=2;j<6;j++)
{
int q=2;
int w=q;
for(int p=3;p<6;p++)
{
if(por[w]<por[p])
{
w=p;
}
}
r=r+running[w];
b[w]=r-arrivetime[w];
por[w]=0;
running[w]=0;
cout<<'\n';
cout<<"第"<<j<<"个进程结束的时间是"<<r<<endl;
cout<<"running 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<running[k]<<'\t';
if(running[k]==0)
{
running[k]=-1;
}
}
cout<<'\n';
cout<<"priority 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<por[k]<<'\t';
}
}
cout<<'\n';
cout<<"周转时间队列为:"<<endl;
for(int u=1;u<6;u++)
{
cout<<b[u]<<'\t';
d=d+b[u];
}
cout<<'\n';
cout<<"平均周转时间为:"<<d/5<<endl;
return 0;
}

int hrrn()
{
double d=0;
double b[6];
double running[6];
double arrive[6];
double por[6];
cout<<"输入进程工作所需时间 running 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>running[i];
}
cout<<"输入进程到达时间 arrivetime 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>arrive[i];
}
cout<<"输入进程优先级 priority 队列"<<endl;
for(int i=1;i<6;i++)
{
cin>>por[i];
}
double r;
r=running[1]+arrive[1];
b[1]=r-arrive[1];
cout<<"第1个进程结束的时间是"<<r<<endl;
running[1]=0;
cout<<"running 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<running[k]<<'\t';
if(running[k]==0)
{
running[k]=-1;
}
}
cout<<'\n'<<"arrivetime 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<arrive[k]<<'\t';
}
cout<<'\n'<<"priority 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<por[k]<<'\t';
}
for(int g=2;g<6;g++)
{
por[g]=(r-arrive[g]+running[g])/running[g];
}
for(int j=2;j<6;j++)
{
int q=2;
int w=q;
for(int p=3;p<6;p++)
{
if(por[w]<por[p])
{
w=p;
}
}
r=r+running[w];
b[w]=r-arrive[w];
running[w]=0;
cout<<'\n'<<"第"<<j<<"个进程结束的时间是"<<r<<endl;
cout<<"running 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<running[k]<<'\t';
if(running[k]==0)
{
running[k]=-1;
}
}
cout<<'\n'<<"arrivetime 队列为"<<endl;
for(int k=1;k<6;k++)
{
cout<<arrive[k]<<'\t';
}
cout<<'\n'<<"priority 队列为"<<endl;
for(int k=1;k<6;k++)
{
if(running[k]==-1)
{
por[k]=0;
}
cout<<por[k]<<'\t';
}
por[w]=0;
for(int g=2;g<6;g++)
{
if(running[g]==0)
{
por[g]=0;
}
else
por[g]=(r-arrive[g]+running[g])/running[g];
}
}
cout<<'\n';
cout<<"周转时间队列为:"<<endl;
for(int u=1;u<6;u++)
{
cout<<b[u]<<'\t';
d=d+b[u];
}
cout<<'\n';
cout<<"平均周转时间为:"<<d/5<<endl;
return 0;
}

int main()
{
int c;
while(true)
{
cout<<"1:先来先服务调度算法"<<endl;
cout<<"2:优先级调度算法"<<endl;
cout<<"3:时间片调度算法"<<endl;
cout<<"4:高响应比调度算法"<<endl;
cout<<"请输入序号:"<<endl;
cin>>c;
switch(c)
{
case 1:fcfs();
break;
case 2:hpf();
break;
case 3:rr();
break;
case 4:hrrn();
break;
default:cout<<"输入有误,重新输入!"<<endl;
break;
}
}
return 0;
}

 

转载于:https://www.cnblogs.com/CIan-722/p/6088842.html

【实验目的】 1. 理解进程的概念,熟悉进程的组成; 2. 用高级语言编写和调试一个进程调度程序,以加深对进程调度算法的理解。 【实验准备】 1. 几种进程调度算法  短进程调度算法  高优权优调度算法服务调度算法  基于时间片的轮转调度算法 2. 进程的组成  进程控制块(PCB)  程序段  数据段 3. 进程的基本状态  就绪W(Wait)  执行R(Run)  阻塞B(Block) 【实验内容】 1. 例题 设计一个有 N个进程共行的进程调度程序。 进程调度算法采用最高优数优调度算法(即把处理机分配给优数最高的进程)和服务算法。 每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优数、到达时间、需要运行时间、已用CPU时间、进程状态等等。进程的优数及需要的运行时间可以事人为地指定(也可以由随机产生)。进程的到达时间为进程输入的时间。进程的运行时间以时间片为单位进行计算。每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优数减1(即降低一级),然后把它插入就绪队列等待CPU。每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都完成为止。 4. 实验题目  编写并调试一个模拟进程调度程序,采用“最高优数优调度算法对五个进程进行调度。“最高优数优调度算法的基本思想是把CPU分配给就绪队列中优数最高的进程。静态优数是在创建进程时确定的,并在整个进程运行期间不再改变。动态优数是指进程的优数在创建进程时可以给定一个初始值,并且可以按一定原则修改优数。例如在进程获得一次CPU后就将其优数减少1。或者,进程等待的时间超过某一时限时增加其优数的值,等等。  编写并调试一个模拟进程调度程序,采用“轮转法”调度算法对五个进程进行调度。轮转法可以是简单轮转法、可变时间片轮转法,或多队列轮转法。简单轮转法的基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还为完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值