进程调度算法(c语言)

进程调度算法(c语言)对一个非抢占式多道批处理系统采用以下算法的任意两种 实现进程调度 并计算进程的开始执行时间 周转时间 带权周转时间 平均周转时间 平均带权周转时间 1 先来先服务算法 2 短进程优先算法 3 高响应比优先算法三 设计思想每个进程有一个进程控制块 PCB 表示 进程控制块可以包含如下信息 进程名 优先数 到达时间 需要运行时间 已用 CPU 时间 进程状态等等 进程的优先数及需要的运行时间

将所有的进程信息存入数组里,本程序通过随机赋值赋予进程到达时间、服务时间等,然后通过计算计算出周转时间、带权周转时间、平均周转时间以及平均带权周转时间

程序源代码如下:

`#include 
  
    #include 
   
     #include 
    
      #include 
     
       //进程控制块(PCB) struct PCB { char name; float arrivetime; float servetime; float finishtime; float roundtime; float daiquantime; }; struct PCB a[100]; struct PCB b[100]; char *jczt[] = { "运行", "就绪" };//*表示没有字符串的大小限制 //打印统计信息 void tjxx(int n) { float averoundtime = 0.0f; float avedaiquantime = 0.0f; printf("按任意键查看统计信息"); getchar(); getchar(); printf("\n\n进程名称\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间"); for (int j = 0; j < n; j++) { printf("\n %c\t\t%4.f\t\t%4.f\t\t%4.f\t\t%4.f\t\t %.2f\n", a[j].name, a[j].arrivetime, a[j].servetime, a[j].finishtime, a[j].roundtime, a[j].daiquantime); averoundtime += a[j].roundtime; avedaiquantime += a[j].daiquantime; } printf("\n平均周转时间:%.2f", averoundtime / n); printf("\n\n平均带权周转时间:%.2f\n", avedaiquantime / n); } void xlxfw(int n) { int time = 0; //定义当前时刻 int processnum = 0; //定义当前进程指向 struct PCB t; //定义一个空的结构体节点 int processztsy = 0; //定义进程状态索引 while (1) { printf("当前时刻:%2d\n", time); //排序 for (int i = 1; i < n; i++) { for (int j = 0; j < n - i; j++) { if (a[j].arrivetime > a[j + 1].arrivetime)//先到先运行 { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } if (a[j].arrivetime == a[j + 1].arrivetime)//进程同时到 { if (a[j].servetime > a[j + 1].servetime)//比较服务时间,将运行时间短的放在优先级高的位置 { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } } for (int k = 0; k< n; k++) { if (time == a[k].arrivetime && a[k].arrivetime != 0) { if (k >= 1 && time >= a[k - 1].finishtime || k == 0) { processztsy = 0; } else { processztsy = 1; } printf("\t\t进程 %c 到达\t进程状态\n", a[k].name); printf("\n\t\t\t\t %s\n\n\n", jczt[processztsy]); if (processnum >= 1) { a[k].finishtime = a[k - 1].finishtime + a[k].servetime; a[k].roundtime = a[k].finishtime - a[k].arrivetime; a[k].daiquantime = a[k].roundtime / a[k].servetime; } if (processnum == 0) { a[k].finishtime = a[k].arrivetime + a[k].servetime; a[k].roundtime = a[k].finishtime - a[k].arrivetime; a[k].daiquantime = a[k].roundtime / a[k].servetime; printf("\t\t\t进程 %c 开始\n\n\n\n", a[processnum].name); processnum++; } } if (time == a[k].finishtime && a[k].finishtime != 0) { printf("\t\t\t进程 %c 完成\n\n\n\n", a[k].name); } if ((k >= 1 && time >= a[k].arrivetime && time == a[k - 1].finishtime && a[k].arrivetime != 0)) { printf("\t\t\t进程 %c 开始\n\n\n\n", a[k].name); } } if (time > a[n - 1].finishtime && a[n - 1].finishtime != 0) { printf("\t\t\t所有进程已进程已加载完毕! \n\n\n\n"); break; } time++; Sleep(1000); } tjxx(n); } void djcyx(int n) { struct PCB t; int time = 0;//定义当前时刻 int jcnum = 0; int jcztsy = 0; bool ztgb = false; //排序 for (int i = 1; i < n; i++) { for (int j = 0; j < n - i; j++) { if (a[j].arrivetime > a[j + 1].arrivetime)//先到达的优先级高 { t = a[j]; a[j] = a[j + 1]; a[j + 1] = t; } } } while (1) { printf("当前时刻:%d\n", time); //遍历数组,注意同时达到的进程,所以采用for循环遍历 for (int k = 0; k< n; k++) { //是否有进程的到达时间等于当前时刻 if (time == a[k].arrivetime && a[k].arrivetime != 0) { //判断到达进程因该处于什么状态 if (k >= 1 && time >= a[k - 1].finishtime || k == 0) { jcztsy = 0; } else { jcztsy = 1; } printf("\t\t进程 %c 到达\t进程状态\n\n\n\n", a[k].name); } } if (jcnum == 0) { //遍历数组 for (int i = jcnum; i < n; i++) { //把当前到达的进程筛选出来 if (time >= a[i].arrivetime) { //从挑选出来的进程中选取服务时间最短的一个 if (a[i].servetime < a[jcnum].servetime) { t = a[jcnum]; a[jcnum] = a[i]; a[i] = t; } ztgb = true; } } if (ztgb == true) { printf("\t\t\t进程 %c 开始\n\n\n\n", a[jcnum].name); a[jcnum].finishtime = a[jcnum].arrivetime + a[jcnum].servetime; a[jcnum].roundtime = a[jcnum].finishtime - a[jcnum].arrivetime; a[jcnum].daiquantime = a[jcnum].roundtime / a[jcnum].servetime; ztgb = false; jcnum++; } } if (time == a[jcnum - 1].finishtime && a[jcnum - 1].finishtime != 0) { printf("\t\t\t进程 %c 完成\n\n\n\n", a[jcnum - 1].name); //遍历数组 for (int i = jcnum; i < n; i++) { //把当前到达的进程筛选出来 if (time >= a[i].arrivetime) { //从挑选出来的进程中选取服务时间最短的一个 if (a[i].servetime < a[jcnum].servetime) { t = a[jcnum]; a[jcnum] = a[i]; a[i] = t; } ztgb = true; } } if (ztgb == true || jcnum == n - 1) { printf("\t\t\t进程 %c 开始\n\n\n\n", a[jcnum].name); a[jcnum].finishtime = a[jcnum - 1].finishtime + a[jcnum].servetime; a[jcnum].roundtime = a[jcnum].finishtime - a[jcnum].arrivetime; a[jcnum].daiquantime = a[jcnum].roundtime / a[jcnum].servetime; ztgb = false; jcnum++; } } if (time > a[n - 1].finishtime && a[n - 1].finishtime != 0) { printf("\t\t\t所有进程已加载完毕! \n\n\n\n"); break; } time++; Sleep(1000); } tjxx(n); } //信息录入 int info() { int n = 0; srand(time(NULL)); //初始化随机函数 printf("\n\t\t请输入需要的进程数:"); scanf("%d", &n); printf("\n"); for (int i = 0; i < n; i++) { printf("\t\t进程 %d\t名称:", i + 1); scanf("%s", &a[i].name); a[i].arrivetime = (float)(rand() % 5 + 1);//随机获取进程运行到达时间 a[i].servetime = (float)(rand() % 5 + 1);//随机获取进程运行服务时间 } system("cls"); return n; } void main() { int b = 1, k; while (b) { system("cls"); printf("\n\n\t\t进程调度算法\n\n"); printf("\t\t 程序清单\n"); printf("\t\t1.... 先来先服务算法 \n"); printf("\t\t2.... 短进程优先算法 \n"); printf("\t\t3.... 退出程序 \n\n\n"); printf("\t\t请选择:"); scanf("%d", &k); switch (k) { case 1: xlxfw(info()); break; case 2: djcyx(info()); break; case 3: b = 0; break; default:printf("\n\t\t请输入正确的选择!\n"); } if (b != 0) { printf("\n"); system("pause"); } } printf("\n\t\t谢谢使用!\n\n\t\t"); }` 
      
     
    
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2026年3月19日 上午9:49
下一篇 2026年3月19日 上午9:50


