操作系统hpf算法事例_操作系统五种调度算法总结(含源码)-Go语言中文社区

本文介绍了操作系统中常见的五种作业调度算法——FCFS、SJF、HRRF、HPF和RR,详细解释了每种算法的基本思想、优缺点,并提供了Go语言实现的代码示例。通过模拟实验,展示了不同算法下的作业完成时间、等待时间、周转时间和带权周转时间,便于读者理解和比较各种调度策略的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天操作系统实验课我们做了作业调度算法的模拟。网上的调度算法参差不齐,零散杂乱。我在这里进行一个总结,并且分享给大家操作系统的五种常用算法(FCFS,SJF,HRRF,HPF,RR)并且附上代码和结果图

作业调度

作业调度又称高级调度,不涉及处理机的分配,主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业调入主存,为其分配内存、I/O设备等必要的资源,并建立相应的进程,安排在就绪队列上,以使进程获得竞争处理机的权利。

算法一:先来先服务(FCFS)

基本思想

·遵循先进入后备队列的作业,先进行调度的原则。

·非抢占式算法

特点

·简单,易于编码实现

·优先考虑作业的等待时间,没有考虑作业的执行时间长短、作业的运行特性和作业对资源的要求

算法二:短作业优先(SJF)

基本思想

·根据作业控制块中作业申请时指出的执行时间,选取执行时间最短的作业优先调度;可有抢占或非抢占方式。

·短作业优先调度算法考虑了作业的运行时间而忽略了作业的等待时间。

算法三:高响应比优先(HRRF)

初衷

·FCFS调度算法只片面地考虑了作业的进入时间,短作业优先调度算法考虑了作业的运行时间而忽略了作业的等待时间。

·响应比高者优先调度算法为这两种算法的折中,使长作业不会长时间等待,但每次调度前都要进行响应比计算。

算法四:优先权高者优先(HPF)

基本思想

·系统根据作业的优先权进行作业调度,每次选取优先权高的作业优先调度。作业的优先权通常用一个整数表示,也叫做优先数。优先数的大小与优先权的关系由系统或者用户来规定,本实验采用优先权值越小,优先权越高。

·优先权高者优先调度算法综合考虑了作业执行时间和等待时间的长短、作业的缓急度、作业对外部设备的使用情况等因素。

算法五:时间片轮转(RR)

基本思想

·系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片结束之后,将该进程加到就绪队列队尾;然后再把处理机分配给就绪队列中新的首进程。

优点

·系统能在给定的时间内响应所有用户请求。

完整代码

有些代码有点重复,可以写个函数调用。在这里不进行优化,易于大家理解。

实验二-job.txt里的内容为

作业ID    到达时间    执行时间    优先权

1    800    50    0

2    815    30    1

3    830    25    2

4    835    20    2

5    845    15    2

6    700    10    1

7    820    5    0

#include

#include

#include

#include

#include

#include

#include

#include

#define getpch(type) (type*)malloc(sizeof(type))

#define inf 0x3f3f3f

using namespace std;

//定义作业信息结构

typedef struct node{

int number; //作业号

int reach_time; //作业抵达时间

int need_time; //作业的执行时间

int privilege; //作业优先权

float excellent; //响应比

int start_time; //作业开始时间

int wait_time; //等待时间

int tr_time; //周转时间

double wtr_time; //带权周转时间

int run_time; //作业累计已执行时间

bool visited;//作业是否被访问过

int finish_time; //作业完成时间

bool reached; //作业是否抵达

}job;

//停顿几秒

void _sleep(int n){

clock_t goal;

goal = (clock_t)n * CLOCKS_PER_SEC + clock();

while(goal>clock());

}

//按任意键继续

char _keygo(){

char c;

printf("按任意键继续.......n");

c = getch();

return c;

}

//数据设置区域

const int MAX_NUM = 10;//最大作业数量

const int MAX_LINE=1024;//一行的size

int num = 0;//实际作业数量

job jobs[MAX_NUM];//作业

//就绪队列

int ready[MAX_NUM];

//记录排序使用哪个数值作为排序对象

int order[MAX_NUM];

void initial_jobs() { //初始化所有作业信息

for(int i=0;i

{

jobs[i].excellent=0;

jobs[i].need_time=0;

jobs[i].number=0;

jobs[i].privilege=0;

jobs[i].reach_time=0;

jobs[i].run_time=0;

jobs[i].start_time=0;

jobs[i].tr_time=0;

jobs[i].visited=false;

jobs[i].wait_time=0;

jobs[i].wtr_time=0;

jobs[i].finish_time=0;

jobs[i].reached=false;

}

}

void read_Jobdata(){ //读取数据文件

FILE *fp;

fp = fopen("G:\实验二-job.txt","r");

if(fp == NULL){ //如果文件不存在,则退出

printf("fail to open the file!n");

exit(0);

}

char buffer[100];

printf("start reading...n");

fgets(buffer,MAX_LINE,fp);

num++;

while(!feof(fp)){

fscanf(fp,"%d%d%d%d",&jobs[num].number,&jobs[num].reach_time,&jobs[num].need_time,&jobs[num].privilege);

num++;

}

num--;

printf("read data success!n");

printf("作业的数量为: %dn",num);

printf("%sn",buffer);

for(int j=1;j<=num;j++)

{

printf("%dt%dtt%dtt%dn"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值