操作系统原理与系统——实验十三多道批处理作业调度(作业可移动)

本文主要是介绍操作系统原理与系统——实验十三多道批处理作业调度(作业可移动),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct  data{int hour;//当前小时int min;//当前分钟
}time;
struct node{char name[20];//进程名time arrive;//到达就绪队列时间int zx;//执行时间(预期时间)int size;int tai;int flag;time zhuangru; time start;//开始执行时间(进程调度)time finish;//执行完成时间int zz;//周转时间=完成时间-到达就绪队列时间float zzxs;//带权周转时间系数=周转时间/执行时间struct node* next;
};
//内存结构体typedef struct memory_node{int size; //内存大小int address; //内存始址
} memoryNode;
memoryNode memory;int resource;
//函数名:in参数:无
node* in(){
//函数功能:输入访问序列信息int n;node *q,*head;head = NULL; printf("请输入内存大小:");scanf("%d",&memory.size);printf("请输入起始地址大小为:");scanf("%d",&memory.address);printf("请输入磁带机资源:");scanf("%d",&resource); printf("请输入进程数量:");scanf("%d",&n);printf("请输入进程的参数:\n"); for(int i=0;i<n;i++){node *p = (node *)malloc(sizeof(node));p->flag = 0;p->next = NULL;scanf("%s %d:%d %d分钟 %dK %d台",&p->name,&p->arrive.hour,&p->arrive.min,&p->zx,&p->size,&p->tai);if(head == NULL){head = p;q = p;} else{q->next = p;q = p;}}return head;
}void output(node *p) {//函数功能:按进程执行顺序分别输出每个进程全部结果信息和系统平均时间int sum=0,count=0; float sum1=0; printf("\n模拟进程FCFS调度过程输出结果:\n作业名   到达时间   执行时间(分钟)    装入时间   开始时间   完成时间  周转时间(分钟)  带权周转系数\n");while(p!=NULL){printf("%5s ",p->name);printf("%5d:%02d ",p->arrive.hour,p->arrive.min);printf("%8d(分钟) ",p->zx);printf("%14d:%02d ",p->zhuangru.hour,p->zhuangru.min);printf("%6d:%02d ",p->start.hour,p->start.min);printf("%7d:%02d ",p->finish.hour,p->finish.min);printf("%7d ",p->zz);printf("%20.2f\n",p->zzxs);sum=sum+p->zz;sum1=sum1+p->zzxs;count++;p=p->next;}printf("系统平均周转时间为:%.2f\n",sum*1.0/count);printf("系统平均带权周转系数为:%.2f\n\n",sum1/count);
}
//函数名:FCFS参数:无
void FCFS(){
//函数功能:调用先来先服务算法printf("\n***********FCFS多道批处理作业调度***********\n");node *head = in();node *h,*q;h = NULL;q = head;while(q!=NULL){node *p = (node *)malloc(sizeof(node));*p = *q;p->next = NULL;if(h == NULL){h = p;}else{node *a = h,*b;while(a!=NULL){if(p->arrive.hour*60+p->arrive.min<a->arrive.hour*60+a->arrive.min)break;b = a;a = a->next;}if(a == h){p->next = h;h = p;}else{p->next = a;b->next = p;}}q = q->next; }time now;now.hour = 0;now.min = 0;int qaq = 0,available = resource,space = memory.size;q = h;node *duilie = NULL,*flow,*flagh;node *k,*flowk,*KK=NULL; while(h!=NULL){flagh = h;//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 //大循环每次末尾都回收第一个 q = h;if(duilie==NULL){h = q->next;q->next = NULL;duilie = q;flow = duilie;if(duilie->arrive.hour*60+duilie->arrive.min>now.hour*60+now.min){now.hour = duilie->arrive.hour;now.min = duilie->arrive.min;}duilie->start.hour = now.hour;duilie->start.min = now.min;duilie->zhuangru.hour = now.hour;duilie->zhuangru.min = now.min;available -=q->tai;space = memory.size - duilie->size;}//如果不是第一个,则遍历去找符合条件的 node *hh = h,*hhpre;while(hh!=NULL){if(hh->arrive.hour*60+hh->arrive.min<=duilie->start.hour*60+duilie->start.min+duilie->zx&&space - hh->size>=0&&available-hh->tai>=0){//满足条件hh->start.hour = duilie->start.hour + (duilie->start.min + duilie->zx )/60;hh->start.min = (duilie->start.min + duilie->zx )%60;hh->zhuangru.hour = now.hour;hh->zhuangru.min = now.min;available -=hh->tai;space -=hh->size;if(hh==h){h=hh->next;hh->next = NULL;if(duilie == NULL){duilie = hh;flow = hh;}else{flow->next = hh;flow = hh;}hh = h;}else{hhpre->next = hh->next;hh->next = NULL;if(duilie == NULL){duilie = hh;flow = hh;}else{flow->next = hh;flow = hh;}hh = hhpre->next;}}else{//不满足条件——————>空间不满足 or 磁带机不满足hhpre = hh;hh=hh->next;}}//回收资源k=duilie;k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;space +=k->size;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}		}while(duilie!=NULL)//h==NULL但是duilie不等于NULL {k=duilie;k->start.hour = now.hour;k->start.min = now.min;k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;memory.size +=k->size;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}}output(KK);
}
//函数名:SSTF参数:无
void SPF(){
//函数功能:调用短进程优先调度算法printf("\n***********SPF多道批处理作业调度***********\n");node *head = in();node *h,*q,*H;h = NULL;q = head;H = q;q = q->next;while(q!=NULL){node *p = (node *)malloc(sizeof(node));*p = *q;p->next = NULL;if(h == NULL){h = p;}else{node *a = h,*b;while(a!=NULL){if(p->zx<a->zx)break;b = a;a = a->next;}if(a == h){p->next = h;h = p;}else{p->next = a;b->next = p;}}q = q->next; }H->next = h;h = H;time now;now.hour = 0;now.min = 0;int qaq = 0,available = resource,space = memory.size;q = h;node *duilie = NULL,*flow,*flagh;node *k,*flowk,*KK=NULL; while(h!=NULL){flagh = h;//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 //大循环每次末尾都回收第一个q = h;if(duilie==NULL){h = q->next;q->next = NULL;duilie = q;flow = duilie;if(duilie->arrive.hour*60+duilie->arrive.min>now.hour*60+now.min){now.hour = duilie->arrive.hour;now.min = duilie->arrive.min;}duilie->start.hour = now.hour;duilie->start.min = now.min;duilie->zhuangru.hour = now.hour;duilie->zhuangru.min = now.min;space -= q->size;available -=q->tai;}//如果不是第一个,则遍历去找符合条件的 node *hh = h,*hhpre;while(hh!=NULL){if(hh->arrive.hour*60+hh->arrive.min<=duilie->start.hour*60+duilie->start.min+duilie->zx&&space-hh->size>=0&&available-hh->tai>=0){//满足条件hh->start.hour = duilie->start.hour + (duilie->start.min + duilie->zx )/60;hh->start.min = (duilie->start.min + duilie->zx )%60;hh->zhuangru.hour = now.hour;hh->zhuangru.min = now.min;available -=hh->tai;space -= hh->size;if(hh==h){h=hh->next;hh->next = NULL;if(duilie == NULL){duilie = hh;flow = hh;}else{flow->next = hh;flow = hh;}hh = h;}else{hhpre->next = hh->next;hh->next = NULL;if(duilie == NULL){duilie = hh;flow = hh;}else{flow->next = hh;flow = hh;}hh = hhpre->next;}}else{//不满足条件——————> 空间不满足  or 磁带机不满足hhpre = hh;hh=hh->next;}	}//回收资源k=duilie;space += k->size; k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}		}while(duilie!=NULL)//h==NULL但是duilie不等于NULL {k=duilie;k->start.hour = now.hour;k->start.min = now.min;k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;memory.size +=k->size;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}}output(KK);
}
//函数名:Elevator参数:无
void HRRF(){
//函数功能:调用电梯调度算法printf("\n***********HRRF多道批处理作业调度***********\n");node *head = in();node *h,*q;h = NULL;q = head;while(q!=NULL){node *p = (node *)malloc(sizeof(node));*p = *q;p->next = NULL;if(h == NULL){h = p;}else{node *a = h,*b;while(a!=NULL){if(p->arrive.hour*60+p->arrive.min<a->arrive.hour*60+a->arrive.min)break;b = a;a = a->next;}if(a == h){p->next = h;h = p;}else{p->next = a;b->next = p;}}q = q->next; }time now;now.hour = 0;now.min = 0;int qaq = 0,available = resource,flag=0,space = memory.size;q = h;node *duilie = NULL,*flow,*flagh;node *k,*flowk,*KK=NULL; while(h!=NULL){flagh = h;//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 //大循环每次末尾都回收第一个			q = h;if(flag==0){flag=1;//如果duilie为NULL去找先到达的node *first = h,*b = h;while(b!=NULL){if(b->arrive.hour*60+b->arrive.min<first->arrive.hour*60+first->arrive.min)first = b;b = b->next; } b = h;while(b!=NULL){if(b->next == first)break;b = b->next;}if(first == h){h = first->next;first->next = NULL;duilie = first;}else{b->next = first->next;first->next = NULL;duilie = first;}flow = duilie;now.hour = duilie->arrive.hour;now.min = duilie->arrive.min;duilie->start.hour = now.hour;duilie->start.min = now.min;duilie->zhuangru.hour = now.hour;duilie->zhuangru.min = now.min;now.hour = duilie->start.hour + (duilie->start.min + duilie->zx)/60;now.min =  (duilie->start.min + duilie->zx)%60;duilie->finish.hour = now.hour;duilie->finish.min = now.min;duilie->zz = duilie->finish.hour*60 + duilie->finish.min - (duilie->arrive.hour*60 + duilie->arrive.min);duilie->zzxs = duilie->zz*1.0/duilie->zx; duilie  = duilie->next;KK = flow;flowk = KK;}q = h;node *xyb=NULL;while(q!=NULL){node *p = (node *)malloc(sizeof(node));*p = *q;p->next = NULL;if(xyb == NULL){xyb = p;}else{node *a = xyb,*b;while(a!=NULL){if((now.hour*60+now.min-q->arrive.hour*60-q->arrive.min+q->zx)*1.0/q->zx>(now.hour*60+now.min-a->arrive.hour*60-a->arrive.min+a->zx)*1.0/a->zx)break;b = a;a = a->next;}if(a == xyb){p->next = xyb;xyb = p;}else{p->next = a;b->next = p;}}		q = q->next; }	 //如果不是第一个,则遍历去找符合条件的 node *hh = xyb,*hhpre;while(hh!=NULL){if(memory.size - hh->size>=0&&available-hh->tai>=0){//满足条件available -=hh->tai;memory.size -=hh->size;node *xybh = h,*xybhpre;while(xybh!=NULL){if(strcmp(xybh->name,hh->name) == 0){xybh->zhuangru.hour = now.hour;xybh->zhuangru.min = now.min;break;}xybhpre = xybh;xybh = xybh->next;}if(xybh == h){h = h->next;xybh->next = NULL;if(duilie == NULL){ duilie = xybh;flow = xybh; } else{flow->next = xybh;flow = xybh;}}else{xybhpre->next = xybh->next;xybh->next = NULL;if(duilie == NULL){ duilie = xybh;flow = xybh; } else{flow->next = xybh;flow = xybh;} }}//否则不满足条件——————>  空间不满足 or 磁带机不满足hh = hh->next;				}//回收资源k=duilie;k->start.hour = now.hour;k->start.min = now.min;k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;memory.size +=k->size;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}}while(duilie!=NULL)//h==NULL但是duilie不等于NULL {k=duilie;k->start.hour = now.hour;k->start.min = now.min;k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;k->finish.min = (k->start.min + k->zx)%60;k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);k->zzxs = k->zz*1.0/k->zx; now.hour = k->finish.hour;now.min = k->finish.min;available +=k->tai;memory.size +=k->size;duilie = duilie->next;if(KK==NULL){KK=k;flowk = k;k->next = NULL;}else{flowk->next = k;flowk = k;k->next = NULL;}}output(KK);
}//函数名:Out参数:无
void Out(){
//函数功能:输出选项菜单printf("***************多道批处理作业调度***************\n");printf("  *        1.先来先服务调度算法(FCFS)          *\n");printf("  *        2.最短作业优先算法(SPF)             *\n");printf("  *        3.响应比最高者优先算法(HRRF)        *\n");printf("  *        0.退出                              *\n");printf("           请输入选项[ ]\b\b");
}
int main()
{while (1){Out();//给出选项int c;scanf("%d", &c);switch (c){//选择算法case 1:FCFS();break;case 2:SPF();break;case 3:HRRF();break;default:printf("\n调度结束!");exit(1);}}return 0;
}

实验结果

实验总结

如果学会了作业不可移动的话,对于可移动来说就是不用实际分配内存给作业。

tips:本题思路

这篇关于操作系统原理与系统——实验十三多道批处理作业调度(作业可移动)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984026

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3