作业调度之短作业优先(实验一)
来源:互联网 发布:win7虚拟机mac os x 编辑:程序博客网 时间:2024/05/16 03:05
作业:作业是一个比程序更广泛的概念,它不仅包含了通常的程序和数据,而且还应配有的一份说明书,系统根据这份说明书对程序上的运行进行控制。在批处理系统中,是以作业为单位从外存调入内存。
作业调度的主要任务:根据JPB中的信息,检测系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。
短作业优先调度算法:以作业时间的长短计算优先级,作业越短,优先级越高。短作业优先相对于先来先服务有着很大的改进,但短作业优先也有很多的不足。短作业优先必须预知作业的时间,短作业优先算法对长作业十分的不利甚至会忽略掉长作业,短作业优先算法不能人机交互,不能保证紧急的作业能够及时执行。
周转时间:从作业提交给操作系统开始到作业完成的这段时间间隔,尽可能使周转时间小也是处理机调度的目标。
周转时间 = 服务时间 + 等待时间 = 完成时间 - 到达时间
带权周转时间:周转时间和对该作业的服务时间的比值。
模拟短作业优先的C代码:
#include <stdio.h>#include <string.h>#include <stdlib.h>#define Max 256struct Job{ //描述作业信息 char *name; int need_time; int come_time; int time; double play_time; double avg_time; struct Job *next; Job() //默认构造函数 { name = NULL; next = NULL; time = 0; come_time = 0; need_time = 0; avg_time = 0; play_time = 0; } void copy_job(struct Job *temp) //拷贝函数 { name = (char *)malloc(sizeof(char) *strlen(temp->name)); strcpy(name,temp->name); come_time = temp->come_time; need_time = temp->need_time; time = temp->time; play_time = temp->play_time; avg_time = temp->avg_time; return; } void play_and_avg_time(int end_time) //计算周转时间、带权周转时间 { double wait_time; this->play_time = end_time - this->come_time; wait_time = this->play_time - this->need_time; avg_time = 1 + (wait_time / need_time); return; }};int sum; //统计作业的个数void init_queue(struct Job **head,char *name,int come_time,int need_time) //初始化作业链表{ struct Job *temp = new Job(); temp->name = (char *)malloc(sizeof(char) * strlen(name)); strcpy(temp->name,name); temp->come_time = come_time; temp->need_time = need_time; temp ->next = (*head)->next; (*head)->next = temp; return;}void out_one(struct Job *temp) //显示作业信息{ printf("name: %s\n",temp->name); printf("come_time: %d\n",temp->come_time); printf("need_time: %d\n",temp->need_time); printf("avg_time: %0.1f\n",temp->avg_time); printf("play_time: %0.1f\n",temp->play_time); return;}void out_one_queue(struct Job *temp,int i){ printf("this time = %d, the job over! \n",i); out_one(temp); printf("\n"); return;}void add_queue(struct Job *temp,struct Job **head_queue) //在队列中添加一个作业{ struct Job *temp_queue = new Job(); temp_queue->copy_job(temp); //拷贝作业信息 if((*head_queue) ->next == NULL){ (*head_queue) ->next = temp_queue; return; } struct Job *p; for(p = (*head_queue)->next; p ->next; p = p->next){ //按照作业时间大小及到达时间插入到队列 if(p->next->need_time > temp_queue->need_time){ temp_queue ->next = p ->next; p ->next = temp_queue; return; } else if(p->next->need_time == temp_queue->need_time){ temp_queue ->next = p ->next ->next; p->next = temp_queue; return; } } if(!p ->next) p ->next = temp_queue; return;}void dele_queue(struct Job *head_queue) //从队列中删除一个作业{ if(!head_queue ->next) return; struct Job *p = head_queue ->next; head_queue->next = head_queue->next->next; delete p; return;}void mo_ni(struct Job *head,struct Job **head_queue) //模拟作业,每次循环加一{ int i = 0,count_job = 0; while(i >= 0){ for(struct Job *p = head->next; p; p = p->next) //检查该时间点有无作业到达 if(i == p->come_time){ //如果有作业到达,加入作业队列 add_queue(p,head_queue); } if((*head_queue)->next){ if((*head_queue)->next->time == (*head_queue)->next->need_time){ //检查作业服务是否完成 (*head_queue)->next->play_and_avg_time(i); //计算周转时间、带权周转时间 out_one_queue((*head_queue)->next,i); dele_queue((*head_queue)); //从作业队列中删除 count_job++; //作业计数器加1 } } if((*head_queue)->next) //作业服务时间计数器加1 (*head_queue) ->next->time ++; i++; if(count_job == sum) //所有作业全部完成,结束 return; } return;}int main(int argc,char *argv[]){ struct Job *head = new Job(); struct Job *head_queue = new Job(); char name[Max]; int come_time; int need_time; FILE *input_file = fopen("C:\\Users\\chenhongyu\\Desktop\\test.txt","r"); //从文件读取作业信息 printf("plase input name come_time need_time,if over plase input [CTRL + Z]\n\n"); while(fscanf(input_file,"%s%d%d",name,&come_time,&need_time) != EOF){ sum++; init_queue(&head,name,come_time,need_time); } mo_ni(head,&head_queue); //模拟作业 return 0;}
0 0
- 作业调度之短作业优先(实验一)
- 短作业优先调度算法
- 短作业优先调度算法
- 短作业优先调度算法(C++代码)
- 调度算法——短作业优先(java实现)
- 操作系统短作业优先(SJF)调度算法
- 最短作业优先调度算法
- 进程调度算法 短作业优先 SJF
- 作业优先调度算法 先来先服务、短作业调度算法(c语言描述)
- 《操作系统》 先来先服务FCFS和短作业优先SJF进程调度算法相关计算及实验
- 算法/调度算法/ShortJobFirst(SJF)短作业优先调度算法
- 短作业调度算法
- 抢占式短作业优先调度算法(SJF)
- 每日一练——轮询调度算法和短作业优先调度算法的平均等待时间
- java短作业优先调度算法(SJF) ---------> 求平均等待时间
- 最短作业优先调度算法(SJF算法)的C++实现
- 百度2016实习笔试:短作业优先调度算法(SJF)的平均等待时间---java版本
- 短作业优先调度算法(SJF)——Java实现
- solve: faild to load SELinux policy freezing
- JavaScript 简介
- ubuntu安装Node.js和npm
- Map按键有序输出
- leetcode 438. Find All Anagrams in a String
- 作业调度之短作业优先(实验一)
- C语言经典算法12
- 王爽汇编第二版实验12
- 基于地图的短信追踪小练习(8)地图覆盖物点击事件与活动间数据的传递
- 58. web 攻击技术(2)
- MySQL Select-limit
- C语言经典算法13
- BOM编程-NODE
- 用Java写股票查询系统(小组同学的作业)