数学模型:操作系统中FCFS、SJF、HRRN算法的平均周转时间比较 c语言

摘  要

研究目的:比较操作系统中进程调度FCFS、SJF、HRRN算法的平均周转时间和带权周转时间的大小关系。

研究方法:在建模分析时,分别举4个进程的例子,1个进程用两个字母分别表示到达时间和执行时间。分两种极端情况,一种是每个进程到达时cpu还在执行之前的进程,这种结果为T(FCFS)>T(HRRN)>T(SJF),W(FCFS)>W(HRRN)>W(SJF)。另一种是每个进程到达时cpu已经处理完之前的进程,这种结果为3种算法的执行都是相同的且T=W=1。而随机数据在两种极端之间。

在进行算法检验时,用c语言随机生成5000个进程,三个函数代表3中不同算法的求解结果。

研究结果与结论:T(FCFS)>=T(HRRN)>=T(SJF),W(FCFS)>=W(HRRN)>=W(SJF)

关键词:初等模型;操作系统进程调度;FCFS;SJF;HRRN

1. 问题重述

    在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。作业调度的主要任务是根据jcb中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为他们创建进程、分配必要的资源。

先来先服务调度算法(FCFS),系统按照作业到达后的先后次序来进行调度,后者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所执行的时间长短。在进程调度中,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行,该进程一直运行到完成或发生某事件而阻塞后,进程调度程序才将处理机分配给其他进程。

短作业优先算法(SJF),以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。所以需要预知作业的运行时间,但却很难准确估计作业的运行时间,如果估计过低,系统可能按估计的时间终止作业的运行,但此时作业并未完成,故一般估计时间都会偏长。

高相应比优先调度算法(HRRN),该算法即考虑了作业的等待时间,又考虑了作业运行时间的调度算法,因此既照顾了短作业,又不致使长作业的等待时间过长。每个作业都有一个动态优先级,优先级是可以改变的,令它随等待时间延长而而增加,这将使长作业在等待期间不断地增加,等到足够的时间后,必然会有机会获得处理机,该优先级的变化规律是

         (1-1)

批处理系统的目标,平均周转时间短,它包括4部分时间:作业从外存后备队列上等待调度的时间,进程在就绪队列上等待进程调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间。平均周转时间短,不仅会有效的提高系统资源的利用率,而且还可以使大多数用户感到满意。平均周转时间
                

                                                                             (1-2)                   

为了进一步反应调度的性能,更清晰的描述各进程在其周转时间中,等待和执行的具体分配情况,往往使用带权周转时间,即作业的周转时间T与系统的为它提供服务的时间Ts

之比,即W=T/Ts,平均带权周转时间可表示为:         

 (1-3)             

问题1:3种算法的平均周转时间有什么大小关系

问题2:3种算法的带权周转时间有什么大小关系

2. 问题分析

本题为3种算法的平均周转时间和带权周转时间的比较,可以列出几个进程进行具体的计算,然后再进行比较,在利用程序进行检验。在平均周转时间中分为4种:作业从外存后备队列上等待调度的时间,进程在就绪队列上等待进程调度的时间,进程在CPU上执行的时间,以及进程等待I/O操作完成的时间。在进行计算时只考虑进程在就绪队列上等待进程调度的时间和进程在CPU上执行的时间。在进行分析时,分两种极端情况,一种是每个进程到达时cpu还在执行之前的进程,一种是每个进程到达时cpu已经处理完之前的进程。

3. 模型假设

3.1忽略cpu执行进程时的切换时间。

3.2在计算平均周转时间和带权周转时间时只考虑进程在就绪队列上等待进程调度的时间和进程在CPU上执行的时间。

3.3每个进程的执行时间已经预知且精准。

3.4在分析每个进程到达时cpu还在执行之前的进程这种情况时,认为T1>T2>T3>T4,A<B<C<D。

4.符号说明

A:进程1的到达时间。T1:进程1的执行时间

B:进程2的到达时间。T2:进程2的执行时间

C:进程3的到达时间。T3:进程3的执行时间

D:进程4的到达时间。T4:进程4的执行时间

5.模型建立

模型一

先来先服务调度算法-每个进程到达时cpu还在执行之前的进程

