操作系统编程进程或作业先来先服务、高优先权、按时间片轮转调度算法

合集下载

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法湖南农业大学科学技术师范学院学生实验报告(高优先权流程图)(按时间片轮转调度)程序说明及实现:1)先来先服务调度算法:高响应比优先实现进程调度.(用C语言实现),2)优先级调度程序:该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。

3)时间片轮转法程序:于此程序中由于程序比较小,未进行分模块设计。

直接采用单壹模块。

1先来先服务#include<stdio.h> floatt,d;/*定义俩个全局变量*/struct/*定义壹个结构体数组,包括进程的信息*/{intid;floatArriveTime;floatRequestTime;floatStartTime;floatEndTime;floatRunTime;floatDQRunTime;intStatus;}arrayT ask[4];/*定义初始化的结构体数组*/GetTask()/*给结构体数组赋值,输入到达,服务时间*/{inti;floata;for(i=0;i<4;i++){arrayT ask[i].id=i+1;printf("inputthenumber");printf("inputthetheArriveTimeofarrayT ask[%d]:",i);/*用户输入进程的时间,初始为零*/scanf("%f",&a);arrayT ask[i].ArriveTime=a;printf("inputtheRequestTimeofarrayT ask[%d]:",i);scanf("%f",&a);arrayT ask[i].RequestTime=a;arrayT ask[i].StartTime=0;arrayT ask[i].EndTime=0;arrayT ask[i].RunTime=0;。

操作系统调度算法

操作系统调度算法

1.先来先服务调度算法
例:在下表中给出进程的到达时 间、执行时间和优先级,请给出 先来先服务调度算法的进程执行 次序和平均周转时间。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1

到 达 执 行 优 先 程 时 时 级 间 间
0 2 3 5 5 10 1 2 1 5 3 1 2 4 3
7.最高响应比优先调度算法
高响应比优先调度算法的基本思想是把 CPU分配给就绪队列中响应 比最高的进程。
高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时 间,综合了先来先服务和最短作业优先两种算法的特点。 优先数=(等待时间+运行时间)/运行时间 例:有3个进程A、B、C,它们分别在7∶50、8∶00和8∶30到达, 它们需要执行的时间分别是 1.5 个小时、 1 小时和 0.4 小时。系统在 9∶00开始按响应比的高者优先算法,对它们进行调度。请回答下列 问题: (1)进程被选中的执行次序是什么? (2)三个进程被选中时的响应比分别是什么?
(T
i 1
n
ei
Tsi )
n ( 1 9 0) (3 2) (7 3) (8 5) ( 1 7 5) 5 7.8
5.短进程优先调度算法
短作业优先又称为“短进程优先,这是对FCFS算法的改进,其目标 是减少平均周转时间。对预计执行时间短的作业(进程)优先分派 处理机。通常后来的短作业不抢先正在执行的作业。
P1 P2 P3 P4
P2
P3
P4
P5
平均周转时间:
P5
T
(T
i 1
n
ei
Tsi )

操作系统第6章(设备管理习题与解答)

操作系统第6章(设备管理习题与解答)

第6章设备管理习题与解答6.1 例题解析例6.2.1 何谓虚拟设备?请说明SPOOLing系统是如何实现虚拟设备的。

解本题的考核要点是虚拟设备的实现方法。

虚拟设备是指利用软件方法,比如SPOOLing系统,把独享设备分割为若干台逻辑上的独占的设备,使用户感受到系统有出若干独占设备在运行。

当然,系统中至少一台拥有物理设备,这是虚拟设备技术的基础。

SPOOLing系统又称“假脱机I/O系统”,其中心思想是,让共享的、高速的、大容量外存储器(比如,磁盘)来模拟若干台独占设备,使系统中的一台或少数几台独占设备变成多台可并行使用的虚拟设备。

SPOOLing系统主要管理外存上的输入井和输出井,以及内存中的输入缓冲区和输出缓冲区。

其管理进程主要有输入和输出进程,负责将输入数据装入到输入井,或者将输出井的数据送出。

它的特点是:提高了 I/O操作的速度;将独占设备改造为共享设备;实现了虚拟设备功能。

例 6.2.2 有关设备管理要领的下列叙述中,( )是不正确的。

