四种算法
- 先来先服务算法
先来先服务调度算法是按照作业到达的先后次序进行调度,或者说是有优先考虑在系统中等待时间最长的作业,而不管该作业所需执行时间的长短,从后背作业队列中选择几个最先进入系统的作业,将他们调入内存,为它们分配资源和创建进程,然后将它放入就绪队列。每次进程调度就从酒席队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才将处理及分配给其他进程。 - 短作业优先算法
短作业优先调度算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业要求的运行时间来衡量的。 - 时间片轮转调度算法
时间片轮转调度算法是基于时间片的轮转而形成的算法。让就绪队列上的每个进程每次进运行一个时间片。如果就绪队列有n个进程,则每个进程每次大约都可获得1/n的处理机时间。在轮转中,系统会根据先来先服务调度算法的策略将所有进程的就绪锦成排成一个就绪队列,并设置每隔一定时间间隔产生一次中断,激活系统中的进程调度程序,完成一次调度,将处理机分配给队首进程,令其执行。当该进程的时间片耗尽或运行完毕后,系统再次将处理机给新的队首进程,这样可以保证就绪队列中的所有进程在一个确定的时间段内,都能获得一次处理机执行。 - 优先级算法
高响应比优先级调度算法是为每个作业动态的引入优先级,及优先级是可以变化的,令它随等待时间延长而增加,这就是厂作业的优先级在等待期间不断的增加,等到足够的时间后,必然有机会获得处理机(优先权=(等待时间=+要求服务时间)/ 要求服务时间)。
源代码
github链接: link.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define Process_MAX 10
//建立两个结构体
//第一个结构体,单个进程的信息
typedef struct Process{
int rank;//执行的次序
int name;
int arrive;
int run;
int start;
int finish;
int turnaround;
int wait;
double weight_turnaround;
//标志位
int flag;
}Process;
//第二个结构体,整个进程表
typedef struct ProccessTable{
//进程数组
Process process[Process_MAX];
//平均周转时间
double average_turnaround;
//平均等待时间
double average_wait;
//平均带权周转时间
double average_weight_turnaround;
//有效进程数
int size;
}ProcessTable;
//初始化
void initProcessTable(ProcessTable* processTable){
printf("请输入进程的总数:");
scanf("%d",&processTable->size);
//初始化到达时间和估计运行时间
for (int i = 0; i < processTable->size; i++){
printf("请输入第%d进程的名称,到达时间和估计运行时间:", i + 1);
scanf("%d %d %d", &processTable->process[i].name,
& processTable->process[i].arrive, &processTable->process[i].run);
}
}
//返回基于短作业优先算法中当前需执行的进程(不要进行排序,否则会覆盖数据,导致数据丢失)
int SJFSort(ProcessTable* processTable,int executionProcess,int nowTime){
//该数组用于存放当前已经到达内存的进程 (此处存放的不是下标,因为初始化为0,易混淆)
int nowArriveProcess[Process_MAX] = {
0 };
//记录该数组的有效存储的进程个数
int count = 0;
//step1. 找出当前时间已经到达内存却未被CPU执行的进程
for (int i = 0; i < processTable->size; i++){
if (processTable->process[i].flag!=1
&&processTable->process[i].run <= nowTime){
nowArriveProcess[count++] = i+1;
}
}
//step2. 找出这些进程谁的作业最短的进程的下标
executionProcess = nowArriveProcess[0] - 1;
for (int i = 1; i < count;