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

目录
相关文章
|
1月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
69 1
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
21天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
89 13
|
15天前
|
JSON iOS开发 数据格式
tauri2-vue3-macos首创跨平台桌面OS系统模板
自研Tauri2.0+Vite6+Pinia2+Arco-Design+Echarts+sortablejs桌面端OS管理平台系统。提供macos和windows两种桌面风格模式、自研拖拽式栅格引擎、封装tauri2多窗口管理。
72 3
|
1月前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
1月前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
1月前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
1月前
|
存储 算法 调度
深入理解操作系统:进程调度的奥秘
在数字世界的心脏跳动着的是操作系统,它如同一个无形的指挥官,协调着每一个程序和进程。本文将揭开操作系统中进程调度的神秘面纱,带你领略时间片轮转、优先级调度等策略背后的智慧。从理论到实践,我们将一起探索如何通过代码示例来模拟简单的进程调度,从而更深刻地理解这一核心机制。准备好跟随我的步伐,一起走进操作系统的世界吧!
|
1月前
|
人工智能 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统演进####
本文深入剖析了移动应用开发的最新趋势与移动操作系统的演进历程,揭示了技术创新如何不断推动移动互联网生态的变革。通过对比分析不同操作系统的特性及其对应用开发的影响,本文旨在为开发者提供洞察未来技术方向的视角,同时探讨在多样化操作系统环境中实现高效开发的策略。 ####
25 0
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。