说明

该并非实现真正的处理机调度,只是通过算法模拟这两种调度算法的过程。

运行过程如下:

  1. 输入进程个数
  2. 输入各个进程的到达事件
  3. 输入各个进程的要求服务事件
  4. 选择一种调度算法
  5. 程序给出调度结果:各进程的完成时间、周转时间、带权周转时间。

运行截图

  • FCFS

  • SJF

代码如下

#include <stdio.h>
#include <stdlib.h> #define MAX_DURANCE 1e6 /*
author: Qin Guoqing; date:2020年11月17日 17点37分; description: 模拟实现短作业优先和先来先服务两种调度算法。 */ int count_process; //进程数
int *coming_times; //达到时间
int *serve_times; //服务时间
int *finished_times; //完成时间
int *turnover_times; //周转时间
int *waiting_times; //等待时间
float *turnover_times_weight; //带权周转时间
int method_choosen; //所选调度算法 void input_process_count(); //输入进程个数
void input_coming_time(); //输入进程到达时间
void input_serve_time(); //输入进程服务时间
void print_inputInfo(); //打印输入信息
void choose_method(); //选择调度算法
void inatialize(); //数据初始化
void SJF(); //短作业优先
void FCFS(); //先来先服务
void print_schedulInfo(); //打印调度信息
int main()
{
input_process_count();
input_coming_time();
input_serve_time();
print_inputInfo();
choose_method();
inatialize();
switch (method_choosen)
{
case 1:
FCFS();
break; default:
SJF();
break;
}
print_schedulInfo();
system("pause");
return 0;
} void input_process_count()
{
puts("please input the amount of process:");
scanf("%d", &count_process);
} void input_coming_time()
{
coming_times = (int *)malloc(sizeof(int) * count_process);
puts("please input the coming_time of the processes:");
for (size_t i = 0; i < count_process; i++)
{
scanf("%d", &coming_times[i]);
}
} void input_serve_time()
{
serve_times = (int *)malloc(sizeof(int) * count_process);
puts("please input the serve_time of the processes:");
for (size_t i = 0; i < count_process; i++)
{
scanf("%d", &serve_times[i]);
}
}
void print_inputInfo()
{
puts("###################################################");
printf("the amount of processes inputed by the user:n = %d\n", count_process);
puts("here are the coming_times of those processes:");
for (int i = 0; i < count_process; i++)
{
printf("%d ", coming_times[i]);
}
printf("\n");
puts("here are the serve_time of those processes:");
for (int i = 0; i < count_process; i++)
{
printf("%d ", serve_times[i]);
}
printf("\n");
} void choose_method()
{
puts("please choose a schedul method: 1-FCFS,2-SJF:");
scanf("%d", &method_choosen);
} void FCFS()
{
int current = 0;
int co_coming_times[count_process];
for (size_t i = 0; i < count_process; i++)
{
co_coming_times[i] = coming_times[i];
}
for (size_t j = 0; j < count_process; j++)
{
int earliest = 0, min = co_coming_times[0];
int i;
//先找到当前最先到达的进程,需要使用到达时间的副本来找
for (i = 1; i < count_process; i++)
{
if (co_coming_times[i] < min)
{
min = co_coming_times[i];
earliest = i;
}
}
co_coming_times[earliest] = MAX_DURANCE;
//上一个进程执行完时有可能下个进程还没到达
if (coming_times[earliest] > current)
{
current = coming_times[earliest];
}
//更新其完成时间
finished_times[earliest] = current + serve_times[earliest];
//等待时间
waiting_times[earliest] = current - coming_times[earliest];
//更新当前时间
current += serve_times[earliest];
//更新周转时间
turnover_times[earliest] = serve_times[earliest] + waiting_times[earliest];
//更新带权周转时间
turnover_times_weight[earliest] = (float)turnover_times[earliest] / (float)serve_times[earliest];
}
} void SJF()
{
int current = 0;
int co_serve_times[count_process], co_coming_times[count_process];
//服务时间的副本
for (size_t i = 0; i < count_process; i++)
{
co_serve_times[i] = serve_times[i];
}
//到达时间的副本
for (size_t i = 0; i < count_process; i++)
{
co_coming_times[i] = coming_times[i];
}
int flag = 0; //标识当前时间下有无已经到达的进程
for (size_t i = 0; i < count_process; i++)
{
int min_p = 0, min = co_serve_times[0], early = co_coming_times[0];
//min_p: 当前调度进程的xiabiao
//min: 当前调度进程的服务时间
//early:当前调度进程的到达时间
for (size_t j = 1; j < count_process; j++)
{
if (co_coming_times[j] <= current && co_serve_times[j] < min)
{
flag = 1;
min = co_serve_times[j];
min_p = j;
}
}
//若当前时间无进程到达,则选择即将最早到达的那个进程
if (flag == 0)
{
for (size_t m = 1; m < count_process; m++)
{
if (co_coming_times[m] < early)
{
early = co_coming_times[m];
min_p = m;
current = early;
}
}
}
co_coming_times[min_p] = MAX_DURANCE;
co_serve_times[min_p] = MAX_DURANCE;
finished_times[min_p] = current + serve_times[min_p];
waiting_times[min_p] = current - coming_times[min_p];
current = finished_times[min_p]; turnover_times[min_p] = waiting_times[min_p] + serve_times[min_p];
turnover_times_weight[min_p] = (float)turnover_times[min_p] / (float)serve_times[min_p];
}
} void print_schedulInfo()
{
puts("####################################################################################################");
puts("here is the information of the schedul:");
puts("P_name(ID) arrived_time served_time finished_time turnover_time turnover_time_weight");
for (size_t i = 0; i < count_process; i++)
{
printf("%10d %12d %11d %14d %13d %20f\n", i, coming_times[i], serve_times[i], finished_times[i], turnover_times[i], turnover_times_weight[i]);
}
float average_turnover_time, sum_turnover_time = 0; //平均周转时间和总周转时间
float average_turnover_time_weight, sum_turnover_time_weight = 0; //平均带权周转时间和总带权周转时间
for (size_t i = 0; i < count_process; i++)
{
sum_turnover_time += turnover_times[i];
sum_turnover_time_weight += turnover_times_weight[i];
}
average_turnover_time = sum_turnover_time / count_process;
average_turnover_time_weight = sum_turnover_time_weight / count_process;
printf("the average time of turnover time is: %.2f\n", average_turnover_time);
printf("the average time of turnover time with weight is: %.2f\n", average_turnover_time_weight);
puts("####################################################################################################");
} void inatialize()
{
finished_times = (int *)malloc(sizeof(int) * count_process);
turnover_times = (int *)malloc(sizeof(int) * count_process);
turnover_times_weight = (float *)malloc(sizeof(float) * count_process);
waiting_times = (int *)malloc(sizeof(int) * count_process);
}

