几种进程调度算法模拟C++实现

几种进程调度算法模拟C++实现先到先服务 FCFS

先到先服务(FCFS)最短作业优先调度算法(SJF)

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 1000;//假设能够容纳的进程最多的个数 struct Process {     int pos;                          //代表第几个输入的进程     char Process_name[50];            //进程名字,默认最长长度占用50字符     double Arrival_time;             //进程到达时间     double Service_time;             //服务时间       进程所需要的时间     double Start_time;               //服务开始时间     double End_time;                 //服务结束的时间     double Turnaround_time;          //周转时间    进程结束的时间-进程到达时间     double Weight_Turnaround_time;   //带权周转时间       周转时间 / 服务时间     bool operator < (const Process &a)const     {         if(Service_time == a.Service_time)             return Arrival_time > a.Arrival_time;         return Service_time > a.Service_time;     } }process[MAXN]; int n;                           //进程的数量! bool cmp1(Process &a,Process &b) {     return a.Arrival_time < b.Arrival_time; } void Init() {     printf("请输入进程的数量:");     scanf("%d",&n);     for(int i = 0;i < n;i ++)     {         cout<<"请输入第"< 
       
         %s",process[i].Process_name);     printf("\n");     double time = max(0.0,process[0].Arrival_time);//记录总的时间!     for(int i = 0;i < n;i ++)     {         process[i].Start_time = time;                           //更新开始时间         process[i].End_time = time + process[i].Service_time;   //更新结束时间         process[i].Turnaround_time = process[i].End_time - process[i].Arrival_time; //更新周转时间         process[i].Weight_Turnaround_time = process[i].Turnaround_time / process[i].Service_time;  //更新带权周转时间         time += process[i].Service_time;         if(i != n-1)   //当这时的结束时间小于下一个进程的到达时间的话,就要重新更新time             time = max(time,process[i+1].Arrival_time);     }     printf("name\tarrive_time\tservice_time\tstart_time\tend_time\tTA_time\tWTA_time\n");     for(int i= 0;i < n;i ++)           printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t%.2lf\n",process[i].Process_name,process[i].Arrival_time,process[i].Service_time,process[i].Start_time,process[i].End_time,process[i].Turnaround_time,process[i].Weight_Turnaround_time); //    for(int i= 0;i < index;i ++) //        cout< 
        
          que;     sort(process,process+n,cmp1);     bool vis[MAXN];      //表示这个进程有没有在完成,完成使用true表示     Process ans[MAXN];     double time = max(0.0,process[0].Arrival_time);int index = 0;     memset(vis,false,sizeof(vis));     //首先将第一个放到优先队列中!     que.push(process[0]);vis[process[0].pos] = 1;     for(int i = 0;i < n;i ++)     {         while(!que.empty())         {             Process temp = que.top();   que.pop();             temp.Start_time = time;temp.End_time = time + temp.Service_time;temp.Turnaround_time = temp.End_time - temp.Arrival_time;             temp.Weight_Turnaround_time = temp.Turnaround_time / temp.Service_time;             for(int j = 0;j< n;j ++)                 if(!vis[process[j].pos] && process[j].Arrival_time <= temp.End_time)                 {                     vis[process[j].pos] = 1;                     que.push(process[j]);                 }             time += temp.Service_time;       //这里面的时间都是有联系的,所以不用再次更新time             ans[index++] = temp;             //将顺序存储到最终的答案序列中         }         bool flag = false; //判断是否所有的进程都已经完成         for(int j = 0;j < n;j ++)             if(!vis[process[j].pos])             {                 que.push(process[j]);//将一个时间最靠前的添加到队列中                 time = process[j].Arrival_time;   //这里就要更新time了,因为这里的时间和上面的有些脱节!                 flag = true;break;             }         if(!flag) break;     }     printf("进程的运行顺序为:\n");     printf("%s",ans[0].Process_name);     for(int i = 1;i < n;i ++)         printf("-->%s",ans[i].Process_name);     printf("\n");     printf("name\tarrive_time\tservice_time\tstart_time\tend_time\tTA_time\tWTA_time\n");     for(int i= 0;i < n;i ++)         printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\t%.2lf\n",ans[i].Process_name,ans[i].Arrival_time,ans[i].Service_time,ans[i].Start_time,ans[i].End_time,ans[i].Turnaround_time,ans[i].Weight_Turnaround_time); //    for(int i= 0;i < index;i ++) //        cout< 
          
         
        
       
      
     
    
  

