プロセススケジューリングアルゴリズムのシミュレーションと実装

プロセス管理

プロセス管理は、オペレーティング システムの重要な機能です。プロセスの作成、プロセスのキャンセル、プロセスの状態遷移の実装に使用され、実行可能なプロセス間で CPU を多重化する方法を提供します。マルチプログラミング システムでは同時に複数のプロセスが準備完了状態にあることが多いため、プロセス管理ではプロセス スケジューリングが中心となります。準備完了プロセスの数がプロセッサの数よりも多い場合は、次に従って決定する必要があります。特定の戦略では、プロセスがプロセッサーよりも優先されます。

スケジュールアルゴリズム

プロセスの並列実行を可能にするプロセス スケジューラを作成し、一般的に使用されるプロセス (ジョブ) スケジューリング アルゴリズムから少なくとも 2 つを選択します: 先着順アルゴリズム、タイム スライス ローテーション方式、最高応答率優先アルゴリズム、高優先順位スケジューリング アルゴリズムはシミュレーションを実行し、平均所要時間と平均加重所要時間を出力します。
このシミュレーションのアルゴリズムは次のとおりです: 先着順、非プリエンプティブ静的優先順位アルゴリズム

ソースコード

  • 早い者勝ち
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <ctype.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
#define maxn 100
using namespace std;

typedef struct Node{
    char name;
    double daoda;
    double yunxing;
    double youxian;
    double start;
    double end;
    double zhouzhuan;
    double daiquan;
}PCB;
PCB pcb[maxn]; 

bool cmp(Node a,Node b){
    return a.daoda < b.daoda;
}

//平均 
double T;
double S;
int n;//进程数量


void First(){
    cout<<endl;
    cout<<"\t\t先来先服务算法:"<<endl;
    cout<<endl;
    sort(pcb,pcb+n,cmp);//把进程根据到达的时间从小到达进行排序
    cout<<"进程运行的顺序为:"<<endl;
    cout<<pcb[0].name;
    for(int i=1;i<n;i++){
        cout<<"-->"<<pcb[i].name;
    }
    cout<<endl;
    
    double time = max(0.0,pcb[0].daoda);
    
    double t = 0;//保存周转时间的和 
    double s = 0;  //保存带权周转时间和
     
    for(int i=0;i<n;i++){
        pcb[i].start = time;
        pcb[i].end = time + pcb[i].yunxing;
        pcb[i].zhouzhuan = pcb[i].end - pcb[i].daoda;
        pcb[i].daiquan = pcb[i].zhouzhuan / pcb[i].yunxing;
        time += pcb[i].yunxing;
        
        //当这时的结束时间小于下一个进程的到达时间的话,就要重新更新time
        if(i != n-1){
            time = max(time,pcb[i+1].daoda);
        }
        //求两个和 
        t += pcb[i].zhouzhuan;
        s += pcb[i].daiquan;
        
    }
    T = t / n;
    S = s / n;
    cout<<"平均周转时间:"<<T<<endl;
    cout<<"平均带权周转时间:"<<S<<endl;
}

int main()
{
    int i;
    
    cout<<"输入进程个数:"<<endl;
    cin >> n;
    
    cout<<"输入各个进程名字\到达时间,运行时间及优先级:"<<endl;
    
    for(i=0;i<n;i++){
        cin>>pcb[i].name>>pcb[i].daoda>>pcb[i].yunxing>>pcb[i].youxian;
    } 
    cout<<"显示各个进程的参数:"<<endl;
    cout<<"进程名"<<"\t"<<"   到达时间"<<"\t"<<"   运行时间"<<"\t"<<"   优先级"<<endl;
    
    for(i=0;i<n;i++){
        cout<<"Job"<<i+1<<"\t\t"<<pcb[i].daoda<<"\t\t"<<pcb[i].yunxing<<"\t\t"<<pcb[i].youxian<<endl;
    } 
    
    First();
    T = 0;
    S = 0;
	return 0;
}

  • 非プリエンプティブ静的優先度
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <ctype.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
#define maxn 100
using namespace std;

typedef struct Node{
    char name;
    double daoda;
    double yunxing;
    double youxian;
    double start;
    double end;
    double zhouzhuan;
    double daiquan;
}PCB;
PCB pcb[maxn]; 

//平均 
double T;
double S;
int n;//进程数量


//根据到达的时间先进行排序一次 
bool cmp1(Node a,Node b){
	return a.daoda < b.daoda; 
}
//根据优先级进行排序 
bool cmp2(Node a,Node b){
	return a.youxian > b.youxian; 
}
//非抢占 静态优先级 
void jingtaiyouxianji()
{
	sort(pcb,pcb+n,cmp1);
	cout<<"===============静态非抢占式优先级调度算法==============="<<endl;
	//先要执行第一个到达的进程
	//time为记录的总时间 
	double time = max(0.0,pcb[0].daoda); 
	time += pcb[0].yunxing;
	int cnt = 0;
	double t = 0,s = 0;
	for(int i=1;i<n;i++){
		//判断当前时间是否大于后面的进程的到达时间 
		if(time > pcb[i].daoda){
			cnt++;
		}
		//根据进程的优先级进行排序 
		sort(pcb+i,pcb+cnt+i,cmp2);
		
		pcb[i].start = time;
        pcb[i].end = time + pcb[i].yunxing;
        pcb[i].zhouzhuan = pcb[i].end - pcb[i].daoda;
        pcb[i].daiquan = pcb[i].zhouzhuan / pcb[i].yunxing;
        
		//更新一下当前总时间 
		time += pcb[i].yunxing;
		
		//求两个和 
        t += pcb[i].zhouzhuan;
        s += pcb[i].daiquan;      
    }
    
    T = t / n;
    S = s / n;
    cout<<"平均周转时间:"<<T<<endl;
    cout<<"平均带权周转时间:"<<S<<endl;
	
}
int main()
{
	int i;
    
    cout<<"输入进程个数:"<<endl;
    cin >> n;
    
    cout<<"输入各个进程名字\到达时间,运行时间及优先级:"<<endl;
    
    for(i=0;i<n;i++){
        cin>>pcb[i].name>>pcb[i].daoda>>pcb[i].yunxing>>pcb[i].youxian;
    } 
    
    cout<<"显示各个进程的参数:"<<endl;
    cout<<"进程名"<<"\t"<<"   到达时间"<<"\t"<<"   运行时间"<<"\t"<<"   优先级"<<endl;
    
    for(i=0;i<n;i++){
        cout<<"Job"<<i+1<<"\t\t"<<pcb[i].daoda<<"\t\t"<<pcb[i].yunxing<<"\t\t"<<pcb[i].youxian<<endl;
    } 
    
    jingtaiyouxianji();
    
	return 0;
}

おすすめ

転載: blog.csdn.net/xiaoning9299/article/details/90415615