作業系統——實驗一(先來先服務演算法和短作業優先演算法)
阿新 • • 發佈:2019-01-30
作業系統實驗報告一
[實驗題目]
先來先服務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; } }