操作系统实验-FCFS和短作业优先SJF调度算法模拟

操作系统实验-FCFS和短作业优先SJF调度算法模拟
操作系统实验-FCFS和短作业优先SJF调度算法模拟

题目先来先服务FCFS和短作业优先SJF进程调度算法

姓名:

学号:

专业:

学院:

指导教师:林若宁

二零一八年十一月

一、实验目的

模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解.

二、实验内容

1. 短作业优先调度算法原理

短作业优先调度算法,是指对短作业或断进程优先调度的算法。它们可以分别可以用于作业调度和进程调度。短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

2. 先来先服务调度算法原理

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

三、程序设计

1.概要设计

程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果

2.算法流程

SJF算法流程图:

3.详细设计

(1)定义一个结构体

typedef struct PCB

{

char job_id[10]; //作业ID

float Arr_time; //到达时刻

float Fun_time; //估计运行时间

float Wait_time; //等待时间

float Start_time; //开始时刻

float Fin_time; //完成时刻

float Tur_time; //周转时间

float WTur_time; //带权周转时间

int Order; //优先标记

}list;

(2)先来先服务算法函数

void fcfs(list *p,int count) //先来先服务算法

{

list temp; //临时结构体变量int i;

int j;

for(i = 1;i < count;i++) //按到达时刻直接插入排序

{

temp = p[i];

j = i-1;

while(temp.Arr_time < p[j].Arr_time && j >= 0)

{

p[j+1] = p[j];

--j;

}

p[j+1] = temp;

}

for(i = 0;i < count;i++) //循环计算各个作业的时间值

{

if(i == 0)

{

p[i].Start_time = p[i].Arr_time;

}

else

{

p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻}

p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达

p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行

p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达

p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行}

return;

}

(3)最短作业优先函数

void sjf(list *p,int count) //最短作业优先算法(sjf)

{

list item; //结构体变量

int i = 0;

int j = 0;

int k = 0; //最短运行时间作业的下标

int flag = 0; //优先级设置

float min = 0; //最短运行时间

float temp; //开始的时刻

temp = p[0].Arr_time;

//先求出最先到达作业的时刻for(i = 0;i < count;i++)

{

if(temp > p[i].Arr_time)

{

temp = p[i].Arr_time; //保存最先到达的作业的时刻

k = i; //最先到达的作业的下标,默认为p[0] }

}

for(i = 0;i < count;i++)

{

p[k].Order = ++flag; //设置优先级为1,最高优先级

p[k].Start_time = temp;

p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间

p[k].Fin_time = temp + p[k].Fun_time;

p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;

p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;

min = 100;

temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻

for(j = 0;j < count;j++)

{

if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)

continue;

if(min > p[j].Fun_time)

{

min = p[j].Fun_time;

k = j; //求出满足条件最短运行时间的作业的下标

}

}

}

for(i = 1;i < count;i++) //按优先级排序

{

item = p[i];

j = i-1;

while(item.Order < p[j].Order && j >= 0)

{

p[j+1] = p[j];

--j;

}

p[j+1] = item;

}

return;

}

四、实验结果

测试数据:

(1)先来先服务算法调试

(2)最短作业优先算法调试

五、实验小结

FCFS调度算法有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业(进程)。

CPU繁忙型作业是指该类作业需要大量的CPU时间进行计算,而很少请求I/O。通常的科学计算便属于CPU繁忙型作业。

I/O繁忙型作业是指CPU进行处理时需频繁地请求I/O。目前的大多数事务处理都属于I/O繁忙型作业。

SJ(P)F调度算法也存在不容忽视的缺点:

该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。

该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。

由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

#include "stdafx.h"

#include

#define MAX 100

typedef struct PCB

{

char job_id[10]; //作业ID

float Arr_time; //到达时刻

float Fun_time; //估计运行时间

float Wait_time; //等待时间

float Start_time; //开始时刻

float Fin_time; //完成时刻

float Tur_time; //周转时间

float WTur_time; //带权周转时间

int Order; //优先标记

}list;

void fcfs(list *p,int count);

void sjf(list *p,int count);

void print(list *p,int count);

void avg(list *p,int count);

void fcfs(list *p,int count) //先来先服务算法

