对一个非抢占式多道批处理系统采用以下算法的任意两种,实现进程调度,并计算进程的开始执行时间,周转时间,带权周转时间,平均周转时间,平均带权周转时间
1.先来先服务算法 2.短进程优先算法 *3.高响应比优先算法

一、设计思想
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算

1、先来先到算法:优先运行先到达的进程,后达到的进程后运行,类似数据结构中的队列,先进先出,对于先来先服务算法,我们只需要队进程进行排序即可;
2、短进程优先算法:若进程的到达时间有先后,则还是先运行先到达的进程,若当前有进程正在运行,则到达的进程置为就绪状态,等待进程运行完毕,释放资源后,比较处于就绪状态的进程,服务时间短的优先运行,等待下一个进程运行完毕后,继续比较就绪进程的服务时间,仍取服务时间短的。

数据结构:

先来先服务排序部分算法:

短进程优先部分算法:

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

程序源代码如下:

`#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h> //进程控制块(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");
}`

进程调度算法(c语言)相关推荐

  1. 【操作系统】最高响应比优先的进程调度算法-C语言(有代码)

    本文章将会介绍最高响应比优先的进程调度算法,并按照以下需求进行实现: 代码在文章最后 由用户输入每个进程的名称.要求运行时间 每一轮调度,计算每个进程的响应比,R = (W+S)/S=1+W/S,W: ...

  2. 进程调度c语言 fcfs,计算机进程调度算法FCFS、RR、SJF的实现

    调度算法,在Linux环境下用C语言编写程序,模拟FCFS.RR.SJF等进程调度算法,以及利用信号量等方法解决哲学家就餐问题. 在主进程中,创建 20 个子线程,分别模拟进程调度算法FCFS.RR. ...

  3. 操作系统实习-进程调度算法(C语言)

    文章目录 设计目的 设计内容 设计思路 算法流程图 程序结构 实现代码 调试结果 设计目的 进程管理是操作系统中的重要功能,用来创建进程.撤消进程.实现进程状态转换,它提供了在可运行的进程之间复用CP ...

  4. 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书

    发布文章 博文管理我的博客退出 Trash Temp 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书 @[TO ...

  5. 静态优先权调度算法C语言实现6,静态优先权优先算法的进程调度程序文件.doc

    . . . .. . 学习好帮手 静态优先权优先算法的进程调度程序 学 院 专 业 学 生 姓 名 学 号 指导教师姓名 21014年 3 月 19 日 目 录 TOC \o "1-3&qu ...

  6. 计算机操作原理进程调度算法---先来先服务,短进程优先(C语言)

    目录 先来先服务调度算法: 短进程优先调度算法: 两种进程调度算法优缺点 思维导图 程序代码: 先来先服务调度算法: 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可 ...

  7. SJF(短进程优先)调度算法C语言实现

    1.实验目的 (1)掌握进程调度过程: (2)掌握进程调度算法的原理. 2.实验内容及要求 采用SPF调度算法,编写并调试一程序,模拟进程调度过程. 已知进程名.到达时间.需要运行时间,编写程序输出进 ...

  8. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  9. 进程调度算法-生产者消费者问题

    @进程调度算法之生产者消费者问题 生产者消费者问题 问题介绍 生产者生产产品,消费者消费产品,两者的资源存储在同一个资源池. 因此,问题来了,生产者生产商品需要在资源池的存储范围内:然而消费者消费的资 ...

  10. 时间片轮转进程调度算法(实习报告)

    时间片轮转进程调度算法 实验目的和要求 实验内容 实验过程 数据结构: 部分代码: 实验结果: 分析和讨论 完整代码 实验目的和要求 (1) 掌握时间片轮转进程调度的概念和算法 (2) 加深对处理机分 ...

最新文章

  1. h5引入不同的js文件怎样让第二个js使用第一个js文件中的函数_px2rem-loader使用及注意事项...
  2. 有关 HashMap 面试会问的一切
  3. cocos2d-x 自己写的一个scrollview 有待完善
  4. java连接hbase_HBase 工具 | hbasesdk 推出HQL功能
  5. LSTM神经网络 和 GRU神经网络
  6. 那些年,我们追过的java8
  7. SpringBoot高级-任务-异步任务
  8. html 载入中,用纯CSS实现加载中动画效果
  9. Copycat - 状态
  10. 单元测试 | 如何Mock IHttpClientFactory
  11. linux 文件 字符集设置,Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解...
  12. 去除标签_有效去除“狗皮膏药”标签,快学起来吧
  13. mysql系统特性_MySQL · 引擎特性 · InnoDB 事务系统
  14. Python中参数iterable的意义
  15. 【Windows取证篇】Windows镜像仿真绕过开机密码技巧
  16. (附源码)小程序 校园二手交易平台 毕业设计 191637
  17. 用C语言求最小公倍数和最大公约数
  18. SaaSBase:什么是Teambition?
  19. 关于ubuntu的详细介绍
  20. 亚创集团任命联合创始人兼总裁欧阳云为CEO 重申继续推进IPO

热门文章

  1. 计算机组成 超标量,计算机组成原理6-流水线、多发射和超标量、SIMD(示例代码)...
  2. bigworld引擎
  3. Linux系统的镜像文件下载
  4. 产品读书《极致:互联网时代的产品设计》
  5. 好用的android剪辑软件,最好用的视频剪辑app软件有哪些?自媒体人都在用的六款app软件...
  6. 舆情监控系统python开源_开源舆情监控系统
  7. 最简单的WIN7内核PE系统(U盘,硬盘,移动硬盘版支持原版WIN7安装
  8. 栅栏密码 - Python脚本
  9. Mac版pages快捷键大全
  10. 数字图像处理 冈萨雷斯(第四版)图像分辨率及大小,灰度级变化的影响,以及邻接、连通、区域和边界笔记