进程

到达时间

执行时间

开始时间

结束时间

等待时间

1

A

T1

A

A+T1

0

2

B

T2

A+T1

A+T1+T2

T1-B

3

C

T3

A+T1+T2

A+T1+T2+T3

T1+T2-C

4

D

T4

A+T1+T2+T3

A+T1+T2+T3+T4

T1+T2+T3-D

表1-1

短作业优先算法-每个进程到达时cpu还在执行之前的进程

进程

到达时间

执行时间

开始时间

结束时间

等待时间

1

A

T1

A

A+T1

0

4

D

T4

A+T1

A+T1+T4

T1-D

3

C

T3

A+T1+T4

A+T1+T4+T3

T1+T4-B

2

B

T2

A+T1+T4+T3

A+T1+T2+T3+T4

T1+T4+T3-C

表1-2

高相应比优先调度算法-每个进程到达时cpu还在执行之前的进程

进程

到达时间

执行时间

开始时间

结束时间

等待时间

1

A

T1

A

A+T1

0

4

D

T4

A+T1

A+T1+T4

T1-D

2

B

T2

A+T1+T4

A+T1+T2+T4

T1+T4-B

3

C

T3

A+T1+T4+T2

A+T1+T4+T3+T2

T1+T4+T2-C

表1-3

高相应比优先调度算法:再执行完进程3时进程2的优先级为(T1-B)/T2+1,

进程3的优先级为(T1-C)/T3+1,进程4的优先级为(T1-D)/T4+1。3个进程优先级比较大小,因为B>C>D,所以T1-B<T1-C<T1-D。又因为T2>T3>T4,所以无法比较,这里假设进程4的优先级最大,即T1T3-T3D>T1T4-T4C.再执行完进程2时,进程3与进程4的等待时间又变了,所以需要重新计算,进程3的优先级为(T1+T4-C)/T3+1,进程2的优先级为(T1+T4-B)/T2+1,T1+T4-C<T1+T3-D且T2>T3.无法比较,这里假设进程2的优先级大,即T2(T1+T4)-T2C<T3(T1+T4)-T3B,与上面假设不冲突

模型二

每个进程到达时cpu已经处理完之前的进程

进程

到达时间

执行时间

开始时间

结束时间

等待时间

1

A

T1

A

A+T1

0

2

B

T2

B

B+T2

0

3

C

T3

C

C+T3

0

4

D

T4

D

D+T4

0

表2-1

6. 模型求解

模型一

先来先服务调度算法:时间总和为4T1+3T2+2T3+T4,即T=(4T1+3T2+2T3+T4-B-C-D)/4。

W=(1+(T1+T2-B)/T2+(T1+T2+T3-C)/T3+(T1+T2+T3+T4-D)/T4)/4。

短作业优先算法:因为T2>T3>T4,并且假设3个进程到达之前T1还没有执行完,所以按照短作业优先算法时,进程4先执行,再执行进程3,最后在执行进程4。时间总和为4T1+3T4+2T3+T2,即

T=(4T1+3T4+2T3+T2-B-C-D)/4。

W=(1+(T1+T4-D)/T4+(T1+T4+T3-C)/T3+(T1+T4+T3+T2-B)/T2)/4

高相应比优先调度算法:T=(4T1+3T4+2T2+T3-B-C-D)/4。

W=(1+(T1+T4-D)/T4+(T1+T4+T2-B)/T2+(T1+T4+T3+T2-C)/T3)/4。

3种进行比较T(FCFS)>T(HRRN)>T(SJF),W(FCFS)>W(HRRN)>W(SJF)

模型二

因为每个进程到达时cpu已经处理完之前的进程,并且A<B<C<D,所以3种算法的执行都是相同的且T=W=1.

综上所述T(FCFS)>=T(HRRN)>=T(SJF),W(FCFS)>=W(HRRN)>=W(SJF)

7. 模型检验

用c语言随机生成5000个进程进行计算结果符合

c语言执行结果

 

图1

 c代码