{

list temp; //临时结构体变量

int i;

int j;

for(i = 1;i < count;i++) //按到达时刻直接插入排序

{

temp = p[i];

j = i-1;

while(temp.Arr_time < p[j].Arr_time && j >= 0)

{

p[j+1] = p[j];

--j;

}

p[j+1] = temp;

}

for(i = 0;i < count;i++) //循环计算各个作业的时间值

{

if(i == 0)

{

p[i].Start_time = p[i].Arr_time;

}

else

{

p[i].Start_time = p[i-1].Fin_time; //开始时刻==前一个作业的完成时刻}

p[i].Wait_time = p[i].Start_time - p[i].Arr_time; //等待==开始-到达

p[i].Fin_time = p[i].Start_time + p[i].Fun_time; //完成==开始+运行

p[i].Tur_time = p[i].Fin_time - p[i].Arr_time; //周转=完成-到达

p[i].WTur_time = p[i].Tur_time / p[i].Fun_time; //带权周转=周转/运行}

return;

}

void sjf(list *p,int count) //最短作业优先算法(sjf)

{

list item; //结构体变量

int i = 0;

int j = 0;

int k = 0; //最短运行时间作业的下标

int flag = 0; //优先级设置

float min = 0; //最短运行时间

float temp; //开始的时刻

temp = p[0].Arr_time;

//先求出最先到达作业的时刻for(i = 0;i < count;i++)

{

if(temp > p[i].Arr_time)

{

temp = p[i].Arr_time; //保存最先到达的作业的时刻

k = i; //最先到达的作业的下标,默认为p[0] }

}

for(i = 0;i < count;i++)

{

p[k].Order = ++flag; //设置优先级为1,最高优先级

p[k].Start_time = temp;

p[k].Wait_time = temp - p[k].Arr_time; //计算各个时间

p[k].Fin_time = temp + p[k].Fun_time;

p[k].Tur_time = p[k].Fin_time - p[k].Arr_time;

p[k].WTur_time = p[k].Tur_time / p[k].Fun_time;

min = 100;

temp = p[k].Fin_time; //后一个作业的开始时刻是前一个作业的完成时刻

for(j = 0;j < count;j++)

{

if(p[j].Order != 0 || temp - p[j].Arr_time <= 0) //跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)

continue;

if(min > p[j].Fun_time)

{

min = p[j].Fun_time;

k = j; //求出满足条件最短运行时间的作业的下标

}

}

}

for(i = 1;i < count;i++) //按优先级排序

{

item = p[i];

j = i-1;

while(item.Order < p[j].Order && j >= 0)

{

p[j+1] = p[j];

--j;

}

p[j+1] = item;

}

return;

}

void print(list *p,int count) //输出各个作业的详细信息

{

int i;

printf("*****************************************************************\n");

printf("ID\t到达\t运行\t等待\t开始\t完成\t周转\t带权周转\n");

for(i = 0;i < count;i++)

{

printf("%s\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n",p[i].job_id,p[i].Arr_time,p[i].Fun_time, p[i].Wait_time,p[i].Start_time,p[i].Fin_time,p[i].Tur_time,p[i].WTur_time);

}

return;

}

void avg(list *p,int count)

{

float AvgTur1; //平均周转

float AvgTur2; //平均带权周转

float t1 = 0;

float t2 = 0;

int i;

for(i = 0;i < count;i++)

{

t1 += p[i].Tur_time; //周转时间和

t2 += p[i].WTur_time; //带权周转和

}

AvgTur1 = t1/count;

AvgTur2 = t2/count;

printf("\n平均周转时间为:%f\t平均带权周转时间为:%f\n",AvgTur1,AvgTur2);

printf("\n*****************************************************************\n");

return;

int main()

{

list st[MAX]; //最多可以一百个作业

int job_count = 0; //作业数量

int flag = 1; //算法标记

int i = 0;

printf("请输入作业数量:");

scanf("%d",&job_count);

printf("请输入作业ID,到达时刻,估计运行时间(用空格隔开):\n");

do

{

scanf("%s %f %f",st[i].job_id,&st[i].Arr_time,&st[i].Fun_time);

st[i].Order = 0; //优先级初始化

}while(++i < job_count);

printf("请选择算法:\n1, 先来先服务算法!\n2, 最短作业优先算法!\n");

scanf("%d",&flag);

switch(flag)

{

case 1 : {

fcfs(st,job_count);

printf("\n*******************************************\n\n");

printf("先来先服务算法\n");

} break;

case 2 : {

sjf(st,job_count);

printf("\n*******************************************\n\n");

printf("最短作业优先算法\n");

.

} break;

}

print(st,job_count);

avg(st,job_count);

return 0;

}

进程调度算法模拟实验

华北科技学院计算机系综合性实验 实验报告 课程名称操作系统C 实验学期2012至2013学年第2学期学生所在系部计算机系 年级专业班级 学生姓名学号 任课教师杜杏菁 实验成绩 计算机系制

《操作系统C》课程综合性实验报告 开课实验室:基础六机房2013年6月3日 实验题目进程调度算法模拟 一、实验目的 通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。 二、设备与环境 1.硬件设备:PC机一台 2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java等编程语言环境。 三、实验内容 (1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。 (2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段: ?进程标识数ID。 ?进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。 ?进程已占用CPU时间CPUTIME。 ?进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 ?进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进 入阻塞状态。 ?进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将 转换成就绪状态。 ?进程状态STATE。 ?队列指针NEXT,用来将PCB排成队列。 (3)优先数改变的原则: ?进程在就绪队列中呆一个时间片,优先数增加1。 ?进程每运行一个时间片,优先数减3。 (4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。

作业调度_实验报告

实验名 称 作业调度 实验内容1、设计可用于该实验的作业控制块; 2、动态或静态创建多个作业; 3、模拟先来先服务调度算法和短作业优先调度算法。 3、调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间); 3、比较两种调度算法的优劣。 实验原理一、作业 作业(Job)是系统为完成一个用户的计算任务(或一次事物处理)所做的工作总和,它由程序、数据和作业说明书三部分组成,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。 二、作业控制块J C B(J o b C o nt r o l Bl o ck) 作业控制块JCB是记录与该作业有关的各种信息的登记表。为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。 三、作业调度 作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。 四、选择调度算法的准则 1).面向用户的准则 (1) 周转时间短。通常把周转时间的长短作为评价批处理系统的性能、选择作业调度方式与算法的重要准则之一。所谓周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔(称

操作系统:进程调度实验报告

设计性实验报告 一、实验目的 1.在Linux下用C语言编程模拟优先级进程调度算法和时间片轮转进程调度算法。 2.为了清楚地观察每个进程的调度过程,每次调度程序应将各个进程的情况显示出来。 二、总体设计(设计原理、设计方案及流程等) 1、优先级进程调度算法 采用动态优先级进程调度算法,其基本思想是每次调度总是把处理机分配给优先级最高的进程,同时在运行过程中进程的优先级随着执行或等待的时间而降低或增加。 在该实验中每个进程用一个进程控制块( PCB)表示。进程控制块包含如下信息:进程号,进程名、优先数、需要运行时间、已用CPU时间、进程状态。进程号,名字,优先数,运行的时间,事先人为地指定。每个进程的状态可以是就绪,执行,阻塞或完成4种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。就绪队列中的进程在等待一个时间片后,优先级增1。如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时将进程的优先级减1,然后把它插入就绪队列等待CPU。 2、时间片轮转调度算法 采用简单时间片轮转调度算法,其基本思想是:所有就绪进程按 FCFS排成一个队列,总是把处理机分配给队首的进程,各进程占用CPU的时间片相同。如果运行进程用完它的时间片后还未完成,就把它送回到就绪队列的末尾,把处理机重新分配给队首的进程。直至所有的进程运行完毕。 三、实验步骤(包括主要步骤、代码分析等) 1.打开linux虚拟机,用vim编辑器打开代码进行修改和调整。用gcc编译器进行编译编译运行首先运行优先级算法,如图所示:

2020年春【中石油】工程流体力学(含实验演示)模拟实验在线作业(标准)

【石油大学】工程流体力学(含实验演示)-模拟实验在线作业 试卷总分:100 得分:100 第1题,1.(5.0分)水箱气体空间的压力P0(P0≠Pa,Pa为大气压)时,测压管1,2中油品的高度差为h,如果将测压管中的油品换成水(ρwo),水柱高度()油柱高度。 A、大于 B、小于 C、不变 正确答案:B 第2题,2.(5.0分)完全放入水中的平板,如果平板的形心相对水面的深度不变,那么在木板做无规则转动时(木板不露出水面),作用在木板上的静水总压力()。 A、变大 B、变小 C、不变 正确答案:C 第3题,3.(5.0分)随着雷诺数的增大,孔板流量计的理论流量系数μ()。 A、变大 B、变小 C、不变 正确答案:C 第4题,4.(5.0分)伯努利方程可适用于以下那种情况()。 A、不可压缩理想流体渐变流 B、不可压缩理想流体急变流 C、不可压缩实际流体急变流 正确答案:A 第5题,5.(5.0分)在动量方程的实验中,是否需要等流动稳定了再测量记录数据?() A、有必要 B、无所谓 C、不可以 正确答案:A 第6题,6.(5.0分)在测量下临界雷诺数时,阀门应当() A、阀门只可以关小 B、阀门只可以开大 C、关小开大都可以

正确答案:A 第7题,7.(5.0分)实验数据最后整理求局部损失系数时ζ,需要计算() A、前后断面的测压管水头差 B、雷诺数 C、流体的粘度 正确答案:B 第8题,8.(5.0分)沿程水头损失系数λ是相对粗糙度δ/d与雷诺数的Re函数,但是在()流态下,λ仅是相对粗糙度δ/d的函数。 A、层流和紊流光滑区 B、紊流过渡区 C、紊流粗糙区 正确答案:C 第9题,9.(5.0分)在孔口和管嘴的实验中在计算流量系数时,如果孔口和管嘴高度相同以及开孔面积也相同,则()的取值是不相等的。 A、横截面积 B、水头 C、流量 正确答案:C 第10题,10.(5.0分)下面()措施能减小水击的危害。 A、延长关阀时间 B、减小输送流量 C、减小管道直径 正确答案:C 第11题,11.(5.0分)读取测压管读数时,应保持视线与液面边缘的高度平行。 正确 错误 正确答案:错误 第12题,12.(5.0分)浸没于水中的平板,形心yc不会位于总压力的作用点yd之下。 正确 错误 正确答案:正确

作业调度实验报告

作业调度实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

实验二作业调度 一.实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二.实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程 <一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: 执行程序: 2)实验分析:

1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU 时限等因素。 2、每个作业由一个作业控制块JCB 表示,JCB 可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W 。 3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图: 二.最短作业优先算法 三.高响应比算法 图一.先来先服务流程图 4)源程序: #include <> #include <> #include <> #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 int n; float T1=0,T2=0; int times=0; struct jcb .\n",p->name); free(p); .wait...",time); if(times>1000) 代替 代替

实验二--单处理器系统的进程调度

实验二单处理器系统的进程调度 (附实验报告) 1.实验目的 加深对进程概念的理解,明确进程和程序的区别; 深入了解系统如何组织进程、创建进程; 进一步认识如何实现处理器调度。 2.实验预备知识 进程的概念; 进程的组织方式; 进程的创建; 进程的调度。 3.实验内容

编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所作工作进程测试。 4.提示与讲解 这个实验主要要考虑三个问题:如何组织进程、如何创建进程和如何实现处理器调度。 考虑如何组织进程,首先就要设定进程控制块的内容。进程控制块PCB 记录各个进程执行时的情况。不同的操作系统,进程控制块记录的信息内容不一样。操作系统功能越强,软件也越庞大,进程控制块记录的内容也就越多。这里的实验只使用了必不可少的信息。一般操作系统中,无论进程控制块中信息量多少,信息都可以大致分为以下四类: ①标识信息 每个进程都要有一个惟一的标识符,用来标识进程的存在和区别于其他进程。这个标识符是必不可少的,可以用符号或编号实现,它必须是操作系统分配的。在后面给出的参考程序中,采用编号方式,也就是为每个进程依次分配一个不相同的正整数。 ②说明信息

用于记录进程的基本情况,例如进程的状态、等待原因、进程程序存放位置、进程数据存放位置等等。实验中,因为进程没有数据和程序,仅使用进程控制块模拟进程,所以这部分内容仅包括进程状态。 ③现场信息 现场信息记录各个寄存器的内容。当进程由于某种原因让出处理器时,需要将现场信息记录在进程控制块中,当进行进程调度时,从选中进程的进程控制块中读取现场信息进行现场恢复。现场信息就是处理器的相关寄存器内容,包括通用寄存器、程序计数器和程序状态字寄存器等。在实验中,可选取几个寄存器作为代表。用大写的全局变量AX、BX、CX、DX模拟通用寄存器、大写的全局变量PC模拟程序计数器、大写的全局变量PSW模拟程序状态字寄存器。 ④管理信息 管理信息记录进程管理和调度的信息。例如进程优先数、进程队列指针等。实验中,仅包括队列指针。 因此可将进程控制块结构定义如下: struct pcb {int name; int status; int ax, bx, cx,dx;

作业调度实验报告

实验二作业调度 一. 实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS,最短作业优先(SJF)、响应 比高者优先(HRN的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业, 先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准, 总是优先选取执行时间最短的作业。 (3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进 行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 二. 实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三. 实验过程 < 一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析:

1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资 源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到 满足,它所占用的CPU时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、 提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。作业 的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一 每个作业的最初状态总是等待W 3、对每种调度算法都要求打印每个作业幵始运行时刻、完成时刻、周转时 间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间 3) 流程图: .最短作业优先算法 三.高响应比算法 图一.先来先服务流程图 4) 源程序: #in elude #in elude #in elude vconi o.h> #defi ne getpeh(type) (type*)malloc(sizeof(type)) #defi ne NULL 0 int n; float T1=0,T2=0; int times=0;

使用动态优先权的进程调度算法的模拟实验

使用动态优先权的进程调度算法的模拟实验 1.实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 2.实验内容 (1)用C语言实现对N个进程采用动态优先权优先算法的进程调度; (2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段: ●进程标识数; ●进程优先数priority,并规定优先数越大的进程,其优先权越高; ●进程已占用的CPU时间cputime; ●进程还需占用的CPU时间alltime,当进程运行完毕时,alltime变为0; ●进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,进程将进入阻塞 状态; ●进程被阻塞的时间blicktime,表示已阻塞的进程再等待blocktime个时间片后,将转换 为就绪态; ●进程状态state; ●队列指针next,用来将PCB排成队列。 (3)优先数改变的原则: ●进程在就绪队列中呆一个时间片,优先数增加1. ●进程每运行一个时间片,优先数减3。 (4)假设在调度前,系统中有5个进程,它们得初始状态如下: ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 CPUTIME 0 0 0 0 0 ALLTIME 3 3 6 3 4 STARTBLOCK 2 -1 -1 -1 -1 BLOCKTIME 3 0 0 0 0 STATE READY READY READY READY READY (5)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下: RUNNING PROG:i READY_QUEUE:->id1->id2 BLOCK_QUEUE:->id3->id4 ====================================================================== ID 0 1 2 3 4 PRIORITY P0 P1 P2 P3 P4 CPUTIME C0 C1 C3 C4 C5 ALLTIME A0 A1 A2 A3 A4 STARTBLOCK T0 T1 T2 T3 T4 BLOCKTIME B0 B1 B2 B3 B4 STATE S0 S1 S2 S3 S4

操作系统实验报告-作业调度实验

作业调度实验 一.实验目的及要求: 用高级语言编写和调试一个或多个作业调度的模拟程序,以加深对作业调度算法的理解。 二. 实验环境: 操作系统:Windows XP 编译环境:Visual C++ 6.0 三.算法描述 由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。 作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。 每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。 作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。 每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。 四. 实验步骤: 1.、作业等待算法:分别采用先来先服务(FCFS),最短作业优先(SJF)调度算法。 对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间。 2.程序流程图

3、程序源码结构: void main() { void fcfs(); void sjf(); ... while(1){ printf("\n\t\t/* 1、fcfs */"); printf("\n\t\t/* 2、sjf */"); printf("\n\t\t/* 0、Exit */\n"); printf("\n\n\t请选择:\t"); scanf("%d",&a); printf("\n"); switch(a){ case 1: fcfs();break; case 2: sjf();break; default: break; } if(a!=1&&a!=2) break; } }

实验一、进程调度实验报告

实验一、进程调度实验报告

广东技术师范学院实验报告 学院:计算机科学学 院 专业: 计算机科学与 技术(师范) 班级:成绩: 姓名:学号:组别:组员: 实验地点:实验日期:指导教师签名: 实验名称:实验一、进程调度实验 一、实验目的 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解 二、实验类别 综合性实验。综合高级语言编程、进程调度模型、进程调度算法及数据结构等多方面的知识 三、实验内容和步骤 1.编写并调试一个模拟的进程调度程序,采用“最高优先数优先”调度算法对五个进程进行调度。 “最高优先数优先”调度算法的基本思想是把CPU分配给就绪队列中优先数最高的进程。 静态优先数是在创建进程时确定的,并在整个进程运行期间不再改变。 动态优先数是指进程的优先数在创建进程时可以给定一个初始值,并且可以按一定原则修改优先数。例如:在进程获得一次CPU后就将其优先数减少1。或者,进程等待的时间超过某一时限时增加其优先数的值,等等 该题根据老师给的代码用Visual C++运行,结果以及分析如下: 预习情况操作情况考勤情况数据处理情况

结果分析:根据上述输入的三个进程的信息可以得到:优先级最高的是进程cc 最先调度进程cc的状态为运行态,需要执行的时间为10当前就绪队列状态为:进程aa先级比较高,处于就绪队列前面,而进程bb先级是三者中最低的,所以处于就绪队列的最后。而此时这两个进程的状态都为就绪态。

结果分析:当进程cc了一个时间片之后而它已占用CPU时间已达到所需要的运行时间,则将它的优先级减1之后,再将三个进程按优先级的大小排列,从中选择优先级大的进程进入运行状态,则该次进入运行态的是进程aa 按照这种方式一直运行下去: 直到:

石油大学(北京)18春《大学物理(含模拟实验)》第二阶段在线作业100分答案

中国石油大学(北京)15秋《大学物理(含模拟实验)》第二阶段在线作业单选题(共27道题)

3.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:D 此题得分:2.5分4.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分5.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:D 此题得分:2.5分6.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:B 此题得分:2.5分7.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分8.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分9.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分10.题目见图片

?B、. ?C、. ?D、. 我的答案:D 此题得分:2.5分11.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分12.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分13.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分14.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:B 此题得分:2.5分15.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分16.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分17.题目见图片 ?A、. ?B、.

?D、. 我的答案:B 此题得分:2.5分18.题目见图片 ?A、. ?B、. ?C、. ?D、. ?E、. ?F、. 我的答案:D 此题得分:2.5分19.题目见图片 ?A、. ?B、. ?C、. ?D、. ?E、. 我的答案:C 此题得分:2.5分20.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分21.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分22.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:A 此题得分:2.5分23.题目见图片 ?A、. ?B、. ?C、. ?D、. 我的答案:C 此题得分:2.5分24.题目见图片 ?A、.

操作系统实验报告-作业调度

作业调度 一、实验目的 1、对作业调度的相关内容作进一步的理解。 2、明白作业调度的主要任务。 3、通过编程掌握作业调度的主要算法。 二、实验内容及要求 1、对于给定的一组作业, 给出其到达时间和运行时间,例如下表所示: 2、分别用先来先服务算法、短作业优先和响应比高者优先三种算法给出作业的调度顺序。 3、计算每一种算法的平均周转时间及平均带权周转时间并比较不同算法的优劣。

测试数据 workA={'作业名':'A','到达时间':0,'服务时间':6} workB={'作业名':'B','到达时间':2,'服务时间':50} workC={'作业名':'C','到达时间':5,'服务时间':20} workD={'作业名':'D','到达时间':5,'服务时间':10} workE={'作业名':'E','到达时间':12,'服务时间':40} workF={'作业名':'F','到达时间':15,'服务时间':8} 运行结果 先来先服务算法 调度顺序:['A', 'B', 'C', 'D', 'E', 'F'] 周转时间: 带权周转时间:

短作业优先算法 调度顺序:['A', 'D', 'F', 'C', 'E', 'B'] 周转时间: 带权周转时间:1. 响应比高者优先算法 调度顺序:['A', 'D', 'F', 'E', 'C', 'B'] 周转时间: 带权周转时间: 五、代码 #encoding=gbk workA={'作业名':'A','到达时间':0,'服务时间':6,'结束时间':0,'周转时间':0,'带权周转时间':0} workB={'作业名':'B','到达时间':2,'服务时间':50} workC={'作业名':'C','到达时间':5,'服务时间':20} workD={'作业名':'D','到达时间':5,'服务时间':10} workE={'作业名':'E','到达时间':12,'服务时间':40} workF={'作业名':'F','到达时间':15,'服务时间':8} list1=[workB,workA,workC,workD,workE,workF] list2=[workB,workA,workC,workD,workE,workF] list3=[workB,workA,workC,workD,workE,workF] #先来先服务算法 def fcfs(list): resultlist = sorted(list, key=lambda s: s['到达时间']) return resultlist #短作业优先算法 def sjf(list): time=0 resultlist=[] for work1 in list: time+=work1['服务时间'] listdd=[] ctime=0 for i in range(time): for work2 in list: if work2['到达时间']<=ctime: (work2) if len(listdd)!=0: li = sorted(listdd, key=lambda s: s['服务时间']) (li[0]) (li[0]) ctime+=li[0]['服务时间'] listdd=[]

作业调度

作业调度实验报告 1、实验目的 作业管理是用户与操作系统的接口。作业调度的主要功能是检查系统是否能满足用户作业的资源要求以及按照一定的算法选取作业。 本实验的目的是通过模拟作业调度算法的设计加深对作业管理基本原理的理解。 2 实验用具 个人电脑 3、实验内容 ⑴在后备作业队列中,输入5个作业的名称、状态、就绪时间、服务时间及存储空间。 ①按先来先服务的原则进行调度,输出作业调度的顺序及等待的时间。 ②按最短作业(即运行时间最短)优先的原则进行调度,输出作业调度的顺序及等待时间。

4 实习步骤 第一步:首先对整个题目进行分析,包括对作业、主存的定义类型。 第二步:对流程图进行分析,分析一些细节代码。 第三步:根据程序流程图写代码并调节一些细节错误。 第四步:运行看结果,这里主要看内存根据作业的要求对分配情况。 4.1 需求分析 本次实验是在预输入五道作业的基础上初始化,并通过作业的需求更改主存的输出显示情况,首先是输入5道作业,分别使用先来先服务算法和最短时间优先算法分配内存,最后进行内存的回收。

4.2 数据结构设计与说明 定义作业中的变量-资源需求: typedef struct source { int size; //资源要求大小 int tape_count; //资源要求磁带数 }src; 定义作业: typedef struct jobwork { char username[10]; //用户名 char jobname[10]; //作业名 char state[5]; //运行状态 int runtime; //运行时间 src source; //资源需求(结构体类型见上) struct jobwork *next; //下一个指针 }job; 定义内存: typedef struct memory { int size; //内存大小 int tape_count; //内存磁带数 char jobname[10]; //内存中存在的作业名(首次为空) char username[10]; //内存中作业的用户名char state[5]; //内存中作业的状态 int job_count; //内存中作业个数struct memory *next; //内存下一个指针}mem; 4.3 算法设计 第一部分:初始化作业表

进程调度模拟实验

进程调度模拟实验

pr a[MAX]; int n;//进程数 int t;//时间片大小 void input() { int i; printf("请输入进程的名字优先级到达系统时间运行时间:(中间用空格隔开)\n"); for(i=0;ia[j+1].starttime) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } for(i=0;i

for(j=0;jt)//若剩余时间大于时间片

作业调度实验报告

实验项 目名称 作业调度 实验目的及要求一、实验目的: 1、通过模拟作业调度算法的设计加深对作业管理基本原理的理解。 2、深入了解批处理系统如何组织作业、管理作业和调度作业。 3、掌握作业调度算法。 二、实验要求: 1、编写程序完成实验内容; 2、对测试数据进行分析; 3、撰写实验报告。 实验内容1、设计可用于该实验的作业控制块; 2、动态或静态创建多个作业; 3、模拟先来先服务调度算法和短作业优先调度算法。 3、调度所创建的作业并显示调度结果(要求至少显示出各作业的到达时间,服务时间,开始时间,完成时间,周转时间和带权周转时间); 3、比较两种调度算法的优劣。 实验原理一、作业 作业(Job)是系统为完成一个用户的计算任务(或一次事物处理)所做的工作总和,它由程序、数据和作业说明书三部分组成,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。 二、作业控制块J C B(J o b C o n t ro l B lo c k) 作业控制块JCB是记录与该作业有关的各种信息的登记表。为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。在JCB中所包含的内容因系统而异,通常应包含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU 繁忙型、I/O 繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、要求内存大小、要求I/O设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。 三、作业调度 作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及

操作系统作业调度实验报告

实验二作业调度 一.实验题目 1、编写并调试一个单道处理系统的作业等待模拟程序。 作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)的调度算法。 (1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。 (2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。 二.实验目的: 本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解 三.实验过程 <一>单道处理系统作业调度 1)单道处理程序作业调度实验的源程序: zuoye.c 执行程序: zuoye.exe 2)实验分析: 1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业 完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU 时限等因素。 2、每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、 所需的运行时间、所需的资源、作业状态、链指针等等。作业的状态可以是等待 W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。 3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周 转时间,以及这组作业的平均周转时间及带权平均周转时间。 3)流程图:

代替 二.最短作业优先算法 代替 三.高响应比算法 图一.先来先服务流程图 4)源程序: #include #include #include #define getpch(type) (type*)malloc(sizeof(type)) #define NULL 0 int n; float T1=0,T2=0; int times=0; struct jcb //作业控制块 { char name[10]; //作业名 int reachtime; //作业到达时间

进程调度模拟实验说明书

进程调度模拟实验说明书 目录 前 言 ..................................................................... .......... 错误~未定义书签。2 摘 要 ..................................................................... .......... 错误~未定义书签。3 正 文 ..................................................................... .......... 错误~未定义书签。4 1. 设计思 想 ................................................................ 错误~未定义书签。4 2. 算法中用到的主要数据结构(采用类C语言定义)........................53. 相关的各程序伪代码..............................................................6 4. 调试分析...........................................................................9 5. 测试结果..........................................................................11 6( 源程序(带注释)..................................................................... (12) 总结 (16) 参考文献.....................................................................................17 致谢...........................................................................................18附件1部分源代码 (19) 1 前言

操作系统实验 FCFS和短作业优先SJF调度算法模拟

. 题目先来先服务FCFS和短作业优先SJF进程调度算法 姓名: 学号: 专业: 学院: 指导教师:林若宁 二零一八年十一月

一、实验目的 模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解. 二、实验内容 1. 短作业优先调度算法原理 短作业优先调度算法,是指对短作业或断进程优先调度的算法。它们可以分别可以用于作业调度和进程调度。短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2. 先来先服务调度算法原理 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。 三、程序设计 1.概要设计 程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果 2.算法流程

SJF算法流程图:

3.详细设计 (1)定义一个结构体 typedef struct PCB { char job_id[10]; //作业ID float Arr_time; //到达时刻 float Fun_time; //估计运行时间 float Wait_time; //等待时间 float Start_time; //开始时刻 float Fin_time; //完成时刻 float Tur_time; //周转时间 float WTur_time; //带权周转时间 int Order; //优先标记 }list; (2)先来先服务算法函数 void fcfs(list *p,int count) //先来先服务算法{ list temp; //临时结构体变量int i; int j;

短作业优先调度

实验一进程调度 一、实验目的 编写并调试一个模拟的进程调度程序,以加深对进程的概念及进程调度算法的理解. 二、实验内容 1.采用“短进程优先”调度算法对五个进程进行调度。每个进程有一个进 程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、到达 时间、需要运行时间、已用CPU时间、进程状态等等。 2.每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish) 三种状态之一。每进行一次调度程序都打印一次运行进程、就绪队列、 以及各个进程的 PCB,以便进行检查。重复以上过程,直到所要进程都 完成为止。 三、实现思路 主函数-输入函数-短作业优先调度函数-输出函数。 这是一条最基础的思路。输入函数使用文本导入完成数据输入,输出函数输出调度结果,主函数完成各子函数连接,最主要的是短作业优先的调度函数。我想到的方法就是排序,不断选择需要运行时间最短的作业,接着进行数据输入计算输出等,遍历全部数据并完成调度。 四、主要的数据结构 struct Process_struct{ char name[MaxNum]; //进程名称 int arrivetime; //到达时间 int servertime; //开始运行时间 int finishtime; //运行结束时间 int runtime; //运行时间 int runflag; //调度标志 int order; //运行次序

double weightwholetime; //周转时间 double averagewt_FCFS,averagewt_SJF; //平均周转时间 double averagewwt_FCFS,averagewwt_SJF; //平均带权周转时间 }pro[MaxNum]; 五、算法流程图 六、运行与测试 用书上数据对程序进行测试,结果如下:

相关文档
最新文档