(操作系统)进程管理系统(fcfs、SPN、HRRN)

简介: 一.实验目的1、理解进程调度的基本概念。2、掌握常用进程调度算法的基本过程。3、能够编程模拟进程调度的实现过程。二.使用的设备和仪器计算机+Windows XP +Visual C++6.0/vc2010三.实验内容及要求编程实现进程调度算法的基本过程,设计要求:1、能够选择进程调度算法(先来先服务、短进程优先算法和高响应比优先算法)。2、可以输入进程数目(至少3个进程),以及各进程的提交时间和运行时间。3、能够显示调度过程及相应时间。

一些基础的代码:


//输入进程
void setpcb(){
  printf("请输入%d个进程\n",max);
  for(int i=0;i<max;i++){
    MY_PCB[i].id=i+1;
    printf("\n请输入第%d个进程的 提交时间:",i+1);
    scanf("%lf",&MY_PCB[i].updata);
    getchar();
    printf("\n请输入第%d个进程的 运行时间:",i+1);
    scanf("%lf",&MY_PCB[i].runtime);
    getchar();
  }
}
//输出结果
void output(){
  printf("==========================================================================================================\n");
  printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n");
  for(int i=0;i<max;++i){
    printf("%d\t %.4f\t %.4f\t\t  %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[i].id,MY_PCB[i].updata,MY_PCB[i].runtime,MY_PCB[i].starttime,MY_PCB[i].endtime,MY_PCB[i].turnover,MY_PCB[i].q_turnover);
  }
  double x=0,y=0;
  for(int i=0;i<max;i++){
    x+=MY_PCB[i].turnover;
    y+=MY_PCB[i].q_turnover;
  }
  printf("\n平均周转\t 平均带权周转\n");
  printf("%.4lf \t\t  ",x/max);
  printf("%.4lf\n",y/max);
  printf("==========================================================================================================\n");
}
//菜单
void menu(){
  printf("*********************************************************************\n");
  printf("\t\t  欢迎使用进程管理系统\n");
  printf("\t\t\t0.退出系统\n");
  printf("\t\t\t1.先来先服务\n");
  printf("\t\t\t2.短进程优先\n");
  printf("\t\t\t3.高响应比优先\n");
  printf("*********************************************************************\n");
}


先来先服务算法


/******************************   先来先服务           ********************************/
void fcfs(){
  setpcb();
  //根据提交时间选择排序
  for(int i=0;i<max;i++){
    for(int j=i;j<max;j++){
      if(MY_PCB[i].updata>MY_PCB[j].updata){
        PCB tep=MY_PCB[i];
        MY_PCB[i]=MY_PCB[j];
        MY_PCB[j]=tep;
      }
    }
  }
  //核心的计算过程
  for(int i=0;i<max;i++){
    if(i==0){
      MY_PCB[i].starttime=MY_PCB[i].updata;//第一个进程的开始时间就是提交时间
    }else{//第n个进程的开始时间就是提交时间和n-1个进程的结束时间有关系
      if(MY_PCB[i].updata<=MY_PCB[i-1].endtime){//提交时间小于等于结束时间,则开始时间就是上一个的结束时间
        MY_PCB[i].starttime=MY_PCB[i-1].endtime;
      }else{
        MY_PCB[i].starttime = MY_PCB[i].updata;
      }
    }
    MY_PCB[i].endtime=MY_PCB[i].starttime + MY_PCB[i].runtime;
    MY_PCB[i].turnover = (MY_PCB[i].endtime - MY_PCB[i].updata);
    MY_PCB[i].q_turnover = MY_PCB[i].turnover/MY_PCB[i].runtime;
  }
  printf("先来先服务的结果:\n");
  //输出结果
  output();
  system("pause");
}


短进程优先


/******************************   短进程优先           ********************************/
void SPN(){
  double teptime=0;//临时时间
  int l_count=1;//开始的下标
  int count=0;//结束的下表
  setpcb();
//根据提交时间早的前提下选出运行时间少的排序方法
  for(int i=0;i<max;i++){
    for(int j=i;j<max;j++){
      if(MY_PCB[i].updata>MY_PCB[j].updata){
        PCB tep=MY_PCB[i];
        MY_PCB[i]=MY_PCB[j];
        MY_PCB[j]=tep;
      }else if(MY_PCB[i].updata==MY_PCB[j].updata){
        if(MY_PCB[i].runtime>MY_PCB[j].runtime){
          PCB tep=MY_PCB[i];
          MY_PCB[i]=MY_PCB[j];
          MY_PCB[j]=tep;
        }
      }
    }
  }
  //先运行第一个进程
  printf("短进程优先的结果:\n");
  printf("==========================================================================================================\n");
  printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n");
  MY_PCB[0].starttime=MY_PCB[0].updata;
  MY_PCB[0].endtime=MY_PCB[0].starttime+MY_PCB[0].runtime;
  MY_PCB[0].turnover=MY_PCB[0].endtime - MY_PCB[0].updata;
  MY_PCB[0].q_turnover=MY_PCB[0].turnover/MY_PCB[0].runtime;
  printf("%d\t %.4f\t %.4f\t\t  %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[0].id,MY_PCB[0].updata,MY_PCB[0].runtime,MY_PCB[0].starttime,MY_PCB[0].endtime,MY_PCB[0].turnover,MY_PCB[0].q_turnover);
  //统计时间内有多少个程序
  teptime+=MY_PCB[0].endtime;
  while(count<max-1){//只要没完就继续计算下去
    for(int i=l_count;i<max;i++){
      if(teptime>=MY_PCB[i].updata)count++;
    }
    //在count个内运行时间少的先运行
    for(int i=l_count;i<=count;i++){
      for(int j=i;j<=count;j++){
        if(MY_PCB[i].runtime>=MY_PCB[j].runtime){
          PCB tep=MY_PCB[i];
          MY_PCB[i]=MY_PCB[j];
          MY_PCB[j]=tep;
        }
      }
    }
  //输出相应的值
    for(int i=l_count;i<=count;i++){
      if(teptime<MY_PCB[i-1].endtime)teptime=MY_PCB[i-1].endtime;
      MY_PCB[i].starttime=teptime;
      MY_PCB[i].endtime=MY_PCB[i].starttime+MY_PCB[i].runtime;
      MY_PCB[i].turnover=MY_PCB[i].endtime - MY_PCB[i].updata;
      MY_PCB[i].q_turnover=MY_PCB[i].turnover/MY_PCB[i].runtime;
      printf("%d\t %.4f\t %.4f\t\t  %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[i].id,MY_PCB[i].updata,MY_PCB[i].runtime,MY_PCB[i].starttime,MY_PCB[i].endtime,MY_PCB[i].turnover,MY_PCB[i].q_turnover);
    }
    l_count=count;
  }//while(max-count-1>0)
  double x=0,y=0;
  for(int i=0;i<max;i++){
    x+=MY_PCB[i].turnover;
    y+=MY_PCB[i].q_turnover;
  }
  printf("\n平均周转\t 平均带权周转\n");
  printf("%.4lf \t\t  ",x/max);
  printf("%.4lf\n",y/max);
  printf("==========================================================================================================\n");
  system("pause");
}


相应比高者优先


/******************************   相应比高者优先       ********************************/
void HRRN(){
  double teptime=0;//临时时间
  int l_count=1;//开始的下标
  int count=0;//结束的下表
  setpcb();
//根据提交时间早的排序方法
  for(int i=0;i<max;i++){
    for(int j=i;j<max;j++){
      if(MY_PCB[i].updata>MY_PCB[j].updata){
        PCB tep=MY_PCB[i];
        MY_PCB[i]=MY_PCB[j];
        MY_PCB[j]=tep;
      }else if(MY_PCB[i].updata==MY_PCB[j].updata){
        if(MY_PCB[i].runtime>MY_PCB[j].runtime){
          PCB tep=MY_PCB[i];
          MY_PCB[i]=MY_PCB[j];
          MY_PCB[j]=tep;
        }
      }
    }//
  }
  //先运行第一个进程
  printf("相应比高者优先的结果:\n");
  printf("==========================================================================================================\n");
  printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n");
  MY_PCB[0].starttime=MY_PCB[0].updata;
  MY_PCB[0].endtime=MY_PCB[0].starttime+MY_PCB[0].runtime;
  MY_PCB[0].turnover=MY_PCB[0].endtime - MY_PCB[0].updata;
  MY_PCB[0].q_turnover=MY_PCB[0].turnover/MY_PCB[0].runtime;
  printf("%d\t %.4f\t %.4f\t\t  %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[0].id,MY_PCB[0].updata,MY_PCB[0].runtime,MY_PCB[0].starttime,MY_PCB[0].endtime,MY_PCB[0].turnover,MY_PCB[0].q_turnover);
  //统计时间内有多少个程序
  teptime+=MY_PCB[0].endtime;
  while(count<max-1){//只要没完就继续计算下去
    for(int i=l_count;i<max;i++){
      if(teptime>=MY_PCB[i].updata)count++;//统计在时间内的所有进程
    }
    //统计相应比做高的那一个
    for(int i=l_count;i<=count;i++){
      for(int j=i;j<=count;j++){
        //计算R
        if((teptime-MY_PCB[i].updata)/MY_PCB[i].runtime < (teptime-MY_PCB[i].updata)/MY_PCB[j].runtime){
          PCB tep=MY_PCB[i];
          MY_PCB[i]=MY_PCB[j];
          MY_PCB[j]=tep;
        }
      }
    }
  //输出相应的值
      MY_PCB[l_count].starttime=teptime;
      MY_PCB[l_count].endtime=MY_PCB[l_count].starttime+MY_PCB[l_count].runtime;
      MY_PCB[l_count].turnover=MY_PCB[l_count].endtime - MY_PCB[l_count].updata;
      MY_PCB[l_count].q_turnover=MY_PCB[l_count].turnover/MY_PCB[l_count].runtime;
      printf("%d\t %.4f\t %.4f\t\t  %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[l_count].id,MY_PCB[l_count].updata,MY_PCB[l_count].runtime,MY_PCB[l_count].starttime,MY_PCB[l_count].endtime,MY_PCB[l_count].turnover,MY_PCB[l_count].q_turnover);
    teptime+=MY_PCB[l_count].runtime;
    l_count++;
    count=l_count-1;
  }//while(max-count-1>0)
  double x=0,y=0;
  for(int i=0;i<max;i++){
    x+=MY_PCB[i].turnover;
    y+=MY_PCB[i].q_turnover;
  }
  printf("\n平均周转\t 平均带权周转\n");
  printf("%.4lf \t\t  ",x/max);
  printf("%.4lf\n",y/max);
  printf("==========================================================================================================\n");
  system("pause");
}


实验图片以及结果:


0d1be51649cc491db79f9e7118001e59.png


40c7f65c61eb45de9ec1187ffc0b636a.png

目录
打赏
0
0
0
0
0
分享
相关文章
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
69 30
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
135 1
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
54 17
操作系统控制台-健康守护我们的系统
阿里云操作系统控制平台作为新一代云端服务器中枢平台,通过创新交互模式重构主机管理体验。用户可通过API、SDK、CLI等方式进行系统管理,采用图形化控制替代传统命令行操作,集智能运维、集群协调、生态扩展于一体,显著提升企业级IT设施管理效能。通过此平台,用户可以轻松实现运维监控、智能助手、扩展插件管理及订阅服务等功能,大幅降低运维复杂度,提高管理效率。
41 11
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
73 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
179 23
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
199 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
146 13
tauri2-vue3-macos首创跨平台桌面OS系统模板
自研Tauri2.0+Vite6+Pinia2+Arco-Design+Echarts+sortablejs桌面端OS管理平台系统。提供macos和windows两种桌面风格模式、自研拖拽式栅格引擎、封装tauri2多窗口管理。
229 3

热门文章

最新文章