#include <stdio.h>
#include <stdlib.h>
typedef struct
{int arrived;int serve;int priority;long wait;
}Hrrn;
typedef struct
{int arrived;int serve;long wait;
}Fcfs;
typedef struct
{int arrived;int serve;long wait;
}Sjf;void FCFS(Fcfs *fcfs,int n)     //先来先服务算法
{long now = 0;           //cpu从处理到现在所用的时间for (int i=0;i<n;i++){if(now >= fcfs[i].arrived)      //如果有进程到达 直接加时间now+=fcfs[i].serve;else                        //如果没有进程到达      需要更新为到达时间now = fcfs[i].arrived+fcfs[i].serve;for(int j=i+1;j<n;j++)              //更新等待时间{if(now > fcfs[j].arrived)fcfs[j].wait=now-fcfs[j].arrived;}}long total=0;double totalserve=0;for (int i=0;i<n;i++){total+=(fcfs[i].wait+fcfs[i].serve);      //总的周转时间totalserve+=(fcfs[i].wait+fcfs[i].serve)/(double)fcfs[i].serve;          //带权周转时间}printf("FCFS\nT=%f                   W=%f\n",total/(float)n,(totalserve/(double)n));
}
void SJF(Sjf *sjf,int n)            //短作业优先算法
{Sjf *temp = malloc(sizeof(Sjf));for(int p=n/2;p>0;p/=2)    //  希尔排序 按照作业长短排序 一样的按照先后{for (int i=p;i<n;i++){*temp=sjf[i];int j;for (j=i;j-p>=0 && sjf[j-p].serve >= temp->serve;j-=p){if (sjf[j-p].serve > temp->serve)  //第一排序为执行时间sjf[j] = sjf[j-p];else{if(sjf[j-p].arrived > temp->arrived)    //第二排序为到达时间sjf[j] = sjf[j-p];elsebreak;}}sjf[j] = *temp;}}free(temp);int flag[10000]={0};            //标志哪一个没有没有执行 因为排序中短作业可能后来到达int now=0,nowloc=0;                 //now记录cpu从处理到现在的时间  nowloc为将要执行的位置for (int i=0;i<n;i++){for (int j=0;j<n;j++){if (now>=sjf[j].arrived && !flag[j])            //找最短的进程且没有执行过的{nowloc = j;                                          //找到后记录break;}if(now<sjf[j].arrived && j==n-1)           //如果没有进程 等1秒{j=-1;now+=1;}}now+=sjf[nowloc].serve;                  //执行的总时间flag[nowloc] = 1;for(int j=0;j<n;j++)                            //修改等待时间{if(now > sjf[j].arrived && !flag[j])sjf[j].wait=now-sjf[j].arrived;}}long total=0;double totalserve=0;              //计算T Wfor (int i=0;i<n;i++){total+= (sjf[i].wait+sjf[i].serve);totalserve+=(sjf[i].wait+sjf[i].serve)/(double)sjf[i].serve;}printf("SJF\nT=%f                   W=%f\n",total/(float)n,(totalserve/(double)n));
}
void HRRN(Hrrn *hrrn,int n)
{long now = 0,loc=0;Hrrn *temp = malloc(sizeof(Hrrn));       //loc为后面还没有到达进程的位置for(int i=0;i<n;i++){if(now>hrrn[i].arrived)now += hrrn[i].serve;elsenow = hrrn[i].arrived+hrrn[i].serve;for (int j = i+1;j<n;j++)       //每执行一个进程都要更新优先级 和等待时间{if (now>=hrrn[j].arrived){hrrn[j].wait = now-hrrn[j].arrived;hrrn[j].priority = hrrn[j].wait/hrrn[j].serve;}else                //如果没有后面的进程都没到达 那么记录位置并结束{loc=j;break;}}for(int p=(loc-i)/2;p>0;p/=2)    //  希尔排序 按照优先级排序 一样的按照先后   优先级在变 所以需要每次都排序{for (int ii=p;ii<loc;ii++){*temp=hrrn[ii];int j;for (j=ii;j-p>=i+1 && hrrn[j-p].priority <= temp->priority;j-=p)        //第一排序为优先级 第二为到达时间{if (hrrn[j-p].priority < temp->priority)hrrn[j] = hrrn[j-p];else{if(hrrn[j-p].arrived > temp->arrived)hrrn[j] = hrrn[j-p];elsebreak;}}hrrn[j] = *temp;}}}free(temp);long total=0;double totalserve=0;                 //计算T Wfor (int i=0;i<n;i++){total+= (hrrn[i].wait+hrrn[i].serve);totalserve+=(hrrn[i].wait+hrrn[i].serve)/(double)hrrn[i].serve;}printf("HRRN\nT=%f                   W=%f\n",total/(float)n,(totalserve/(double)n));
}int main()
{int n=5000;int a;Sjf *sjf = malloc(n*sizeof(Sjf));Hrrn *hrrn = malloc(n*sizeof(Hrrn));Fcfs *fcfs = malloc(n*sizeof(Fcfs));for(int i=0;i<n;i++)                    //按照到达时间先后进行存储 再进行fcfs时不需要再排序{a=rand() %100+1;                    //随机生成1~100的数 为每一个进程的服务时间sjf[i].arrived=i;sjf[i].wait = 0;sjf[i].serve = a;fcfs[i].arrived = i;fcfs[i].serve = a;fcfs[i].wait = 0;hrrn[i].serve = a;hrrn[i].wait = 0;hrrn[i].priority = 0;hrrn[i].arrived = i;}FCFS(fcfs,n);SJF(sjf,n);HRRN(hrrn,n);free(fcfs);free(hrrn);free(sjf);
/* for(int i=0;i<n;i++){printf("%d %d %d %d\n",hrrn[i].arrived,hrrn[i].serve,hrrn[i].wait,hrrn[i].priority);}*/
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/24916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS18:借助 Al,Siri 将获得广泛的知识,以便触发各个应用的功能

iOS18:借助 Al&#xff0c;Siri 将获得广泛的知识&#xff0c;以触发各个应用的功能 预计Siri将成为iOS18中一系列与人工智能相关增强功能的核心。 根据彭博社记者马克古尔曼的一份新报告&#xff0c;可以得知关于苹果智能助手的一些具体升级的新信息。 Siri新的人工智能: …

经典回归模型及Python实现方法

文章目录 1. 引言2. 经典回归模型及Python实现2.1 线性回归 Linear Regression2.2 多项式回归 Polynomial Regression2.3 逻辑回归 Logistic Regression2.4 岭回归 Ridge Regression2.5 套索回归 LASSO Regression2.6 弹性网络回归 Elastic Net2.7 决策树回归 Decision Tree Re…

Linux GNOME 桌面系统音频设置实现

在 Ubuntu 等使用了 GNOME 桌面系统的 Linux 系统中&#xff0c;通过 设置 应用的 声音 面板设置系统的音频相关配置&#xff0c;如下图&#xff1a; 音频设置可以设置的音频选项主要有如下这些&#xff1a; 系统音量&#xff1a;默认不允许将音量提高到 100% 以上&#xff0c…

Java异常机制

1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的&#xff0c;不正常的情况。 若异常产生后没有正确的处理&#xff0c;会导致程序的中断&#xff0c;程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…

计算机网络 —— 网络层(子网掩码和子网划分)

计算机网络 —— 网络层&#xff08;子网掩码和子网划分&#xff09; 网络地址转换NAT子网掩码和子网划分举个例子第一步&#xff1a;看类型第二步&#xff1a;从主机号开始比对第三步&#xff1a;去头去尾 我们今天来看子网掩码和子网划分&#xff1a; 网络地址转换NAT 网络…

用于认知负荷评估的集成时空深度聚类(ISTDC)

Integrated Spatio-Temporal Deep Clustering (ISTDC) for cognitive workload assessment 摘要&#xff1a; 本文提出了一种新型的集成时空深度聚类&#xff08;ISTDC&#xff09;模型&#xff0c;用于评估认知负荷。该模型首先利用深度表示学习&#xff08;DRL&#xff09;…

人工智能在【肿瘤生物标志物】领域的最新研究进展|顶刊速递·24-06-08

小罗碎碎念 本期文献速递的主题是——人工智能在“肿瘤生物标志物”领域的最新研究进展。 重点关注 今天推荐的6篇文献中&#xff0c;第二篇和第三篇是小罗最喜欢的&#xff0c;因为对于临床来说&#xff0c;比较具有实际意义&#xff0c;也和自己的想法很契合。 尤其是第三篇…

每日一题——Python实现PAT甲级1015 Reversible Primes(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 is_prime函数分析&#xff1a; decimal_to_base函数分析&#xff1a; 主循…

Shell脚本学习_环境变量深入

目录 1.Shell环境变量深入&#xff1a;自定义系统环境变量 2.Shell环境变量深入&#xff1a;加载流程原理介绍 3.Shell环境变量深入&#xff1a;加载流程测试 4.Shell环境变量深入&#xff1a;识别与切换Shell环境类型 1.Shell环境变量深入&#xff1a;自定义系统环境变量 …

旧衣回收小程序开发,轻松回收旧衣物

随着环保理念的增强&#xff0c;回收市场得到了快速发展&#xff0c;吸引了不少年轻人进入到市场中创业。除了传统的废品回收外&#xff0c;旧衣回收也受到了大众的重视&#xff0c;市场规模迅速扩大&#xff0c;大众浪费的衣物也获得了归处。 目前旧衣回收的方式主要是线上与…

makefile与进度条

Linux项目自动化构建工具-make/makefile make是一个命令&#xff0c; makefile是一个文件&#xff0c;保存依赖关系和依赖方法。‘ touch Makefile/makefile mybin:mytest.c//依赖关系 目标文件&#xff1a;依赖文件列表 文件列表的文件之间以空格分隔 gcc -o mybin mytest.…

Shell脚本学习_字符串变量

目录 1.Shell字符串变量&#xff1a;格式介绍 2.Shell字符串变量&#xff1a;拼接 3.Shell字符串变量&#xff1a;字符串截取 4.Shell索引数组变量&#xff1a;定义-获取-拼接-删除 1.Shell字符串变量&#xff1a;格式介绍 1、目标&#xff1a; 能够使用字符串的三种方式 …

linux系统——ping命令

ping命令可以用来判断对远端ip的连通性&#xff0c;可以加域名也可以加公共ip地址 这里发送出56字节&#xff0c;返回64字节

ctfshow-web入门-命令执行(web41_exp与分析)

过滤不严&#xff0c;命令执行 preg_match(/[0-9]|[a-z]|\^|\|\~|\$|\[|\]|\{|\}|\&|\-/i, $c) 过滤掉了数字、字母以及一些符号&#xff0c;之前接触过的无字母 rce 是取反编码再取反&#xff0c;采用不可见字符去绕过正则&#xff0c;但是这里取反符号被过滤掉了&#x…

Kali linux学习入门

Kali linux学习入门 文章目录 Kali linux学习入门Kali Linux简介Kali Linux工具篇Kali Docker安装Docker 更换国内镜像源Kali 安装 docker compose Kali Linux文档篇Kali Linux 社区篇 Kali Linux简介 Kali Linux是专门用于渗透测试linux操作系统&#xff0c;它由BackTrack发展…

软件游戏找不到d3dx9_43.dll怎么办,三分钟教你解决此问题

在现代科技发展的时代&#xff0c;电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们可能会遇到一些问题&#xff0c;其中之一就是电脑缺失d3dx943.dll文件。这个问题可能会影响到我们的正常使用&#xff0c;因此了解其原因和解决方…

接口(API)开发,测试工具-apifox

前言 为什么需要接口&#xff08;API&#xff09;? 因为不同的平台或系统可能使用不同的技术栈、编程语言或数据格式。API提供了一个标准化的方式&#xff0c;使得这些不同的系统可以相互交换数据和功能调用&#xff0c;实现互操作性 在开发日常的项目交互中&#xff0c;不…

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省您的时间&#xff0c;另外还可以对话聊天&#xff0c;解决您编程碰到的问题。 前一篇文章学习了 PyCharm…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…

深度解析:ChatGPT全面测评——功能、性能与用户体验全景剖析

从去年底至今&#xff0c;由 OpenAI 发布的大规模语言模型 ChatGPT 引发了几乎所有科技领域从业者的高度关注。据瑞银集团的报告显示&#xff0c;自 2023 年 1 月起&#xff0c;仅两个月内&#xff0c;ChatGPT 的月活用户数便超过了 1 亿。 ChatGPT 被誉为“最强 AI”&#xff…