A.通道是处理输入、输出的软件B.所有外围设备都由系统统一来管理C.来自通道的I/O中断事件由设备管理负责处理D.编制好的通道程序是存放在主存贮器中的E.由用户给出的设备编号是设备的绝对号解本题的考核要点是设备管理的基本概念。

(1) 通道是计算机上配置的一种专门用于输入输出的设备,是硬件的组成部分。

因此A是错误的。

(2) 目前常见I/O系统其外部设备的驱动和输入输出都由系统统一管理。

因此B是对的。

(3) 设备管理模块中的底层软件中配有专门处理设备中断的处理程序。

通道中断属于设备中断的一种。

因此C是对的。

(4) 通道设备自身只配有一个简单的处理装置(CPU),并不配有存储器,它所运行的通道程序全部来自内存。

因此D是对的。

(5) 系统在初启时为每台物理设备赋予一个绝对号,设备绝对号是相互独立的。

由用户给出的设备号只能是逻辑编号,由系统将逻辑号映射为绝对号。

因此E是错误的。

操作系统考点整理

操作系统考点整理

操作系统考点第一章:1,操作系统的定义(简述):操作系统是一组用于控制和管理计算机系统中所有资源的程序的集合,其任务是合理的组织计算机的工作流程,有效的组织诸资源协调一致的工作以完成各种任务,从何达到充分发挥资源效率方便用户使用计算机的目的。

2,操作系统的功能:<六大点要记得,下面的小点只要记得部分>(1)处理机管理,包括a 进程控制和管理b进程的同步和互斥c进程通信d进程死锁e线程控制和管理f处理器调度(2)存储管理,包括a存储分配b存储共享c地址转换与存储保护d存储扩充(3)设备管理,包括a提供I/O设备的控制与管理b提供缓冲区的管理c提供设备的独立性d外围设备的分配和去配e实现共享性I/O设备的驱动调度f实现虚拟设备(4)文件管理a提供文件逻辑组织方法b提供文件物理组织方法c提供文件存取方法d提供文件使用方法e实现文件的目录管理f实现文件的共享和存取控制g实现文件的存储空间管理(5)网络管理a网上资源管理功能b数据通信管理功能c网络管理功能(6)提供的良好的用户界面,她是直接关系到操作系统能否得到用户认可的一个关键问题。

3,操作系统的特性:(1)并发性(2)共享性(3)不确定性(4)虚拟性(区别并发与并行)4,通道是一种专用处理部件,它能控制一台或者多台外设工作,负责外部设备和内存之间的信息传输。

(注;主机与I/O之间并行程度最高的方式就是通道)第二章:1,操作系统可以通过程序接口和操作接口两种方式把它的服务和功能提供给用户。

程序接口也称应用程序接口(API)2,系统调用他是用户程序或者其他系统程序获得操作系统服务的唯一途径。

第三章:1,中断的概念:中断是指CPU对系统中或系统外发生异步事件的响应。

2,进程是为了描述程序在并发执行时对系统资源的共享,所需的一个描述程序执行时动态特征的概念。

