进程调度算法模拟与实现

进程管理

进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用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;
}

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实验目的 调度的实质是操作系统按照某种预定的策略来分配资源。进程调度的目的是分配CPU资源。由于进程调度程序执行的频率很高,因此调度算法的好坏直接影响到操作系统的性能。本实验的目的是编程模拟实现几种常用进程调度算法,通过对几组进程分别使用不同的调度算法,计进程的平均周转时间和平均带权周转时间,比较各种算法的性能优劣。 2. 实验原理 [1]. 进程调度算法描述 进程调度算法包括先来先服务调度算法、最短作业时间优先(抢占式和非抢占式)、最高响应比调度算法4种。(每个人必须做FCFS,然后在后面的三种中任选一种,即每个人必须做2种调度算法模拟。) [2]. 衡量算法性能的参数 计进程的平均周转时间和平均带权周转时间。 3. 实验内容 (1)编程实现本实验的程序,要求: [1]. 建立进程进程控制块,进程控制块至少包括: a) 进程名称; b) 进程需要执行时间; c) 进入就绪队列时间; d) 进程执行开始时间 e) 进程执行结束时间 [2]. 编程实现调度算法。 [3]. 进程及相关信息的输入。这些信息可以直接从键盘上输入,也可以从文件读取。 [4]. 时间片与时间流逝的模拟。本实验需要对算法的执行计时,程序应该提供计时间的方法。一种最简单的方法是使用键盘,比如每敲一次空格代表一个时间片的流逝。另一种方法是使用系统时钟。 [5]. 一组进程序列执行完毕,打印出结果信息。程序需要计出每个进程的开始执行时间、结束时间、周转时间和带权周转时间,并为整个进程序列计平均周转时间和平均带权周转时间。程序将计结果按一定的格式显示在计机屏幕上或输出到文件中。打印出进程调度顺序图。 [6]. 实现数据在磁盘文件上的存取功能。 (2)对下列就绪进程序列分别使用上面的几种算法进行调度,计每种算法下的平均周转时间和平均带权周转时间。 进程号 到达时间 要求执行时间 0 0 1 1 1 35 2 2 10 3 3 5 4 6 9 5 7 21 6 9 35 7 11 23 8 12 42 9 13 1 10 14 7 11 20 5 12 23 3 13 24 22 14 25 31

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值