(操作系统)进程管理系统(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

目录
相关文章
|
关系型数据库 虚拟化 UED
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
562 7
Omnissa Horizon Windows OS Optimization Tool 2503 - Windows 系统映像优化工具
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
8月前
|
监控 关系型数据库 MySQL
在CentOS系统中,如何统计哪个进程打开了文件描述符?
利用上述方法,你可以有效地监控和统计CentOS系统中的进程打开的文件描述符数量,以帮助排查错误或优化系统配置。通过组合使用各种工具和命令,可以获得对系统状态和行为的深入了解,进而做出相应的调整和
370 5
|
10月前
|
JSON iOS开发 数据格式
最新研发flutter3.32+window_manager客户端OS管理系统
原创Flutter3.32+Dart3.8+Getx+Window_Manager实战桌面客户端os系统解决方案。支持macOS和windows两种主题风格、自定义桌面栅格布局。
665 50
|
运维 安全 Devops
Cisco NX-OS ACI 16.1(4h)F 发布 - 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件
Cisco NX-OS ACI 16.1(4h)F 发布 - 适用于 ACI 模式下的 Cisco Nexus 9000 系列交换机系统软件
205 0
|
缓存 运维 前端开发
阿里云操作系统控制台:高效解决性能瓶颈与抖动之进程热点追踪
遇到“进程性能瓶颈导致业务异常”等多项业务痛点时,提供高效解决方案,并展示案例。
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
1129 30
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
833 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
Cloud Native 安全 Linux
龙蜥操作系统:CentOS 谢幕之后,国产云原生系统的崛起之路
龙蜥操作系统(Anolis OS)是 CentOS 停止维护后,由阿里云等企业联合发起的开源项目。它以双内核架构和全栈优化为核心,提供无缝替代 CentOS 的方案,兼容主流生态并针对云计算场景深度优化。其技术亮点包括 RHCK 和 ANCK 双内核、性能优化、全栈安全及国密算法支持。龙蜥适用于云原生基础设施、企业级应用部署及开发环境,社区已吸引 200 多家单位参与。未来规划涵盖 AI 框架优化、RISC-V 架构适配及桌面环境构建,正重新定义云时代的操作系统边界。
4308 0

推荐镜像

更多