C语言模拟实现先来先服务(FCFS)和短作业优先(SJF)调度算法的更多相关文章

  1. 【操作系统】先来先服务和短作业优先算法(C语言实现)

    [操作系统] 先来先服务算法和短作业优先算法实现 介绍: 1.先来先服务 (FCFS: first come first service) 如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列 ...

  2. 短作业优先调度算法(SJF)

    假设有n项作业位于就绪队列中,这些作业的提交时间用数组requestTimes按照提交时间的先后顺序存储,对应的作业服务时间(持续时间)用数组durations存储.采用SJF算法,计算n项作业的平均 ...

  3. 语言模拟ATM自动取款机系统

    C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入: ...

  4. 关于c语言模拟c++的多态

    关于c++多态,个人认为就是父类调用子类的方法,c++多态的实现主要通过虚函数实现,如果类中含有虚函数,就会出现虚函数表,具体c++多态可以参考<深度探索c++对象模型> c语言模拟多态主 ...

  5. c语言模拟c++的继承和多态

    //C++中的继承与多态 struct A { virtual void fun() //C++中的多态:通过虚函数实现 { cout << "A:fun()" < ...

  6. C语言::模拟实现strlen函数

    题目要求 编写一个C语言程序模拟实现strlen函数. 算法 strlen函数功能是计算字符串中字符的个数.(除\0外) 而字符串本身就是一个字符数组,只不过末尾以\0结束. 因此,我们只需遍历除\0 ...

  7. C语言:模拟密码输入显示星号

    一个安全的程序在用户输入密码时不应该显示密码本身,而应该回显星号或者点号,例如······或******,这在网页.PC软件.ATM机.POS机上经常看到.但是C语言没有提供类似的功能,控制台上只能原 ...

  8. Linux套接子(c语言)模拟http请求、应答

    有关套接子和http请求报文的博客在CSDN有很多比如,点这里查看,这里我就不再做过多赘述了,下面我们直接实战,模拟http请求. 要求:浏览器访问本地的localhost,在浏览器页面打印出 Hel ...

  9. c语言模拟实现oc引用计数

    #include<stdio.h> #include<stdlib.h> //在c中引入 引用计数机制 // 要解决的问题:  1,指向某块动态内存的指针有几个? //    ...

随机推荐

  1. 【Flutter 混合开发】与原生通信-EventChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  2. 手把手教你搭建SVN服务

    参考一下地址 https://blog.csdn.net/marstonyjiang/article/details/52033916

  3. Java数据结构-02单链表(一)

    一.链式存储: ①简述:线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.存储单元由两部分组成,数据源和指针,数据源放数据,指针指向下个 ...

  4. 在 k8S 中搭建 SonarQube 7.4.9 版本(使用 PostgreSQL 数据库)

    搭建 SonarQube 和 PostgreSQL 服务 本文搭建的 SonarQube 版本是 7.4.9-community,由于在官方文档中声明 7.9 版本之后就不再支持使用 MySQL 数据 ...

  5. PHP中双引号和单引号的区别

    在PHP中,字符串数值有单引号和双引号两种. 区别: 单引号:系统不做复杂的转义.只转义\'和\\两种转义,其他的按原样输出. 双引号:则转义比较多,\",\\,\r,\t,\n,\$等. ...

  6. httpx和requests之间有什么区别?

    requests只能发送同步请求,httpx能够发送同步和异步请求. httpx的api和requests是兼容的,切换的成本几乎是零.在异步模式下,测试大量接口的话,httpx的速度是能够显著得到提 ...

  7. ES6--数组部分基础知识

    数组Array的相关方法 1.Array.from()方法 Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象 ...

  8. Bash echo输出带颜色和背景的文本

    Bash echo输出带颜色和背景的文本 1.先上效果图 2.bash代码 #!/bin/bash #************************************************* ...

  9. LRU算法详解

    一.什么是 LRU 算法 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留 ...

  10. Java复制数组的方法

    java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法.下面分别介绍一下这 ...