操作系统原理与实验——实验四短进程优先调度

实验指南

运行环境:

Dev c++

算法思想: 

进程优先 (SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成

核心数据结构:

typedef struct data{

    int hour;

    int min;

}time;

typedef struct node{

    int id;//编号

    char name[20];//名字

    time arrive;//到达时间

    int zx;//执行时间;

    time start;//开始时间

    time finish;//完成时间

    int zz;//周转时间=执行完成时间-到达就绪队列时间

    double zzxs;//带权周转时间=周转时间/执行时间

    struct node* next;

}linknode;

typedef linknode* linklist;

typedef struct{

    linklist front;

    linklist rear;

}queue;   //队列

程序主体框架:

//函数名:init   参数:无

queue* init(){

//函数功能:初始化队列,返回队列指针

}

//函数名:insert  参数:Queue *cc, node *x

void insert(queue* cc,linklist s){

    //函数功能:尾插入队

}

//函数名:dele  参数:Queue *cc

void dele(queue* cc){

//功能:队首结点出队

}

//函数名:input   参数:Queue *cc

void input(queue* cc){

//功能:实现作业队列的输入

}

//函数名:sort参数:Queue *cc

void sort(queue* cc){

    //函数功能:对到达时间进行排序

}

//函数名:solve_SJF参数:Queue *cc

void solve_SJF(queue* cc){ 

//函数功能:解决短进程优先调度算法

}

int main()

{

    while(true)

    {

        int op;

        printf("请输入操作(1:开始进程调度;0:结束进程)");

        scanf("%d",&op);

        if(op==0) break;

        queue *cc;

        cc = init(cc);

        input(cc);

        solve_SJF(cc);

    }

    return 0;

}

测试用例:

用例一:

5001 p1 9:40 20
5004 p4 10:10 10
5005 p5 10:05 30
5002 p2 9:55 15
5003 p3 9:45 25

用例二:

5001 p1 19:40 20
5002 p4 10:10 10
5003 p5 10:05 30
5004 p2 9:55 15
5005 p3 9:45 25
5006 p6 11:40 20
5007 p8 12:10 10
5008 p9 13:05 30
5009 p10 19:55 15
5010 p7 7:15 15

关键代码

#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct data{int hour;int min;
}time;
typedef struct node{int id;//编号char name[20];//名字time arrive;//到达时间int zx;//执行时间;time start;//开始时间time finish;//完成时间int zz;//周转时间=执行完成时间-到达就绪队列时间double zzxs;//带权周转时间=周转时间/执行时间struct node* next;
}linknode;typedef linknode* linklist;typedef struct{linklist front;linklist rear;
}queue;   //队列
void sort(queue* cc);
void solve_SJF(queue* cc);
//函数名:init   参数:无
queue* init(){
//函数功能:初始化队列,返回队列指针queue* p=(queue*)malloc(sizeof(queue));p->front=NULL;p->rear=NULL;return p;
}
//函数名:insert  参数:Queue *cc, node *x
void insert(queue* cc,linklist s){//函数功能:尾插入队linknode*p=(linknode *)malloc(sizeof(linknode));*p=*s;//printf("%d ",p->id);if(cc->front==NULL&&cc->rear==NULL){cc->front=p;cc->rear=p;}else{cc->rear->next=p;cc->rear=p;}
}
//函数名:dele  参数:Queue *cc
void dele(queue* cc){ 
//功能:队首结点出队linklist bl,p;float zz=0,zx=0;int n=0;bl=cc->front;printf("模拟短进程优先调度过程输出结果\nid号   名字   到达时间   执行时间(分钟)   开始时间   完成时间   周转时间(分钟)   带权周转系数\n");while(bl!=NULL){printf("%d\t%s\t%d:%02d\t\t%d\t\t%d:%02d\t%d:%02d\t\t%d\t\t%.2f\n",bl->id,bl->name,bl->arrive.hour,bl->arrive.min,bl->zx,bl->start.hour,bl->start.min,bl->finish.hour,bl->finish.min,bl->zz,bl->zzxs);p=bl;zz=zz+bl->zz;zx=zx+bl->zzxs;bl=bl->next;free(p);n++;}printf("系统平均周转时间为:\t\t\t\t\t\t\t%.2f\n",zz/n);printf("系统平均带权周转系数为:\t\t\t\t\t\t\t\t%.2f\n",zx/n);
}
//函数名:input   参数:Queue *cc
void input(queue* cc){
//功能:实现作业队列的输入int n;linklist head=NULL,q;printf("请输入进程数:");scanf("%d",&n);while(n--){linknode*p=(linknode *)malloc(sizeof(linknode));scanf("%d %s %d:%d %d",&p->id,&p->name,&p->arrive.hour,&p->arrive.min,&p->zx);p->next=NULL; insert(cc,p);}head=cc->front;sort(cc);
}
//函数名:sort参数:Queue *cc
void sort(queue* cc){ //函数功能:对到达时间进行排序linklist head=NULL,bl,pre,q;bl=cc->front;while(bl!=NULL){linknode*p=(linknode *)malloc(sizeof(linknode));*p=*bl;p->next=NULL;if(head==NULL){head=p;}else{pre=NULL;q=head;while(q!=NULL){if((p->arrive.hour<head->arrive.hour)||((p->arrive.hour==head->arrive.hour)&&(p->arrive.min<head->arrive.min))){p->next=head;head=p;break;}else if(((p->arrive.hour>q->arrive.hour)||((p->arrive.hour==q->arrive.hour)&&(p->arrive.min>q->arrive.min)))&&q->next==NULL){q->next=p;break;}else if((p->arrive.hour<q->arrive.hour)||((p->arrive.hour==q->arrive.hour)&&(p->arrive.min<q->arrive.min))){p->next=q;pre->next=p;break;}pre=q;q=q->next;}}bl=bl->next;}cc->front=head;cc->rear=pre;}
//函数名:solve_SJF参数:Queue *cc
void solve_SJF(queue* cc){	
//函数功能:解决短进程优先调度算法 sort(cc);linklist head=NULL,min,pre,q,bl,bl2,bl3,sf;time tt;bl=cc->front;while(bl!=NULL){if(head==NULL){//printf("创建链表为空\n");linknode*p=(linknode *)malloc(sizeof(linknode));*p=*bl;p->next=NULL;p->start.hour=p->arrive.hour;p->start.min=p->arrive.min;p->finish.min=(p->start.min+p->zx)%60;p->finish.hour=p->start.hour+(p->start.min+p->zx)/60;p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;p->zzxs=p->zz*1.0/p->zx;head=p;q=head;tt.min=(p->arrive.min+p->zx)%60;tt.hour=p->arrive.hour+(p->arrive.min+p->zx)/60;bl=bl->next;}else{//printf("创建链表不为空\n");bl2=bl;min=bl;bl3=bl;int flag=0;while(bl2!=NULL){if((bl2->arrive.hour<tt.hour)||((bl2->arrive.hour==tt.hour)&&(bl2->arrive.min<tt.min))){if(bl2->zx<min->zx){min=bl2;flag=1;while(1){if(bl3->next==min||bl3==min)break;bl3=bl3->next;}}}bl2=bl2->next;}if(flag==1){//printf("找到最小执行时间\n");linknode*p=(linknode *)malloc(sizeof(linknode));*p=*min;p->next=NULL;q->next=p;q=p;bl3->next=min->next;free(min);p->start.hour=tt.hour;p->start.min=tt.min;p->finish.min=(tt.min+p->zx)%60;p->finish.hour=tt.hour+(tt.min+p->zx)/60;p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;p->zzxs=p->zz*1.0/p->zx;tt.min=p->finish.min;tt.hour=p->finish.hour;}else{//printf("没有找到最小执行时间\n");linknode*p=(linknode *)malloc(sizeof(linknode));*p=*min;p->next=NULL;if((p->arrive.hour<tt.hour)||((p->arrive.hour==tt.hour)&&(p->arrive.min<tt.min))){p->start.hour=tt.hour;p->start.min=tt.min;p->finish.min=(tt.min+p->zx)%60;p->finish.hour=tt.hour+(tt.min+p->zx)/60;p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;p->zzxs=p->zz*1.0/p->zx;tt.min=p->finish.min;tt.hour=p->finish.hour;}else{p->start.hour=p->arrive.hour;p->start.min=p->arrive.min;p->finish.min=(p->start.min+p->zx)%60;p->finish.hour=p->start.hour+(p->start.min+p->zx)/60;p->zz=p->finish.hour*60+p->finish.min-p->arrive.hour*60-p->arrive.min;p->zzxs=p->zz*1.0/p->zx;tt.min=p->finish.min;tt.hour=p->finish.hour;}q->next=p;q=p;bl=bl->next;}}}cc->front=head;bl=head;while(bl->next!=NULL){bl=bl->next;}cc->rear=bl;dele(cc);
}
int main()
{while(true){int op;printf("请输入操作(1:开始进程调度;0:结束进程)");scanf("%d",&op);if(op==0) break;queue *cc;cc = init();input(cc);solve_SJF(cc);}return 0;
}

运行结果

实验总结

①经过前两次的实验后,对单链表的使用相较之前熟练了很多,但有时对指针的应用还不是很熟练,要多加练习

②在这次的实验中,对多种情况的分析没有做得很好,导致一直停留在if-else语句处,今后考虑问题要从多个方面来考虑

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

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

相关文章

Docker镜像操作介绍

一、镜像操作 镜像的操作可分为&#xff1a; 拉取镜像&#xff1a;拉取远程仓库的镜像到本地 docker pull重命名镜像&#xff1a;使用docker tag 命令重命名镜像查看镜像&#xff1a;使用docker image ls 或者 docker images命令查看本地已经存在的镜像删除镜像&#xff1a;删…

蓝桥杯倒计时 38 天

整数二分模板&#xff1a;数的范围 二分的本质不是单调性&#xff0c;而是二分出能满足某种性质使得将整数分成两半。 思考&#xff1a;模板题&#xff0c;模板记熟就能做 #include<iostream> using namespace std; int n,q; const int N 1e510; int a[N]; int main…

Jenkins 将shell脚本启动方式修改为bash

platform"arm x86" if [[ "$platform" ~ "arm" ]] thenecho "arm" fi最近在调试Jenkins实现的一些功能&#xff0c;发现在本地可以运行的脚本内容到了Jenkins里面就没办法运行了&#xff0c;不是提示unexpected operator就是提示[[ : …

Python 系统学习总结(基础语法+函数+数据容器+文件+异常+包+面向对象)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 六天时间系统学习Python基础总结&#xff0c;目前不包括可视化部分&#xff0c;其他部分基本齐全&#xff0c;总结记录&#xff0…

网络编程 24/3/6 作业

1、数据库的增删改 #include <myhead.h> int main(int argc, const char *argv[]) {//定义数据库句柄指针sqlite3 *kdbNULL;//打开数据库&#xff0c;不存在则创建if(sqlite3_open("./my.db",&kdb)!SQLITE_OK){printf("sqlite3_open error\n");…

全连接神经网络算法原理(激活函数、前向传播、梯度下降法、损失函数、反向传播)

文章目录 前言1、全连接神经网络的整体结构&#xff1a;全连接神经网络模型是由输入层、隐藏层、输出层所组成&#xff0c;全连接神经网络结构如下图所示&#xff1a;全连接神经网络的每一层都是由一个一个的神经元所组成的&#xff0c;因此只要搞清楚神经元的本质就可以搞清楚…

算法竞赛基础:树状数组

算法竞赛基础&#xff1a;树状数组 是什么&#xff1f; 树状数组虽然语义上是树状&#xff0c;但是实际上还是一个数组。 树状数组的功能就是单点和区间的修改和查询。 例如&#xff0c;如果想增加一个点的值&#xff0c;那么你需要让其上方所有能对齐的树状数组c全部增加相同…

QChart柱状图

//柱状图// 创建柱状图数据QBarSet *set0 new QBarSet("");*set0 << 1601 << 974 << 655 << 362;QBarSeries *series new QBarSeries();series->append(set0);set0->setColor(QColor("#F5834B"));// 创建柱状图QChart *ch…

github双因子认证

最近换了个安卓手机&#xff0c;打算让之前的苹果手机退役了&#xff0c;所以需要重新搞GitHub的Two-factor authentication 步骤如下&#xff1a; 1. 访问安全中心 https://github.com/settings/security 2. 点击Authenticator app右侧按钮 3. 下载腾讯身份验证器&#xff…

CSS常见布局方式

一、静态布局&#xff08;Static Layout&#xff09; 既传统web设计 就是不管浏览器尺寸多少&#xff0c;网页布局就按当时写代码的布局来布置; 块级元素&#xff1a;每个块级元素会在上一个元素下面另起一行&#xff0c;他们会被设置好的margin分离。块级元素是垂直组织的。 …

python跨文件夹调用

如图所示&#xff0c;我们要在bin文件夹下的run_patchcore.py文件中调用src/patchcore文件夹下的backbone.py, common.py等文件。如第13行 方法1&#xff1a;将patchcore的上一层目录src添加到环境变量中 run_patchcore.py 文件中写入import sys sys.path.append(/home/rui/P…

苹果群控软件开发必不可少的代码!

在开发苹果群控软件时&#xff0c;编写高质量的代码是至关重要的&#xff0c;这些代码不仅需要实现功能&#xff0c;还需要保证软件的稳定性、安全性和可扩展性&#xff0c;本文将分享四段在苹果群控软件开发中必不可少的源代码&#xff0c;并解释每段代码的作用和实现原理。 一…

HM2019创建分析模型

步骤一&#xff1a;查看单元类类型&#xff08;通过card edit&#xff09;&#xff0c;然后展开模型查看模型信息&#xff1b;步骤二&#xff1a;为材料集里添加新的材料 材料:Al 弹性模量E:70000 泊松比NU:0.33 其中&#xff1a;MAT1表示各向同性材料&#xff0c;E表示弹…

【漏洞复现】ShopXO任意文件读取漏洞

Nx01 产品简介 ShopXO是一套开源的企业级开源电子商务系统&#xff0c;包含PC、H5、微信小程序、支付宝小程序、百度小程序等多个终端&#xff0c;遵循Apache2开源协议发布&#xff0c;基于ThinkPHP5.1框架研发。该系统具有求实进取、创新专注、自主研发、国内领先企业级B2C电商…

three.js可以对3D模型做什么操作和交互,这里告诉你。

Three.js 提供了多种交互功能&#xff0c;可以对 3D 模型进行各种操作和交互。以下是一些常见的交互功能&#xff1a; 鼠标交互 通过鼠标事件&#xff0c;可以实现模型的拖拽、旋转、缩放等操作。例如&#xff0c;可以通过鼠标拖拽来改变模型的位置或角度。 触摸交互 对于支…

95、评估使用多线程优化带来的性能提升

本节评估一下&#xff0c;通过对卷积的 co 维度进行多线程切分之后&#xff0c;对于模型的性能提升。 评估下性能 在进行多线程程序运行时&#xff0c;建议电脑中的 CPU 不要有其他繁重的任务执行。 在相同的环境下&#xff0c;分别运行 5th_codegen 和 6th_multi_thread 下的…

ACWing:99.激光炸弹

#include <iostream> #include <algorithm> using namespace std;const int N 5010;int arr[N][N] {0}; int n,r; int main(){Sios::sync_with_stdio(0),cin.tie(0);cin >> n >> r;r min(r,5001);int X r,Y r; // X Y轴的取值范围 for(int…

Claude3 AI系列重磅推出:引领多模态智能时代的前沿技术,超越GPT-4

Claude3正式发布&#xff1a;号称性能超 GPT-4&#xff0c;免费使用、支持中文 划重点: &#x1f680; Claude3系列发布&#xff0c;包括Haiku、Sonnet和Opus版本&#xff0c;Opus在多个领域超越GPT-4。 &#x1f310; 用户可免费使用Claude3Sonnet模型&#xff0c;支持中文&am…

算法刷题day22:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法&#xff0c;主要是用来处理枚举子区间的事&#xff0c;时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…

Redis的散列插槽及故障转移

散列插槽 散列插槽原理类似于一个哈希散列表&#xff0c;通过哈希算法来映射插槽&#xff0c;并为redis节点分配插槽区间&#xff0c;插槽的所有范围是0~16383 数据key不是与节点绑定&#xff0c;而是与插槽绑定。redis会根据key的有效部分计算插槽值&#xff0c;分两种情况&a…