相关推荐

  • [Python_3] Python 函数 & IO

    [Python_3] Python 函数 & IO

    2021年6月15日
    127
  • pycharm中最常用的10个快捷键总结_PyCharm快捷键

    pycharm中最常用的10个快捷键总结_PyCharm快捷键代码编辑快捷键序号快捷键作用1CTRL+ALT+SPACE快速导入任意类2CTRL+SHIFT+ENTER代码补全3SHIFT+F1查看外部文档4CTRL+Q快速查找文档5CTRL+P参数信息(在方法中调用的参数)6CTRL+MOUSEOVERCODE基本信息7CTRL+F1显示错误或警告的描述8CTRL+I…

    2022年8月25日
    8
  • jetty—jetty自动重启问题

    jetty自动重启问题

    2022年2月24日
    60
  • 基于单片机超声波测距系统的设计_单片机类毕业设计

    基于单片机超声波测距系统的设计_单片机类毕业设计Hi,大家好,这里是丹成学长,今天向大家介绍一个超级炫酷的单片机项目,非常适合用于毕设基于单片机的超声波雷达设计大家可用于课程设计或毕业设计1、绘制雷达表盘2、增加扫描线3、实现拖影效果4、实现目标扫描点显示(渐出效果)1、准备器材(arduinoUNO、360度舵机、超声波传感器、扩展板)2、雷达平台1、串口通讯接受数据2、扫描点的显示函数改造超声波检测原理线电波(微波)从雷达发射到自由空间,其中一些波被反射物体拦截,并从不同的方向上进行反射。这些波中一些波会引回雷达,被雷达接受并且

    2025年11月1日
    3
  • 如何在Linux系统下的IntelliJ IDEA 2018.3.5下载与安装以及激活教程

    如何在Linux系统下的IntelliJIDEA2018.3.5下载与安装以及激活教程作者:张国军_Suger开发工具与关键技术:VMwareWorkstationPro、Linux系统(Debian8.6.0)操作系统:debian-live-8.6.0-amd64-xfce-desktop       &n…

    2022年4月9日
    184
  • DDOS攻击器常见的三种DDoS攻击方式详解

    DDOS攻击器常见的三种DDoS攻击方式详解一流的攻击速度以及强大的隐蔽性能 使得 DDOS 集合了市面上所有攻击软件优点成为了最热的攻击方式 接下来本文将简单的介绍一下三种最为流行的 DDOS 攻击方式 SYN ACKFlood 攻击 这种攻击方法是经典最有效的 DDOS 攻击方法 可通杀各种系统的网络服务 主要是通过向受害主机发送大量伪造源 IP 和源端口的 SYN 或 ACK 包 导致主机的缓存资源被耗尽或忙于发送回应包而造成拒绝服务 由于源

    2026年3月26日
    2

发表回复

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

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