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

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

关键代码

#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

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详