实验一 批处理系统的作业调度

合集下载

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

操作系统作业调度实验报告
#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; //作业到达时间
3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。
3)流程图:
二.最短作业优先算法
三.高响应比算法
图一.先来先服务流程图
4)源程序:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
{
if(m==3) //显示高响应比算法调度作业后的运行情况
{
printf("\n作业%s正在运行,估计其运行情况:\n",q->name);
printf("开始运行时刻:%d\n",q->starttime);
printf("完成时刻:%d\n",q->finishtime);
printf("周转时间:%f\n",q->cycletime);
struct jcb *next; //结构体指针
}*ready=NULL,*p,*q;
typedef struct jcb JCB;
void inize()//初始化界面
{
printf("\n\n\t\t*********************************************\t\t\n");

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告

操作系统实验之处理机调度实验报告一、实验目的处理机调度是操作系统中的核心功能之一,本次实验的主要目的是通过模拟不同的处理机调度算法,深入理解操作系统对处理机资源的分配和管理策略,比较不同调度算法的性能差异,并观察它们在不同负载情况下的表现。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 Python 38。

实验中使用了 Python 的相关库,如`numpy`、`matplotlib`等,用于数据生成、计算和图形绘制。

三、实验原理1、先来先服务(FCFS)调度算法先来先服务算法按照作业到达的先后顺序进行调度。

先到达的作业先被服务,直到完成或阻塞,然后再处理下一个到达的作业。

2、短作业优先(SJF)调度算法短作业优先算法选择预计运行时间最短的作业先执行。

这种算法可以有效地减少作业的平均等待时间,但可能导致长作业长时间等待。

3、时间片轮转(RR)调度算法时间片轮转算法将处理机的时间分成固定长度的时间片,每个作业轮流获得一个时间片的处理时间。

当时间片用完后,如果作业还未完成,则将其放入就绪队列的末尾等待下一轮调度。

4、优先级调度算法优先级调度算法为每个作业分配一个优先级,优先级高的作业先被执行。

优先级可以根据作业的性质、紧急程度等因素来确定。

四、实验内容与步骤1、数据生成首先,生成一组模拟的作业,包括作业的到达时间、预计运行时间和优先级等信息。

为了使实验结果更具代表性,生成了不同规模和特征的作业集合。

2、算法实现分别实现了先来先服务、短作业优先、时间片轮转和优先级调度这四种算法。

在实现过程中,严格按照算法的定义和规则进行处理机的分配和调度。

3、性能评估指标定义了以下性能评估指标来比较不同调度算法的效果:平均等待时间:作业在就绪队列中的等待时间的平均值。

平均周转时间:作业从到达系统到完成的时间间隔的平均值。

系统吞吐量:单位时间内完成的作业数量。

4、实验结果分析对每种调度算法进行多次实验,使用不同的作业集合,并记录相应的性能指标数据。

实验一:批处理系统的作业调度

实验一:批处理系统的作业调度
int length; //作业长度,所需内存大小
int printer; //作业执行所需打印机的数量
int tape; //作业执行所需磁带机的数量
int jobcount=0; //系统内现有作业数量
void shedule()
//作业调度函数
{ float xk,k;
int p,q,s,t;
do
{ p=head;
q=s=-1;
k=0;
while(p!=-1)
{ if(jobtable[p].length<=memory&&jobtable[p].tape<=tape&&jobtable[p].printer<=printer)
{ //系统可用资源是否满足作业要求
xk=(float)(jobtable[p].waittime)/jobtable[p].runtime;
jobtable[p].length=size;
jobtable[p].printer=pcount;
jobtable[p].tape=tcount;
jobtable[p].runtime=rtime;
jobtable[p].waittime=wtime;
#include"stdio.h"
#include"string.h"
#define n 10 //假定系统中可容纳的作业数量为n
typedef struct jcb
{ char name[4]; //作业名
head=jobtable[head].next;
else
jobtable[t].next=jobtable[q].next;

批处理系统中的作业调度

批处理系统中的作业调度

批处理系统中作业调度(2008-06-02 10:40:34) 转载标签:学习操作系统代码文化批处理系统中作业调度:#include"stdlib.h"#include"string.h"#include"iostream.h" typedef struct cj {char name[6];int length;int printer;int tape;int runtime;int waittime;struct cj *next;}cj;cj *head;int tape,printer;long memory;void shedule(){float xk,k;cj *p,*q,*s,*t;do{p=head;q=s=NULL;k=0;while(p!=NULL){if(p->length<=memory&&p->tape<=tape&&p->printer<=printer) {xk=(float)(p->waittime)/p->runtime;if(q==NULL||xk>k){k=xk;q=p;t=s;}}s=p;p=p->next;}if(q!=NULL){if(t==NULL)head=head->next;elset->next=q->next;memory=memory-q->length;tape=tape-q->tape;printer=printer-q->printer;cout<<"选中作业的作业名:"<<q->name<<"\n";}}while(q!=NULL);}void main(){int size,tcount,pcount,wtime,rtime;char name[6];cj *p;memory=65536;printer=2;tape=4;head=NULL;cout<<"输入作业相关数据(以作业大小为负数停止输入):\n";cout<<"输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n"; cin>>name>>size>>tcount>>pcount>>wtime>>rtime;while(size!=-1){p=(cj*)malloc(sizeof(cj));strcpy(p->name,name);p->length=size;p->printer=pcount;p->tape=tcount;p->runtime=rtime;p->waittime=wtime;p->next=head;head=p;cout<<"输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n"; cin>>name>>size>>tcount>>pcount>>wtime>>rtime;}shedule();}操作系统批处理系统的作业调度模拟2007-01-16 07:15 P.M.花了一天半的时间才编好~~希望对有这个需要的朋友能用的上!声明一下~我是用win tc编写的,如果用tc的话可能有时会无法运行,原因我还没弄清楚。

批处理系统的作业调度

批处理系统的作业调度

实验批处理系统的作业调度一、实验目的(1)加深对作业概念的理解;(2)深入了解批处理系统如何组织作业、管理作业和调度作业。

二、预备知识(1)批处理系统的概念;批处理系统,又名批处理操作系统。

批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。

这种采用批量处理作业技术的操作系统称为批处理操作系统。

批处理操作系统分为单道批处理系统和多道批处理系统。

批处理操作系统不具有交互性,它是为了提高CPU的利用率而提出的一种操作系统。

1.作用:大家知不知道默认共享这回事?这东西用不着的地方可就不是好东西了.所以就要删掉.但这东西是每次系统重起后都会重新创建的.所以每次都要重新打开cmd重新删掉一下.极为麻烦.但有了批处理文件就不一样了,先把命令输入到批处理文件中,然后加入到启动项中,每次启动就会自动运行,免去了每次输入命令的麻烦.(2).如何创建批处理文件?不要听了批处理文件就感到很神气,其实这东西很简单的.你用过记事本没有?用过?好的.将记事本打开,什么都不用写,然后选择文件,保存.保存类型选择所有文件,文件名则命名为*.bat 这个*代表是文件名,你可以随便的起.保存好之后,看看你保存的地方,会出现一个白色窗口里有个黄色齿轮的图标.这东西就是你创建的批处理文件,双击他就可以运行,但他现在由于里面没有输入任何命令,所以他运行了并不会做任何事情.当我们想往这个*.bat文件中添加东西时,只要右键选择他,然后选择编辑,就可以打开记事本往内输入命令了.3.批处理文件中的命令是什么?批处理文件中的命令暂时先可以理解为dos命令,等稍后深入理解了以后再进行解释.批处理顾名思义就是一大堆东西堆在一起处理.换句话说就是往里面写一条条dos命令,然后按顺序挨个执行,效果跟你在cmd里敲dos命令是一个效果.只不过用批处理写好之后,要运行只要双击下就可以运行了.而不用再一遍一遍的重复的往里面打命令.这就是批处理文件的好处.(2)批处理系统的调度。

处理机调度实验报告

处理机调度实验报告

处理机调度实验报告处理机调度实验报告一、引言处理机调度是计算机操作系统中一个重要的概念,它涉及到如何合理地分配处理机资源以提高系统的运行效率。

本文将针对处理机调度进行实验,探讨不同调度算法对系统性能的影响。

二、实验目的本实验的目的是通过模拟不同的处理机调度算法,比较它们在不同负载下的性能表现,进而分析其优缺点,为实际操作系统的调度算法选择提供参考。

三、实验方法1. 实验环境本实验使用了一台配置较高的计算机作为实验环境,操作系统为Linux,处理器为Intel Core i7,内存为8GB。

2. 实验设置为了模拟不同的负载情况,我们使用了三个不同的测试程序:程序A、程序B和程序C。

程序A是一个计算密集型任务,程序B是一个I/O密集型任务,程序C是一个混合型任务。

3. 实验步骤首先,我们分别运行程序A、程序B和程序C,并记录它们的运行时间。

然后,我们使用不同的调度算法来调度这些任务,并记录它们的运行时间和系统资源利用率。

四、实验结果与分析1. 调度算法1:先来先服务(First-Come, First-Served,FCFS)FCFS算法按照任务到达的先后顺序进行调度,即先到先服务。

实验结果显示,在计算密集型任务下,FCFS算法表现较好,但在I/O密集型任务和混合型任务下,其性能明显下降。

这是因为在FCFS算法中,任务的执行顺序是固定的,无法根据任务的特性进行灵活调度。

2. 调度算法2:最短作业优先(Shortest Job First,SJF)SJF算法根据任务的执行时间进行调度,即执行时间最短的任务先执行。

实验结果显示,在计算密集型任务和混合型任务下,SJF算法表现较好,但在I/O密集型任务下,其性能较差。

这是因为在I/O密集型任务中,任务的执行时间不仅与计算量有关,还与I/O操作的耗时有关,因此SJF算法无法有效地进行调度。

3. 调度算法3:时间片轮转(Round Robin,RR)RR算法将处理机的运行时间划分为若干个时间片,每个任务在一个时间片内执行一定的时间,然后切换到下一个任务。

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

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

操作系统实验报告作业调度操作系统实验报告:作业调度引言作业调度是操作系统中的重要部分,它负责管理和调度系统中的各种作业,以最大化系统资源的利用率和提高作业的执行效率。

在本次实验中,我们将探讨作业调度的基本原理和实现方法,并通过实验验证其效果。

实验目的本次实验的主要目的是通过实际操作,了解作业调度的基本原理和实现方法,掌握作业调度的相关算法,并通过实验验证其有效性。

实验内容1. 实现作业调度的基本算法在本次实验中,我们将实现作业调度的基本算法,包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。

通过编写代码,模拟这些算法的执行过程,并观察它们的效果。

2. 实验验证我们将设计一些测试用例,通过模拟作业的执行过程,分别使用不同的作业调度算法,并比较它们的执行效果。

通过实验验证,我们将得出不同算法的优劣势,并分析其适用场景。

实验结果经过实验验证,我们得出以下结论:1. 先来先服务(FCFS)算法适用于作业执行时间相对均匀的情况,但可能会导致平均等待时间较长。

2. 最短作业优先(SJF)算法能够最大程度地减少平均等待时间,但可能会出现作业饥饿现象。

3. 优先级调度(Priority Scheduling)算法能够根据作业的优先级进行调度,适用于有明确优先级需求的情况。

4. 多级反馈队列调度(Multilevel Feedback Queue Scheduling)算法能够根据作业的执行情况动态调整优先级,适用于各种类型的作业。

结论作业调度是操作系统中的重要组成部分,不同的作业调度算法适用于不同的场景。

通过本次实验,我们深入了解了作业调度的基本原理和实现方法,掌握了不同算法的优劣势,并通过实验验证了它们的有效性。

这将对我们进一步深入学习操作系统和提高系统性能有着重要的意义。

操作系统原理实验教学大纲(本科)-2013

操作系统原理实验教学大纲(本科)-2013

《操作系统原理》实验教学大纲一、实验教学内容与基本要求实验一 批处理系统的作业调度1 目的要求1.加深对作业概念的理解;2.深入了解批处理系统如何组织作业、管理作业和调度作业。

2 实验内容编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。

实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。

3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验二 进程管理1 目的要求1.加深对进程概念的理解,明确进程和程序的区别。

2.深入了解系统如何组织进程、创建进程。

3.进一步认识如何实现处理器调度。

2 实验内容编写程序完成单处理机系统中的进程调度,要求采用时间片轮转调度算法。

实验具体包括:首先确定进程控制块的内容,进程控制块的组成方式;然后完成进程创建原语和进程调度原语;最后编写主函数对所做工作进行测试。

3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验三 动态分区存储管理方式的主存分配回收1 目的要求深入了解动态分区存储管理方式主存分配回收的实现。

2 实验内容编写程序完成动态分区存储管理方式的主存分配回收的实现。

实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。

3 所需实验设施设备PC、windows操作系统4 教学形式及过程演示、学生独立完成实验四 页式虚拟存储管理中地址转换和缺页中断1 目的要求1.深入了解页式存储管理如何实现地址转换;2.进一步认识页式虚拟存储管理中如何处理缺页中断。

2 实验内容编写程序完成页式存储管理中地址转换过程和模拟缺页中断的处理。

实验具体包括:首先对给定的地址进行地址转换工作,若发生缺页则先进行缺页中断处理,然后再进行地址转换;最后编写主函数对所做工作进行测试。

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

实验一批处理系统的作业调度
一、实验目的
1.加深对作业概念的理解。

2.深入了解批处理系统如何组织作业、管理作业和调度作业。

二、实验预备知识
1.作业的概念。

2.作业的创建。

3.作业的调度。

三、实验内容
编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法。

实验具体包括:首先确定作业控制块的内容,作业控制块的组成方式;然后完成作业调度;最后编写主函数对所做工作进行测试。

四、提示与讲解
操作系统根据允许并行工作的道数和一定的算法从系统中选取若干作业把它们装入主存储器,使它们有机会获得处理器运行,这项工作被称为“作业调度”。

实现这部分功能的程序就是“作业调度程序”。

作业调度的实现主要有两个问题,一个是如何将系统中的作业组织起来;另一个是如何进行作业调度。

为了将系统中的作业组织起来,需要为每个进入系统的作业建立档案以记录和作业相关的信息,例如作业名、作业所需资源、作业执行时间、作业进入系统的时间、作业信息在存储器中的位置、指向下一个作业控制块的指针等信息。

这个记录作业相关信息的数据块称为作业控制块(JCB),并将系统中等待作业调度的作业控制块组织成一个队列,这个队列称为后备队列。

一个作业全部信息进入系统后,就为其建立作业控制块,并挂入后备队列。

当进行作业调度时,从后备队列中查找选择作业。

由于实验中没有实际作业,作业控制块中的信息内容只使用了实验中需要的数据。

作业控制块中首先应该包括作业名;其次是作业所需资源,根据需要,实验中只包括需要主存的大小(采用可移动的动态分区方式管理主存,作业大小就是需要主存的大小)、需要打印机的数量和需要磁带机的数量;采用响应比作业调度算法,为了计算响应比,还需要有作业的估计执行时间、作业在系统中的等待时间;另外,指向下一个作业控制块的指针必不可少。

实验中,作业控制块及队列的数据结构定义如下:
typedef struct jcb
{ char name[4]; //作业名
int length; //作业长度,所需主存大小
int printer; //作业执行所需打印机的数量
int tape; //作业执行所需磁带机的数量
int runtime; //作业估计执行时间
int waittime; //作业在系统中的等待时间
int next; //指向下一个作业控制块的指针
} JCB //作业控制块类型定义
存放作业控制块的区域:
#define n 10 //假定系统中可容纳的作业数量为n
JCB jobtable[10]; //作业表
int jobcount; //系统内现有作业数量
将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,如图1所示。

作业队列头指针定义:
int *head;
图1 采用响应比高者优先算法的作业调度程序流程图
确定作业组织方式之后,就要开始考虑如何进行作业调度。

尽管不同的计算机系统可以采用不同的调度原则和调度算法,但是都必须遵循一个必要条件,即系统现有的尚未分配的资源可以满足被选作业的资源要求。

就是说,所有的作业调度都是按照一定的算法,从满足必要条件的作业中选择一部分作业装入主存储器。

实验中,主存采用可移动的动态分区管理方法,即只要主存空闲区总和比作业大就可以满足作业对主存的需求;对打印机和磁带机这两种独占型设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。

常用的作业调度算法有先来先服务算法、计算时间短的作业优先算法、响应比高者优先算法、优先数调度算法和均衡调度算法。

实验中采用响应比高者优先算法,响应比的定义为:响应比=作业的等待时间/作业估计执行时间
采用响应比高者优先调度算法,进行调度时必须计算出系统中的所有满足必要条件作业的响应比;从中选择响应比最高的一个作业装入主存储器分配资源,由于是实验,所以就用将作业的作业控制块出队,并输出作业的作业名代替装入主存储器,同时修改系统的资源数量;用同样方法选择第二个、第三个……直到不再有满足必要条件的作业。

采用响应比高者优先算法的作业调度程序流程图如图1所示。

模拟程序中,首先要假设系统的资源情况,假设系统资源只有主存(memory)64MB(以KB为单位分配)、磁带机(tape)4台和打印机(printer)2台;然后,手工输入某个时刻系统中的各个作业情况;最后进行作业调度,并将结果输出。

五、课外题
将上述实验中的作业调度算法改为短作业优先调度算法重新完成上述工作。

六、参考程序
#include "string.h"
#define n 10 //假定系统中可容纳的作业数量为n
typedef struct jcb
{ char name[4]; //作业名
int length; //作业长度,所需主存大小
int printer; //作业执行所需打印机的数量
int tape; //作业执行所需磁带机的数量
int runtime; //作业估计执行时间
int waittime; //作业在系统中的等待时间
int next; //指向下一个作业控制块的指针
}JCB; //作业控制块类型定义
int head; //作业队列头指针定义
int tape,printer;
long memory;
JCB jobtable[n]; //作业表
int jobcount=0; //系统内现有作业数量
shedule( )
//作业调度函数
{float xk,k;
int p,q,s,t;
do
{ p=head;
q=s=-1;
k=0;
while(p!=-1)
}
{if(jobtable[p].length<=memory&&jobtable[p].tape<=tape&&jobtable[p].print er<=printer)
{ //系统可用资源是否满足作业需求
xk=(float)(jobtable[p].waittime)/jobtable[p].runtime;
if(q==0||xk>k)
//满足条件的第一个作业或者作业q的响应比小于作业p的响应比
{ k=xk; //记录响应比
q=p;
t=s;
}//if
}//if
s=p;
p=jobtable[p].next; //指针p后移
}//while
if(q!=-1)
{ if(t==-1) //是作业队列的第一个
head=jobtable[head].next;
else
jobtable[t].next=jobtable[q].next;
//为作业q分配资源:分配主存空间;分配磁带机;分配打印机
memory=memory-jobtable[q].length;
tape=tape-jobtable[q].tape;
printer=printer-jobtable[q].printer;
printf("选中作业的作业名:%s\n",jobtable[q].name);
}
}while(q!=-1);
} //作业调度函数结束
main()
{char name[4];
int size,tcount,pcount,wtime,rtime;
int p;
//系统数据初始化
memory=65536;
tape=4;
printer=2;
head=-1;
printf("输入作业相关数据(以作业大小为负数停止输入):\n");
//输入数据,建立作业队列
printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n"); scanf("%s%d%d %d %d %d",name,&size,&tcount,&pcount,&wtime,&rtime);
while(size!=-1)
{//创建JCB
if(jobcount<n)p=jobcount;
else { printf("无法再创建作业\n");
break;
}
jobcount++;
//填写该作业相关内容
strcpy(jobtable[p].name,name);
jobtable[p].length=size;
jobtable[p].printer=pcount;
jobtable[p].tape=tcount;
jobtable[p].runtime=rtime;
jobtable[p].waittime=wtime;
//挂入作业队列队首
jobtable[p].next=head;
head=p;
// 输入一个作业数据
printf("输入作业名、作业大小、磁带机数、打印机数、等待时间、估计执行时间\n"); scanf("%s%d%d%d%d%d",name,&size,&tcount,&pcount,&wtime,&rtime);
}//while
shedule( ); //进行作业调度
}//main( )函数结束。

相关文档
最新文档