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

目录
相关文章
|
2月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
110 1
|
1月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
111 23
|
1月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
134 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
|
2月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
121 13
|
2月前
|
JSON iOS开发 数据格式
tauri2-vue3-macos首创跨平台桌面OS系统模板
自研Tauri2.0+Vite6+Pinia2+Arco-Design+Echarts+sortablejs桌面端OS管理平台系统。提供macos和windows两种桌面风格模式、自研拖拽式栅格引擎、封装tauri2多窗口管理。
167 3
|
2月前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
2月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
2月前
|
人工智能 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统演进####
本文深入剖析了移动应用开发的最新趋势与移动操作系统的演进历程,揭示了技术创新如何不断推动移动互联网生态的变革。通过对比分析不同操作系统的特性及其对应用开发的影响,本文旨在为开发者提供洞察未来技术方向的视角,同时探讨在多样化操作系统环境中实现高效开发的策略。 ####
35 0
|
2月前
|
5G 数据安全/隐私保护 Android开发
移动应用与系统:探索开发趋势与操作系统革新####
本文深入剖析当前移动应用开发的最新趋势,涵盖跨平台开发框架的兴起、人工智能技术的融合、5G技术对移动应用的影响,以及即时应用的发展现状。随后,文章将探讨主流移动操作系统的最新特性及其对开发者社区的影响,包括Android的持续进化、iOS的创新举措及华为鸿蒙OS的崛起。最后,还将讨论移动应用开发中面临的挑战与未来的发展机遇,为读者提供全面而深入的行业洞察。 ####
|
5天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
50 10