进程是具有独立功能的程序关于某个数据集合上的一个运动活动,是系统进行资源分配,调度和保护的独立单位3,(注意:七状态转换的条件,例如激活是将什么状态转换为什么状态4,PCB(进程控制块)是系统感知进程存在的唯一标志。

四种进程调度算法 先到先服务,优先级,短作业优先,时间片轮转

四种进程调度算法 先到先服务,优先级,短作业优先,时间片轮转

#include"stdio.h"#define N 50int n;int sj;struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻int yxj; //优先级int st2; //标志是否完成float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];void input(Gzuo a[]){printf("请输入进程个数:");scanf("%d",&n);for(int i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sj);}void sjp(Gzuo a[],int sj)//时间片轮转调度{int i,j,min,time;float sum1,sum2;bool flag=true;/*printf("\t请输入进程数(0<n<=50):\t"); scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);printf("\n\n");printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sjp);while(sjp<=0){printf("n\t请重新输入:");scanf("%d",&sjp);}/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻int st2; //标志是否完成float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}*/for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].st2;a[i].st2=a[i+1].st2;a[i+1].st2=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}time = a[0].dt;//printf("赋值后TIME值为:%d\n",time);min = 0;while(min<n){flag=true;for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt<=time)flag=false;}for(i=0;i<n;i++){if(a[i].st2 > 0 ){if(a[i].dt<=time){//printf("当前a[%d].st2值为:%d\n",i,a[i].st2);a[i].st2 = a[i].st2 - sj;//printf("运算后当前a[%d].st2值为:%d\n",i,a[i].st2); //printf("当前TIME值为:%d\n",time);time = time + sj;//printf("增加之后TIME值为:%d\n",time);if(a[i].st2<=0){a[i].wct = time + a[i].st2;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;min++;}}else if(flag)for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt>time){time = a[i].dt;break;}}}}}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt ,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("**************************************************************** *****\n");}void fcfs(Gzuo a[])//先到先服务调度{int i,j,min;float sum1,sum2;/*printf("\t请输入进程数(0<n<=50):\t");scanf("%d",&n);while(n>50||n<=0)printf("n\t请重新输入:"); scanf("%d",&n);}printf("\n\n");/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间 };Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}*/for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt ,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void sjf(Gzuo a[])//短作业优先调度{int i,j,min;int b=0,z;float sum1,sum2;/*printf("\n\t\t请输入进程数(0<n<=50):\t"); scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}*/min=a[0].dt;for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st) {min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b=b+1;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].st>a[z+1].st){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt, a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void yxj(Gzuo a[])//优先级优先调度{int i,j,min;int b=0,z;float sum1,sum2;/*printf("\n\t\t请输入进程数(0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");/* struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int yxj; //优先级int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间 };Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:"); scanf("%d",&a[i].dt);printf("\t服务时间:"); scanf("%d",&a[i].st);printf("\t优先级:");scanf("%d",&a[i].yxj);printf("\n");}*/min=a[0].dt;for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min; min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj) {min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b++;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].yxj<a[z+1].yxj){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n进程:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n"); sum1=0;sum2=0;for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i ].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void main(){ int n;input(a);printf("以下是先到先服务调度:");fcfs(a);printf("以下是短作业优先调度:");sjf(a);printf("以下是时间片轮转法:");sjp(a,sj);printf("以下是优先级优先调度:");yxj(a); }。

操作系统第四章进程调度和死锁习题及答案

操作系统第四章进程调度和死锁习题及答案

第四章一、单项选择题1.为了根据进程的紧迫性做进程调度,应采用(B )。

A.先来先服务调度算法 B. 优先数调度算法 C.时间片轮转调度法 D.分级调度算法2.采用时间片轮转法调度是为了( A)。

A.多个终端都能得到系统的及时响应 B.先来先服务C. 优先数高的进程先使用处理器 D.紧急事件优先处理3.采用优先数调度算法时,对那些具有相同优先数的进程再按( A )的次序分配处理器。

A 先来先服务 B. 时间片轮转 C. 运行时间长短 D.使用外围设备多少4. 当一进程运行时,系统强行将其撤下,让另一个更高优先数的进程占用处理器,这种调度方式是( B )。

A. 非抢占方式B.抢占方式 C. 中断方式 D.查询方式5.( B)必定会引起进程切换。

A.一个进程被创建后进入就绪态B.一个进程从运行态变成阻塞态C.一个进程从阻塞态变成就绪态6.( B)只考虑用户估计的计算机时间,可能使计算时间长的作业等待太久。

A.先来先服务算法B.计算时间短的作业优先算法C.响应比最高者优先算法 D.优先数算法7.先来先服务算法以( A )去选作业,可能会使计算时间短的作业等待时间过长。

A.进入的先后次序 B.计算时间的长短 C.响应比的高低 D.优先数的大小8.可以证明,采用( C )能使平均等待时间最小。

A.优先数调度算法 B.均衡调度算法C.计算时间短的作业优先算法 D.响应比最高者优先算法9.在进行作业调度时.要想兼顾作业等待时间和计算时间,应选取(D )。

A均衡调度算法 B.优先数调度算法C.先来先服务算法D.响应比最高者优先算法10.作业调度算法提到的响应比是指( B )。

A.作业计算时间与等待时间之比B.作业等待时间与计算时间之比C.系统调度时间与作业等待时间之比 D.作业等待时间与系统调度时间之比11.作业调度选择一个作业装入主存后,该作业能否占用处理器必须由( D )来决定。

A.设备管理 B.作业控制 C.驱动调度D.进程调度12.系统出现死锁的根本原因是( D )。

进程调度模拟设计——先来先服务、优先级法复习过程

进程调度模拟设计——先来先服务、优先级法复习过程

进程调度模拟设计——先来先服务、优先级法学号:课程设计题目进程调度模拟设计——先来先服务、优先级法学院计算机科学与技术专业班级姓名指导教师吴利军2013 年 1 月16 日课程设计任务书学生姓名:专业班级:指导教师:吴利军工作单位:计算机科学与技术学院题目: 进程调度模拟设计——先来先服务、优先级法初始条件:1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟进程调度,能够处理以下的情形:⑴能够选择不同的调度算法(要求中给出的调度算法);⑵能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;⑶根据选择的调度算法显示进程调度队列;⑷根据选择的调度算法计算平均周转时间和平均带权周转时间。

2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程调度模拟设计——先来先服务、优先级法1、背景:当计算机系统是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU。

只要有两个或更多的进程处于就绪状态,这种情形就会发生。

如果只有一个CPU可用,那么就必须选择下一个要运行的进程。

在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法成为调度算法。

作业调度算法先来先服务算法短作业算法页

作业调度算法先来先服务算法短作业算法页

作业调度算法: 先来先服务算法、短作业优先算法引言在计算机操作系统中,作业调度算法是一种重要的技术,用于管理和调度计算机系统中的作业。

作业调度算法决定了如何分配计算机资源,以便最大化系统的效率和吞吐量。

本文将介绍两种常见的作业调度算法:先来先服务算法(First Come First Serve,FCFS)和短作业优先算法(Shortest Job First,SJF)。

先来先服务算法(FCFS)先来先服务算法是最简单的作业调度算法之一。

按照作业提交的顺序进行调度,先提交的作业先执行,后提交的作业则等待。

这种调度算法不考虑作业的执行时间或优先级,只根据作业提交的先后顺序来进行调度。

算法流程1.将作业按照提交的先后顺序排列。

2.按照排列顺序执行作业。

优点•算法实现简单,易于理解和实现。

•适用于短作业或者作业提交顺序代表了作业的优先级的情况。

缺点•短作业可能因为长作业的存在而等待时间过长,导致响应时间较长。

•不考虑作业执行时间,可能导致平均等待时间和平均周转时间较长。

•无法适应不同作业的执行时间需求。

短作业优先算法(SJF)短作业优先算法是一种将作业按照执行时间长度进行排序的作业调度算法。

在短作业优先算法中,最短执行时间的作业先执行,以此类推。

该算法可以最大程度地减少作业的等待时间和周转时间。

算法流程1.将作业按照执行时间长度从短到长进行排序。

2.按照排列顺序执行作业。

优点•可以最大程度地减少作业的等待时间和周转时间。

•适用于短作业和长作业相互混合的情况。

缺点•难以准确估计作业的执行时间,可能导致长作业等待时间过长。

•需要预先知道作业的执行时间长度才能进行排序。

•不适用于长作业占主导地位的情况。

性能对比与选择先来先服务算法和短作业优先算法都有其优点和缺点。

选择合适的算法取决于具体的应用场景和需求。

•如果作业都很短,并且没有严格的截止时间要求,先来先服务算法可以简单高效地满足需求。

•如果作业的执行时间非常重要,并且具有较严格的截止时间要求,短作业优先算法可以最大程度地减少作业的等待时间和周转时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统编程进程或作业先来先服务、高优先权、按时间片轮转调度算法湖南农业大学科学技术师范学院学生实验报告姓名: 汤黎波年级专业班级 06级计算机教育班日期 2008 年 12 月 8 日成绩验证设计编程进程或作业先来先服务、综合创新实验类型课程名称计算机操作系统实验名称高优先权、按时间片轮转调度算法(4学时)【实验目的、要求】实验目的:(1)通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。

(2)了解Windows2000/XP中进程(线程)的调度机制。

(3)学习使用Windows2000/XP中进程(线程)调度算法,掌握相应的与调度有关的Win32 API函数。

实验要求:(1)经调试后程序能够正常运行。

(2)采用多进程或多线程方式运行,体现了进程或作业先来先服务、高优先权、按时间片轮转调度的关系。

(3)程序界面美观。

【实验内容】在Windows XP、Windows 2000等操作系统下,使用C语言,利用相应的WIN32 API函数,编写程序实现进程或作业先来先服务、高优先权、按时间片轮转调度算法。

【实验环境】(含主要设计设备、器材、软件等)Pc电脑一台【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)定义:1)先来先服务算法:如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,那么先来先服务(FCFS:first come first service)总是把当前处于就绪队列之首的那个进程调度到运行状态。