高响应比优先调度

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 1000; int n; struct Process { int pos; //代表第几个输入的进程 char Process_name[50]; //进程名字,默认最长长度占用50字符 double Arrival_time; //进程到达时间 double Service_time; //服务时间 进程所需要的时间 double Start_time; //服务开始时间 double End_time; //服务结束的时间 double Priority; //优先级 bool operator < (const Process &a)const { if(Priority == a.Priority) return Arrival_time > a.Arrival_time; return Priority < a.Priority; } }process[MAXN]; void Init() { printf("请输入进程的数量:"); scanf("%d",&n); for(int i = 0;i < n;i ++) { cout<<"请输入第"< 
       
         que; sort(process,process+n,cmp1); bool vis[MAXN]; //表示这个进程有没有在完成,完成使用true表示 Process ans[MAXN]; double time = max(0.0,process[0].Arrival_time);int index = 0; memset(vis,false,sizeof(vis)); //首先将第一个放到优先队列中! que.push(process[0]);vis[process[0].pos] = 1; for(int i = 0;i < n;i ++) { while(!que.empty()) { Process temp = que.top(); que.pop(); temp.Start_time = time;temp.End_time = time + temp.Service_time; for(int j = 0;j < n;j ++) if(!vis[process[j].pos] && process[j].Arrival_time <= temp.End_time) { vis[process[j].pos] = 1; que.push(process[j]); } time += temp.Service_time; //这里面的时间都是有联系的,所以不用再次更新time ans[index++] = temp; //将顺序存储到最终的答案序列中 Process need[MAXN];int tot = 0; while(!que.empty()) //首先将进程转移的need数组中 { temp = que.top();que.pop();need[tot++] = temp; } for(int j = 0;j < tot;j ++) //更新后面的Priority { need[j].Priority = (time - need[j].Arrival_time + need[j].Service_time)/ need[j].Service_time; que.push(need[j]); } } bool flag = false; //判断是否所有的进程都已经完成 for(int j = 0;j < n;j ++) if(!vis[process[j].pos]) { que.push(process[j]);//将一个时间最靠前的添加到队列中 time = process[j].Arrival_time; //这里就要更新time了,因为这里的时间和上面的有些脱节! flag = true;break; } if(!flag) break; } printf("进程的运行顺序为:\n"); printf("%s",ans[0].Process_name); for(int i = 1;i < n;i ++) printf("-->%s",ans[i].Process_name); printf("\n"); printf("name\tarrive_time\tservice_time\tstart_time\tend_time\n"); for(int i= 0;i < index;i ++) printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\n",ans[i].Process_name,ans[i].Arrival_time,ans[i].Service_time,ans[i].Start_time,ans[i].End_time); // for(int i= 0;i < index;i ++) // cout< 
         
        
       
      
     
    
  

抢占式优先比调度算法

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 1000; int n; struct Process { int pos; //代表第几个输入的进程 char Process_name[50]; //进程名字,默认最长长度占用50字符 double Arrival_time; //进程到达时间 double Service_time; //服务时间 进程所需要的时间 double Start_time; //服务开始时间 double End_time; //服务结束的时间 double Priority; //优先权,这里面的优先级权是不能修改的!!! bool operator < (const Process &a)const { if(Priority == a.Priority) return Arrival_time > a.Arrival_time; return Priority < a.Priority; } }process[MAXN]; void Init() { printf("请输入进程的数量:"); scanf("%d",&n); for(int i = 0;i < n;i ++) { cout<<"请输入第"< 
       
         que; sort(process,process+n,cmp1); bool vis[MAXN]; //表示这个进程有没有在完成,完成使用true表示 Process ans[MAXN]; double time = max(0.0,process[0].Arrival_time);int index = 0; memset(vis,false,sizeof(vis)); //首先将第一个放到优先队列中! que.push(process[0]);vis[process[0].pos] = 1; for(int i = 0;i < n;i ++) { while(!que.empty()) { bool ok = false; Process temp = que.top();que.pop(); //在temp的服务时间中,如果有新的优先权高的进程出现,那么就先执行优先权更高的进程,暂停这一段进程,并且更新这个进程所需要的时间等等 temp.Start_time = time;temp.End_time = time + temp.Service_time; for(int j = 0;j < n;j ++) {//在当前优先队列中的优先权永远是要小于当前执行的优先权的,那么我们只需要判断vis为false的就可以了! if(!vis[process[j].pos] && process[j].Priority > temp.Priority && process[j].Arrival_time < temp.End_time) { ok = true; vis[process[j].pos] = 1; que.push(process[j]); temp.End_time = process[j].Arrival_time; ans[index++] = temp; temp.Service_time = time + temp.Service_time - temp.End_time;//更新当前的服务时间 que.push(temp); time = process[j].Arrival_time; break; } } for(int j = 0;j < n;j ++)//将这段时间内时间已经满足要求,但是优先权不是很高的添加到队列中! { if(!vis[process[j].pos] && process[j].Arrival_time <= temp.End_time) { vis[process[j].pos] = 1; que.push(process[j]); } } if(!ok) //表示这个执行过程中没有打断的其它进程到来 { time += temp.Service_time; ans[index++] = temp; } } bool flag = false; //判断是否所有的进程都已经完成 for(int j = 0;j < n;j ++) if(!vis[process[j].pos]) { vis[process[j].pos] = 1; que.push(process[j]);//将一个时间最靠前的添加到队列中 time = process[j].Arrival_time; //这里就要更新time了,因为这里的时间和上面的有些脱节! flag = true;break; } if(!flag) break; } printf("进程的运行顺序为:\n"); printf("%s",ans[0].Process_name); for(int i = 1;i < index;i ++) printf("-->%s",ans[i].Process_name); printf("\n"); printf("name\tarrive_time\tservice_time\tstart_time\tend_time\n"); for(int i= 0;i < index;i ++) printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\n",ans[i].Process_name,ans[i].Arrival_time,ans[i].Service_time,ans[i].Start_time,ans[i].End_time); //for(int i= 0;i < index;i ++) // cout< 
         
        
       
      
     
    
  

时间片轮转调度算法

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        using namespace std; const int MAXN = 1000;//假设能够容纳的进程最多的个数 struct Process { int pos; //代表第几个输入的进程 char Process_name[50]; //进程名字,默认最长长度占用50字符 double Arrival_time; //进程到达时间 double Service_time; //服务时间 进程所需要的时间 double Start_time; //服务开始时间 double End_time; //服务结束的时间 double Turnaround_time; //周转时间 进程结束的时间-进程到达时间 double Weight_Turnaround_time; //带权周转时间 周转时间 / 服务时间 }process[MAXN]; double every_time; int n; void Init() { printf("请输入时间片的时间:"); scanf("%lf",&every_time); printf("请输入进程的数量:"); scanf("%d",&n); for(int i = 0;i < n;i ++) { cout<<"请输入第"< 
       
         que; sort(process,process+n,cmp1); bool vis[MAXN]; //表示这个进程有没有在完成,完成使用true表示 Process ans[MAXN]; double time = max(0.0,process[0].Arrival_time);int index = 0; memset(vis,false,sizeof(vis)); que.push(process[0]);vis[process[0].pos] = 1; for(int i = 0;i < n;i ++) { while(!que.empty()) { Process temp = que.front(); que.pop(); temp.Start_time = time; temp.End_time = temp.Service_time >= every_time ? time + every_time : time + temp.Service_time; for(int j = 0;j < n;j ++) if(!vis[process[j].pos] && process[j].Arrival_time <= temp.End_time) { vis[process[j].pos] = 1; que.push(process[j]); } if(temp.Service_time > every_time) { temp.Service_time -= every_time; que.push(temp); time += every_time; } else time += temp.Service_time; //这里面的时间都是有联系的,所以不用再次更新time ans[index++] = temp; //将顺序存储到最终的答案序列中 } bool flag = false; //判断是否所有的进程都已经完成 for(int j = 0;j < n;j ++) if(!vis[process[j].pos]) { que.push(process[j]);//将一个时间最靠前的添加到队列中 time = process[j].Arrival_time; //这里就要更新time了,因为这里的时间和上面的有些脱节! flag = true;break; } if(!flag) break; } printf("进程的运行顺序为:\n"); printf("%s",ans[0].Process_name); for(int i = 1;i < index;i ++) printf("-->%s",ans[i].Process_name); printf("\n"); printf("name\tarrive_time\tservice_time\tstart_time\tend_time\n"); for(int i= 0;i < index;i ++) printf("%s\t%.2lf\t\t%.2lf\t\t%.2lf\t\t%.2lf\n",ans[i].Process_name,ans[i].Arrival_time,ans[i].Service_time,ans[i].Start_time,ans[i].End_time); // for(int i= 0;i < index;i ++) // cout< 
         
        
       
      
     
    
  

写在后面

只是单纯的模拟实现,如果有错误,感谢大家的指正

一学期的操作系统实验,上机时间只有周六周天两天,写给我那三流院校计算机学院的樊院长,那剩下的只能在课下找时间完成,这个作为第一个题用了大约半天多的时间,主要是最短作业优先的写完了之后后面的都是和最短作业优先的方法很是类似了,只需要更改一下循环里面的函数就可以了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226600.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:33
下一篇 2026年3月16日 下午10:34


相关推荐

  • 常见的服务器架构入门:从单体架构、EAI 到 SOA 再到微服务和 ServiceMesh

    常见的服务器架构入门:从单体架构、EAI 到 SOA 再到微服务和 ServiceMesh1 单体架构 将所有业务的表现层 业务逻辑层 数据访问层放在一个工程中最终部署在一台服务器 2 垂直架构 按业务场景拆分为互不相干的单体架构项目 3 前后端分离 前端关注页面样式与动态数据的解析及渲染 后端专注于具体业务逻辑 4 EAI 架构 连通与集成相互独立的异构系统 解决信息孤岛的问题 5 SOA 架构 将各系统的不同功能单元抽象为服务 服务间通过标准的接口协议连接 从而到达复用 6 微服务 SOA 思想的一种提炼 强调业务系统彻底的组件化和服务化 7 微服务 2 0 由服务网格以代理的方式建立稳定的通信

    2026年3月19日
    2
  • 【Linux学习】Linux命令卸载软件

    【Linux学习】Linux命令卸载软件1、打开一个终端,输入dpkg–list,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。2、在终端中找到你需要卸载的软件的名称,列表是按照首字母排序的。3、在终端上输入命令sudoapt-get–purgeremove包名(–purge是可选项,写上这个属性是将软件及其配置文件一并删除,如不需要删除配置文件,可执行sudoapt-getremove包名),此处我要删除的是polipo,那么在终端输入sudoapt-get–purgeremovep

    2025年10月14日
    7
  • 三行代码递归实现二叉树层序遍历

    三行代码递归实现二叉树层序遍历简述二叉树的层序遍历网上大部分都是使用队列的出队和入队来实现的,这次我用三行代码递归实现二叉树的层序遍历.层序下图是一个简单的二叉树,层序就是一行一行的往下读取,这个二叉树的层序结果便是:1234567(图画的比较丑,强迫症看着难受,看官忍一下)递归分析要想使用递归,必须有两个条件:函数参数类型相同递归必须有出口在二叉树中找到上面的两个条件,与

    2022年5月21日
    34
  • http.sys的简单应用

    http.sys的简单应用//publicvoidRun()//{////httpListener提供一个简单,可通过编程方式控制的Http协议侦听器。此类不能被继承。//if(!HttpListener.Is

    2022年7月1日
    27
  • 表白代码Python_自制表白神器

    表白代码Python_自制表白神器文章目录前言演示网站制作部署网站二维码制作总结前言跟着我做,不要跳着看,否则你会失败。第一步是制作二维码;第二步是制作网站。演示具体成果地址:https://yanghanwen.xyz/ai/网站制作首先你需要下载我的这个完整项目:链接:https://pan.baidu.com/s/1EmRehx_gRnT5hLjJvKuAIg提取码:pz1y–来自百度网盘超级会员V2的分享下载好后文件目录如下:然后你需要注意的是我把img里面的图片删了,涉及隐私,大家自己替换自己追

    2022年8月23日
    11
  • leapftp乱码_如何用网格本做笔记

    leapftp乱码_如何用网格本做笔记生活对我下了手2019年7月23星期二大晴天1.主要掌握怎么连接服务器2.单个文件上传3.整个文件夹上传leapftp界面主要功能板块介绍1.管理ftp服务器配置的地方2.服务器网站文件窗口界面3.上传状态的窗口界面4.正在上传的文件窗口界面5.本地电脑文件窗口界面怎么连接ftp服务器服务器上要有ftp服务,1.你要有ftp服务器的账号,2.你要有ftp服务器的密…

    2025年7月10日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号