操作系统——实验一(先来先服务算法和短作业优先算法)

操作系统实验报告一

[实验题目]

先来先服务FCFS和短作业优先SJF调度算法

[实验目的]

通过本次实验,加深对进程概念的理解,进一步掌握对进程状态转变、进程调度策略及对系统性能的评价方法。

[实验内容]

编程实现如下内容:

1.先来先服务算法; 

2.短进程优先算法;

3.根据调度顺序计算所有作业的平均周转时间及平均带权周转时间。

代码如下:

1.    先来先服务算法

2.    短进程优先算法:

感悟:首先不要畏难,要有勇气去敲这个算法,然后就是按部就班的把该敲得代码,该实现的功能通过自己最熟悉的语言实现出来。

#include <bits/stdc++.h>
using namespace std;
struct tt{
    int id;//进程名字
    int dt;// 到达时间
    int ft;//服务时间
    int wt;//完成时间
    double z;//周转时间
    double d;//带权周转时间

}st[100];
bool cmp(tt x,tt y){//按照到达时间从小到大排序
    return x.dt<y.dt;
}
bool cmp1(tt x,tt y){//按照服务时间从小到大排序
    return x.ft<y.ft;
}
void wt(int n){//计算完成时间
    for(int i=0;i<n;i++){
        if(i==0){
            st[i].wt=st[i].ft+st[i].dt;
        }else{
            if(st[i-1].wt<st[i].dt){
                st[i].wt=st[i].ft+st[i].dt;
            }else{
                st[i].wt=st[i-1].wt+st[i].ft;
            }
        }
    }
}
void zt(int n){//计算周转时间
    for(int i=0;i<n;i++){
        st[i].z=st[i].wt-st[i].dt;
    }
}
void dzt(int n){//计算带权周转时间
    for(int i=0;i<n;i++){
        st[i].d=st[i].z/(st[i].ft*1.0);
    }
}
double ave_z(int n){//计算平均周转时间
    double sum=0;
    for(int i=0;i<n;i++){
        sum=sum+st[i].z;
    }
    return sum/(double)n;
}
double ave_d(int n){//计算平均带权周转时间
    double sum=0;
    for(int i=0;i<n;i++){
        sum=sum+st[i].d;
    }
    return sum/(double)n;
}
int main()
{
    int i;
    int n;
    int x;
    double a=0;
    double b=0;
    cout<<"请输入作业(进程)个数:(n<=100)"<<endl;
    cin>>n;
    cout<<"*************************************"<<endl;
    cout<<"请输入作业号、到达时间、 服务时间"<<endl;
    for(i=0;i<n;i++){
        cin>>st[i].id>>st[i].dt>>st[i].ft;
    }
    cout<<"*************************************"<<endl;
    cout<<"请选择算法“1-FCFS,2-SJF”"<<endl;
    cin>>x;
    if(x==1){
        sort(st,st+n,cmp);
        wt(n);
        zt(n);
        dzt(n);
        a=ave_z(n);
        b=ave_d(n);
        printf("进程名   到达时间  服务时间  完成时间  周转时间  带权周转时间\n");
	for(int i=0;i<n;i++){
	printf("   %2d       %2d        %2d        %2d        %2.1lf         %2.1f\n",st[i].id,st[i].dt,st[i].ft,st[i].wt,st[i].z,st[i].d);
	}
	printf("平均周转时间: %lf\n",a);
	printf("平均带权周转时间:%lf\n",b);



    }else if(x==2){
        sort(st,st+n,cmp);
        sort(st+1,st+n,cmp1);
        wt(n);
        zt(n);
        dzt(n);
        a=ave_z(n);
        b=ave_d(n);
        printf("进程名   到达时间  服务时间  完成时间  周转时间  带权周转时间\n");
	for(int i=0;i<n;i++){
	printf("   %2d       %2d        %2d        %2d        %2.1lf         %2.1f\n",st[i].id,st[i].dt,st[i].ft,st[i].wt,st[i].z,st[i].d);
	}
	printf("平均周转时间: %lf\n",a);
	printf("平均带权周转时间:%lf\n",b);

    }else{
        cout<<"输入错误,退出程序。"<<endl;
    }
}

  • 14
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值