2)轮转法就是按一定时间片(记为q)轮番运行各个进程。

如果q是一个定值,则轮转法是一种对各进程机会均等的调度方法。

3)优先级调度的基本思想是,把当前处于就绪队列中优先级最高的进程投入运行,而不管各进程的下一个CPU周期的长短和其他因素。

实验步骤: (1)需求分析:了解基本原理,确定程序的基本功能,查找相关资料,画出基本的数据流图;(2)概要设计:确定程序的总体结构、模块关系和总体流程;(3)详细设计:确定模块内部的流程和实现算法;(4)上机编码和调试;(5)运行测试;(6)编写实验报告。

流程图:,先来先服务流程图,(高优先权流程图)(按时间片轮转调度)程序说明及实现:1)先来先服务调度算法:高响应比优先实现进程调度.(用C语言实现), 2) 优先级调度程序:该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。

3) 时间片轮转法程序:在此程序中由于程序比较小,未进行分模块设计。

直接采用单一模块。

1先来先服务,i nclude<stdio.h>float t,d; /*定义两个全局变量*/struct /*定义一个结构体数组,包括进程的信息*/ {int id;float ArriveTime;float RequestTime;float StartTime;float EndTime;float RunTime;float DQRunTime;int Status;}arrayTask[4]; /*定义初始化的结构体数组*/ GetTask()/*给结构体数组赋值,输入到达,服务时间*/ { int i;float a;for(i=0;i<4;i++){arrayTask[i].id=i+1;printf("input the number");printf("input the the ArriveTime of arrayTask[%d]:",i); /*用户输入进程的时间,初始为零 */scanf("%f",&a);arrayTask[i].ArriveTime=a;printf("input the RequestTime of arrayTask[%d]:",i); scanf("%f",&a);arrayTask[i].RequestTime=a;arrayTask[i].StartTime=0;arrayTask[i].EndTime=0;arrayTask[i].RunTime=0;arrayTask[i].Status=0; /*开始默认的标志位零*/ }}int fcfs() /*定义FCFS中寻找未执行的进程的最先到达时间*/ {int i,j,w=0; /*在结构体数组中找到一个未执行的进程*/ for(i=0;i<4;i++) {if(arrayTask[i].Status==0){t=arrayTask[i].ArriveTime;w=1;}if(w==1)break;}for(i=0;i<4;i++) /*查找数组中到达时间最小未执行的进程*/ {if(arrayTask[i].ArriveTime<t&&arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;} /*返回最小到达时间的数组的下标*/for(i=0;i<4;i++){if (arrayTask[i].ArriveTime==t)return i;}}int sjf() /*定义FCFS中寻找未执行的进程的最先到达时间*/ {int i,x=0,a=0,b=0; /*判断是不是第一个执行的进程*/ float g;for(i=0;i<4;i++){if(arrayTask[i].Status==1) {g=arrayTask[i].EndTime; x=1;}}if(x==0) /*第一个执行的进程按FCFS*/{t=arrayTask[0].ArriveTime; for(i=0;i<4;i++){if(arrayTask[i].ArriveTime<t) { t=arrayTask[i].ArriveTime; a=i; }}return a;}else{for(i=0;i<4;i++){if(arrayTask[i].EndTime>g) g=arrayTask[i].EndTime; }for(i=0;i<4;i++){if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){t=arrayTask[i].RequestTime; a=i;b=1;} /*判断有没有进程在前个进程完成前到达*/}if(b!=0) /*有进程到达则按SJF*/ {for(i=0;i<4;i++){if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i]. RequestTime<t){t=arrayTask[i].RequestTime; a=i;}}return a;}else{ /*否则按FCFS*/for(i=0;i<4;i++){if(arrayTask[i].Status==0) t=arrayTask[i].ArriveTime; }for(i=0;i<4;i++){if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<t){t=arrayTask[i].ArriveTime;a=i;}}return a;}}}new(int s) /*定义执行进程后相关数据的修改*/ {int i,g=0;for(i=0;i<4;i++){if(arrayTask[i].Status==0)continue;else{g=1;break;}}if(g==0) /*当处理的是第一个未执行的进程时执行*/ {arrayTask[s].StartTime=arrayTask[s].ArriveTime;arrayTask[s].EndTime=arrayTask[s].RequestTime+arrayTask[s].ArriveTime;arrayTask[s].RunTime=arrayTask[s].RequestTime; arrayTask[s].Status=1;g=2;}if(g==1) /*当处理的不是第一个未执行的进程时执行*/ {arrayTask[s].Status=1;for(i=0;i<4;i++){if(arrayTask[i].Status==1)d=arrayTask[i].EndTime;}for(i=0;i<4;i++) /*查找最后执行的进程的完成时间*/ {if(arrayTask[i].EndTime>d&&arrayTask[i].Status==1)d=arrayTask[i].EndTime;}if(arrayTask[s].ArriveTime<d) /*判断修改的进程的到达时间是否在前一个执行的进程的完成时间前面*/arrayTask[s].StartTime=d;elsearrayTask[s].StartTime=arrayTask[s].ArriveTime;arrayTask[s].EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;}arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;}Printresult(int j) /*定义打印函数*/{printf("%d\t",arrayTask[j].id);printf("%5.2f\t",arrayTask[j].ArriveTime);printf("%5.2f\t",arrayTask[j].RequestTime);printf("%5.2f\t",arrayTask[j].StartTime);printf("%5.2f\t",arrayTask[j].EndTime);printf("%5.2f\t",arrayTask[j].RunTime);printf("%5.2f\n",arrayTask[j].DQRunTime); }main(){ int i,b,k,a,c=0;int d[4];clrscr();printf("\t F. FCFS \n");printf("\t S. SFJ \n");printf("\t Q. EXIT \n");for(i=0;;i++){if(c)break;printf("please input the number a:\n"); scanf("%d",&a);switch(a){case Q: c=1;break;case F:printf("please input the different-ArriveTime of arrayTasks\n");GetTask();printf("*****************************the result of fcfs\n");printf("Number\tArrive\tServer\tStart\tFinish\tTurnove\tTake power turnover time\n");for(b=0;b<4;b++) /*调用两个函数改变结构体数的值*/ {k=fcfs();d[b]=k;new(k);}for(b=0;b<4;b++)Printresult(d[b]);/*调用打印函数打出结果*/ continue;case S: printf("please input the different-RequestTime of arrayTasks\n");GetTask();printf("******************************the result of sjf\n");printf("Number\tArrive\tRequest\tStart\tEnd\tRun\tDQRun time\n");for(b=0;b<4;b++){k=sjf();d[b]=k;new(k);}for(b=0;b<4;b++)Printresult(d[b]);continue;default:printf("the number Error.please input another number!\n");}}}2 时间片轮转法:#include"string.h"#include "stdio.h"#include "conio.h"#include "graphics.h"#define NULL 0typedef struct quen /*定义结构*/{ char pname[8];int time1;int time2;char state;struct quen *next;} QUEN;main()/*主程序*/{QUEN *q,*p,*head,*m;char str[8],f;int t,d,n;clrscr();textmode(C80);textbackground(0);textcolor(15);printf("Enter the maxnumber of nodes(n):\n");/*输入进程数*/ scanf("%d",&n);d=n;if(d>0){ printf("enter thepname:");scanf("%s",str);printf("enter the need time:"); scanf("%d",&t);head=p=(QUEN *)malloc(sizeof(QUEN)); strcpy(p->pname,str);p->time1=t;p->time2=0;p->state='R';p->next=NULL;head=p;getchar();--d;}while(d>0) {/*构建队列表*/printf("enter the pname:");scanf("%s",str);printf("enter need time:");scanf("%d",&t);q=(QUEN *)malloc(sizeof(QUEN)); strcpy(q->pname,str);q->time1=t;q->time2=0;q->state='R';q->next=NULL;p->next=q;p=q;--d;p->next=head;q=head;}printf("process name need time runned static\n");do{ printf(" %s%d %d %c\n",q->pname,q->time1,q->time2,q->state); q=q->next;}while(q!=head);printf("\n");do{if(head->time2<head->time1){head->time2++;if(head->time2==head->time1){ head->state='E';q=head;textbackground(0);printf("The running process is %s\n",q->pname);printf("process name left time runned static\n");do{ textcolor(15);/*输入队列表*/printf(" %s %d %d %c\n",q->pname,q->time1,q->time2,q->state);q=q->next;}while(q!=head);printf("\n");head=head->next;q=head;p->next=head;}else{printf("The running process is %s\n",q->pname);printf("process name left time runned static\n");do {printf(“%s%d%d %c\n",q->pname,q->time1,q->time2,q->state);q=q->next;}while(q!=head);printf("\n");head=head->next;q=head;p=p->next;}printf("Is it needing new process?(y or n)\n");/*是否加入新的进程*/ getchar();scanf("%c",&f);if(f=='Y'||f=='y'){getchar();printf("Enter the new pname:");scanf("%s",str);printf("Enter the new neededtime:"); scanf("%d",&t);m=(QUEN *)malloc(sizeof(QUEN));strcpy(m->pname,str);m->time1=t;m->time2=0;m->state='R';m->next=NULL;if(q->next->state=='E'){p=m;head=m;p->next=head;q=head;}else{p->next=m;m->next=head;p=m;}}}}while(q->next->state!='E');printf("The processes are finished\n"); }3优先级调度方法:#include <stdio.h>#include "conio.h"typedef struct pcb/*定义结构*/{char name[5];struct pcb *next;int needtime;int priority;char state[5];}NODE;NODE *create_process(int n)/*创建队列*/ {NODE *head,*s,*t;int time,i=0,j;char pname[5];head=(NODE *)malloc(sizeof(NODE)); printf("please input process name:"); scanf("%s",pname);strcpy(head->name,pname);printf("please input need time:"); scanf("%d",&time);head->needtime=time;printf("please input priority:");scanf("%d",&j);head->priority=j;strcpy(head->state,"ready");head->next=NULL;t=head;for(i=1;i<n;i++){ s=(NODE *)malloc(sizeof(NODE));printf("please input process name:");getchar();gets(pname);strcpy(s->name,pname);printf("please input need time:");canf("%d",&time);s->needtime=time;printf("please input priority:");scanf("%d",&j);s->priority=j;strcpy(s->state,"ready");s->next=NULL;t->next=s;t=s;}return head;}pri_process(NODE *p)/*输出进程队列*/{int i;NODE *q;q=p->next;printf("\n name\tneedtime\tpriority \t state\n"); while(q!=NULL){printf("%5s\t %2d \t %2d \t %5s \n",q->name,q->needtime,q->priority,q->state);q=q->next;}}NODE *order(NODE head_sort)/*对进程的优先级进行排序*/ {NODE *p,*s,*q,*head,*r,*t;int m,pr;char name[5];head=head_sort;p=head->next;r=p;t=p;q=p->next;while(r!=NULL){ while(q!=NULL){if(p->priority<q->priority){m=p->priority;p->priority=q->priority;q->priority=m;strcmp(name,p->name);strcmp(p->name,q->name);strcmp(q->name,name);pr=p->needtime;p->needtime=q->needtime;q->needtime=pr;}p=q;q=q->next;}r=r->next;p=t;q=p->next;}return(head_sort);}main()/*主程序*/{ NODE *p=NULL,*head=NULL,*m=NULL,*z=NULL,*n=NULL; int j,time,x=0;char c,pname[5];clrscr();printf("please input process number!");scanf("%d",&x);p=create_process(x);head->next=p;pri_process(head);getchar();while(x>0){ order(head);m=head->next;strcpy(m->state,"run");if(m->priority>=2)m->priority--;m->needtime--;if(head->next!=NULL)pri_process(head);if(m->needtime==0){ head->next=m->next;printf("%s has finished\n",m->name);free(m);x--;}getchar(); }textmode(C80);textbackground(0);textcolor(4);printf("over!");getchar();}Top【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)通过做本实验,让我对进程或作业先来先服务、高优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识~初步理解了操作系统对于作业处理的基本思想~对于时间片轮转法的处理要比优先级调度算法的理解要深。

相关文档
最新文档