进程调度算法

进程调度算法
进程调度算法

进程调度

/****************************************************************************** ******************************************************

* Source File Name : LGY_CPU_Scheduler *

* Project Name: LGY_CPU_Scheduler *

* Engineer: 赖国勇*

* Date Generated: 2007-11-19 *

* Last Revision Date: 2011-04-12 *

* Brief Description:

*

* [实验内容] *

* ①、实验目的*

* a、进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,*

* 并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,*

* 并体会和了解各种调度算法的具体实施办法。*

* b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。*

* ②、实验内容*

* a、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,*

* 时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现其中之一个以上)。*

* b、编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。*

* c、由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。*

* ③、实验要求*

* a、使用模块化设计思想来设计;*

* b、给出主函数和各个算法函数的流程图。

* c、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)*

* d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。

*

* ④、运行结果*

* a、给出进程的调度模拟操作排序结果。*

* ⑤、提示*

* a、每个进程可有三个状态,并假设初始状态为就绪状态。*

* b、为了便于处理,程序中的进程运行时间以纳秒为单位计算。*

* c、各进程的优先级或轮转时间数以及进程需运行的纳秒数的初始值均由用户给定。*

* d、在优先级算法中,采用静态优先级。在时间片轮转算法中,采用可变时间片,由用户给定。*

* e、对于遇到优先级一致的情况,采用FIFO策略解决。*

*

*

* 一、在WINDOWS中双击DEBUG目录中的EXE文件直接运行,可能会没有显示结果窗口就关闭了,这不是程序错误,解决方法是:*

* 1、“开始->程序->附件-命令提示符”,打开DOS命令窗口。*

* 2、改变当前目录至EXE文件所在目录;(或者将EXE文件和测试用的文本文件一并复制到当前目录)。*

* 3、输入EXE文件的完整名称(含后缀名)运行即可。(为方便输入,可以重命名EXE文件。)*

* 二、本程序包括:FIFO,优先级调度算法(静态优先级),时间片轮转调度算法,短进程优先调度算法。*

* VC++6.0调试通过项目类型:Win32 Console Application *

* 输入:进程流文件(文本文件),其中存储的是一系列要执行的进程,每个进程包括四个数据项:*

* 进程名(长度不超过20个的字符串) 进程状态(1就绪2等待3运行) 所需时间优先级(0级最高) *

* 输出: 进程执行流等待时间平均等待时间*

******************************************************************************* ******************************************************/

#include

#include

#include

const int MAXPCB=100; //定义最大进程数

//定义进程控制块PCB结构体类型

typedef struct PCB_Node{

char sName[20]; //进程名

int iStatus; //进程状态(1就绪2等待3运行) 当前程序中暂时全部默认为就绪处理

int iRunTime; //进程运行时间(纳秒)

int iPriority; //进程优先级(0级最高)

int iFinished; //进程是否执行完成标志(1:已完成;0:末完成)

int iWaitTime; //进程等待时间(纳秒)

}PCB;

PCB pcbs[MAXPCB]; //PCB数组队列

int iPCBNum; //实际进程数

char sFileName[20]; //进程流文件名

void InitPCB(); //PCB初始化函数

int ReadPCBFile(); //读进程流文件数据,存入PCB数组队列pcbs,并输出

void ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

void FIFO(); //先进先出调度算法

void Priority(); //优先级调度算法

void RR(); //时间片轮转调度算法

void SPF(); //短进程优先调度算法

void Hint(); //显示实验提示信息函数

void Version(); //显示版权信息函数

void InitPCB() //PCB初始化函数

{

int i;

for(i=0;i

{

strcpy(pcbs[i].sName,"");

pcbs[i].iStatus=-1;

pcbs[i].iRunTime=-1;

pcbs[i].iPriority=-1;

pcbs[i].iFinished=0;

pcbs[i].iWaitTime=0;

} //for(i=0;i

iPCBNum=0;

} //void InitPCB()

int ReadPCBFile() //读进程流文件数据,存入PCB数组队列pcbs,并输出

{

FILE *fp;

int i;

char cHead;

cout<<" 请输入进程流(文本)文件名(注意:包括后缀名): ";

cin>>sFileName;

if((fp=fopen(sFileName,"r"))==NULL)

{

cout<<" 错误:进程流文件"<

return 0;

}

else //if((fp=fopen(sFileName,"r"))==NULL)

{

cHead=fgetc(fp);

while(cHead==' '||cHead==10||cHead==9) //过滤空格、换行和TAB字符

{

cHead=fgetc(fp);

}

if(cHead==EOF)

{

printf(" 错误:进程流文件:%s 为空!!\n",sFileName );

return 0;

}

else //if(cHead==EOF)

{

fseek( fp, -1, SEEK_CUR);

while(!feof(fp))

{

fscanf(fp,"%s %d %d %d",pcbs[iPCBNum].sName,&pcbs[iPCBNum].iStatus,&pcbs[iPCBN

um].iRunTime,&pcbs[iPCBNum ].iPriority);

iPCBNum++;

} //while(!feof(fp))

//输出所读入的进程数据

cout<

cout<<" 进程名进程状态运行时间优先级"<

for(i=0;i

{

cout<<" "<

"<

}

cout<<" 进程总数:"<

return 1;

} //if(cHead==EOF)

} //if((fp=fopen(sFileName,"r"))==NULL)

}// int ReadPCBFile()

void ReSetPCB() //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

{

int i;

//输出所读入的进程数据

cout<

cout<

cout<<" 进程名进程状态运行时间优先级"<

for(i=0;i

{

pcbs[i].iFinished=0;

pcbs[i].iWaitTime=0;

cout<<" "<

"<

}

cout<<" 进程总数:"<

} //void ReSetPCB()

void FIFO() //先进先出调度算法

{

int i,j;

int iSum; //总等待时间

//输出先进先出调度算法执行流

cout<

cout<<" 先进先出调度算法执行流:"<

cout<<" 序号进程名运行时间等待时间"<

iSum=0;

for(i=0;i

{

cout<<" "<

"<

iSum+=pcbs[i].iWaitTime; //累加总等待时间

for(j=i+1;j

{

pcbs[j].iWaitTime+=pcbs[i].iRunTime;

}

}

cout<<" 总调度次数:"<

cout<<" 总等待时间:"<

printf(" 平均等待时间%.2f\n",(float)iSum / (float)iPCBNum);

cout<

} //void FIFO()

void Priority() //优先级调度算法

{

int i,j;

int iCurMin; //当前最低优先级PCB在数组pcbs中的下标

int iPassedTime=0; //已经过的时间

int iSum; //总等待时间

int iQueue[MAXPCB]; //用于存放排序后进程数组下标的数组队列

int iCurPriority=1000; //当前最低优先级

for(i=0;i

{

iCurPriority=1000;

for(j=0;j

{

if((pcbs[j].iFinished==0)&&(pcbs[j].iPriority

{

iCurMin=j;

iCurPriority=pcbs[j].iPriority;

}

} //for(j=0;j

iQueue[i]=iCurMin;

pcbs[iCurMin].iFinished=1;

pcbs[iCurMin].iWaitTime+=iPassedTime;

iPassedTime+=pcbs[iCurMin].iRunTime;

} //for(i=0;i

//输出优先级调度执行流

cout<

cout<<" 优先级调度执行流:"<

cout<<" 序号进程名优先级运行时间等待时间"<

iSum=0;

for(i=0;i

{

cout<<" "<

"<

"<

iSum+=pcbs[iQueue[i]].iWaitTime; //累加总等待时间}

cout<<" 总调度次数:"<

cout<<" 总等待时间:"<

printf(" 平均等待时间%.2f\n",(float)iSum / (float)iPCBNum);

cout<

} //void Priority()

void RR() //时间片轮转调度算法

{

int i;

int iNotEnded=1; //标志:不是所有进程都已经获得足够时间片运行完成

int iNum; //到目前为止末执行完的进程数

int iRound=0; //轮转周期数

int iSum=0; //总时间片数

float fBlockTime=10; //时间片的长度(纳秒)

cout<

cin>>fBlockTime;

cout<

cout<<" 时间片轮转调度执行流(时间片的长度为:"<

while(iNotEnded==1)

{

iNotEnded=0;

iNum=0;

for(i=0;i

{

if(pcbs[i].iFinished==0)

{

iNum++;

} //if(pcbs[i].iFinished==0)

} //for(i=0;i

if(iNum>0)

{

iRound++; //累加轮转周期数

cout<

for(i=0;i

{

if(pcbs[i].iFinished==0)

{

iNotEnded=1;

cout<

iSum++; //累加总时间片数

if(pcbs[i].iRunTime<=fBlockTime*(iRound))

//i进程在本轮获得一个时间片后能够运行完成

{

pcbs[i].iFinished=1;

} //if(pcbs[i].iRunTime<=fBlockTime*(iRound+1))

}//if(pcbs[i].iFinished==0)

} //for(i=0;i

} //if(iNum>0)

} //while(iNotEnded==1)

cout<

cout<

}//void RR()

void SPF() //短进程优先调度算法

{

int i,j;

int iCurMin; //当前最短运行时间PCB在数组pcbs中的下标

int iPassedTime=0; //已经过的时间

int iSum; //总等待时间

int iQueue[MAXPCB]; //用于存放排序后进程数组下标的数组队列

int iCurRunTime; //当前最短进程运行时间

for(i=0;i

{

iCurRunTime=1000000;

for(j=0;j

{

if((pcbs[j].iFinished==0)&&(pcbs[j].iRunTime

{

iCurMin=j;

iCurRunTime=pcbs[j].iRunTime;

}

} //for(j=0;j

iQueue[i]=iCurMin;

pcbs[iCurMin].iFinished=1;

pcbs[iCurMin].iWaitTime+=iPassedTime;

iPassedTime+=pcbs[iCurMin].iRunTime;

} //for(i=0;i

//输出短进程优先调度执行流

cout<

cout<<" 短进程优先调度执行流:"<

cout<<" 序号进程名运行时间等待时间"<

iSum=0;

for(i=0;i

{

cout<<" "<

"<

iSum+=pcbs[iQueue[i]].iWaitTime; //累加总等待时间

}

cout<<" 总调度次数:"<

cout<<" 总等待时间:"<

printf(" 平均等待时间%.2f\n",(float)iSum / (float)iPCBNum);

cout<

} //void SPF ()

void Hint() //显示实验提示信息函数

{

cout<

cout<<"

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<

cout<<" [实验内容] "<

cout<<" ①、实验目的"<

cout<<" a、进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,"<

cout<<" 并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、"<

cout<<" 进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。"<

cout<<" b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。

"<

cout<<" ②、实验内容"<

cout<<" a、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,"<

cout<<" 时间片轮转调度,短进程优先调度算法,多级反馈队列调度(实现其中之一个以上)。"<

cout<<" b、编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。"<

cout<<" c、由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。"<

cout<<" ③、实验要求"<

cout<<" a、使用模块化设计思想来设计;"<

cout<<" b、给出主函数和各个算法函数的流程图。"<

cout<<" c、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)。"<

cout<<" d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。"<

cout<<" ④、运行结果"<

cout<<" a、给出进程的调度模拟操作排序结果。"<

cout<<" ⑤、提示"<

cout<<" a、每个进程可有三个状态,并假设初始状态为就绪状态。"<

cout<<" b、为了便于处理,程序中的进程运行时间以纳秒为单位计算。"<

cout<<" c、各进程的优先级或轮转时间数以及进程需运行的纳秒数的初始值均由用户给定。"<

cout<<" d、在优先级算法中,采用静态优先级。在时间片轮转算法中,采用可变时间片,由用户给定。"<

cout<<" e、对于遇到优先级一致的情况,采用FIFO策略解决。"<

cout<<" 一、在WINDOWS中双击DEBUG目录中的EXE文件直接运行,可能会没有显示结果窗口就关闭了,这不是程序错误,解决方法是:"<

cout<<" 1、“开始->程序->附件-命令提示符”,打开DOS命令窗口。"<

cout<<" 2、改变当前目录至EXE文件所在目录;(或者将EXE文件和测试用的文本文件一并复制到当前目录)。"<

cout<<" 3、输入EXE文件的完整名称(含后缀名)运行即可。(为方便输入,可以重命名EXE文件。)"<

cout<<" 二、本程序包括:FIFO,优先级调度算法(静态优先级),时间片轮转调度算法,短进程优先调度算法。VC++6.0调试通过项目类型:Win32 Console Application。"<

cout<<" 输入:进程流文件(文本文件),其中存储的是一系列要执行的进程,每个进程包括四个数据项:"<

cout<<" 进程名(长度不超过20个的字符串) 进程状态(1就绪2等待3运行) 所需时间优先级(0级最高) "<

cout<<" 输出: 进程执行流等待时间平均等待时间"<

cout<<"

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<

cout<

} //void Hint()

void Version() //显示版权信息函数

{

cout<

cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<

cout<<" ┃进程调度算法模拟系统┃"<

cout<<" ┠───────────────────────┨"<

cout<<" ┃(c)All Right Reserved ┃"<

cout<<" ┃LGY 赖国勇┃"<

cout<<" ┃Version 2011 build 2.1 ┃"<

cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<

cout<

} //void Version()

void main() //主函数

{

int iInput; //用户输入的整数以选择算法

bool bGoOn; //是否继续进程调度算法模拟的标志

char sGoOn[1]; //用户输入是否继续进程调度算法模拟的字母:y、Y、N、n

Hint(); //显示实验提示信息函数

Version(); //显示版权信息函数

InitPCB(); //PCB初始化函数

bGoOn= true;

strcpy(sGoOn," ");

if(ReadPCBFile()==1) //标志读进程流文件数据函数执行是否正确

{

while (bGoOn)

{

cout<

cout<<" 1 先进先出调度算法"<

cout<<" 3 时间片轮转调度算法"<

cin>>iInput; //从标准输入获取用户输入的整数以选择算法

switch(iInput)

{

case 1:

ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

FIFO(); //先进先出调度算法

break;

case 2:

ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

Priority(); //优先级调度算法

break;

case 3:

ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

RR(); //时间片轮转调度算法

break;

case 4:

ReSetPCB(); //重置PCB完成标志、等待时间,以供另一个调度算法使用,并输出所读入的进程数据

SPF(); //短进程优先调度算法

break;

default:

printf("\n 输入的算法编号错误!!\n");

return;

} //switch(iInput)

bGoOn= false;

strcpy(sGoOn," ");

cout<

cin>>sGoOn;

bGoOn=(sGoOn[0]=='y'||sGoOn[0]=='Y');

}//while bGoOn

} //if(ReadPCBFile()==1)

}//void main()

建几个txt文件在这个包下像这样的内容

PA 2 58 3

PB 1 543 1

PC 1 868 2

PD 2 879 3

PE 3 366 2

PF 1 50 3

PG 2 87 4

PH 3 12 3

PI 1 50 3

PJ 1 76 2

操作系统之调度算法和死锁中的银行家算法习题答案

操作系统之调度算法和死锁中的银行家算法习 题答案 集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-

1. 有三个批处理作业,第一个作业 10:00 到达,需要执行 2 小时;第二个作业在10:10到达,需要执行 1 小时;第三个作业在 10:25 到达,需要执行 25 分钟。分别采用先来先服 务,短作业优先和最高响应比优先三种调度算法,各自的平均周转时间是多少?解: 先来先服务: (结束时间=上一个作业的结束时间+执行时间 周转时间=结束时间-到达时间=等待时间+执行时间) 按到达先后,执行顺序:1->2->3 短作业优先: 1)初始只有作业1,所以先执行作业1,结束时间是12:00,此时有作业2和3; 2)作业3需要时间短,所以先执行; 3)最后执行作业2 最高响应比优先:

高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。 1)10:00只有作业1到达,所以先执行作业1; 2)12:00时有作业2和3, 作业2:等待时间=12:00-10:10=110m;响应比=1+110/60=2.8; 作业3:等待时间=12:00-10:25=95m,响应比=1+95/25=4.8; 所以先执行作业3 3)执行作业2 2. 在一单道批处理系统中,一组作业的提交时刻和运行时间如下表所示。试计算一下三种 作业调度算法的平均周转时间 T 和平均带权周转时间 W。 ( 1)先来先服务;( 2)短作业优先( 3)高响应比优先 解: 先来先服务: 作业顺序:1,2,3,4 短作业优先: 作业顺序:

随机进程调度算法

《操作系统原理》实验报告 实验名称:Linux随机进程调度算法实现 班级: 学号: 姓名: 日期: 2012/12/31

一、实验名称 Linux随机进程调度算法实现 二、所属课程名称 《操作系统原理》 三、实验原理 linux 0.11内核目录linux/kernel中的sched.c函数是内核中进程调度管理的程序,其中schedule()函数负责选择系统中下一个要运行的进程。 schedule()函数首先对所有任务(进程)进行检测,唤醒任何一个已经得到信号的进程。具体方法是任务数组中的每个进程,检查其报警定时值alarm。如果进程的alarm时间已经过期(alarm

NR_TASKS:系统能容纳的最大进程数(64个); task[]:任务(进程)数组; 更改代码如下:(linux 0.11内核目录下linux/kernel/sched.c 源文件的scheduling()函数while(1)循环)while (1) { //定义c用来判断系统中是否可运行的任务(进程)存在; c=-1; //c初值设为-1,默认不存在可运行进程; next = 0;//next记录下一个即将运行的进程; i=jiffies % NR_TASKS+1; //i的值是随机产生的; p=&task[i];//p指向在task表中下标为i的进程; while (--i) { //遍历task[]; if(!*--p)continue; //如果task[i]不包含进程,跳过; //如果task[i]包含进程且该进程处于就绪状态,记录 //该任务(进程)序号,跳出无限循环while(1),转向 //switch_to()函数执行该任务(进程); if ((*p)->state == TASK_RUNNING) { next = i; c=i; break; } } if (c) break;//如果没有任何任务(进程)要执行,则跳出, //转向switch_to(),执行0号进程(idle)。 }

进程调度算法实验报告

进程调度算法实验报告 篇一:操作系统进程调度算法模拟实验报告 进程调度算法模拟 专业:XXXXX 学号:XXXXX 姓名:XXX 实验日期:20XX年XX月XX日 一、实验目的 通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。 二、实验要求 编写程序实现对5个进程的调度模拟,要求至少采用两种不同的调度算 法分别进行模拟调度。 三、实验方法内容 1. 算法设计思路 将每个进程抽象成一个控制块PCB, PCB用一个结构体描述。 构建一个进程调度类。将进程调度的各种算法分装在一个类中。类中存 在三个容器,一个保存正在或未进入就绪队列的进程,一个保存就绪的进程,另一个保存已完成的进程。还有一个PCB实例。主要保存正在运行的进程。类中其他方法都是围绕这三个容器可以这个运行中的PCB展开。

主要用到的技术是STL中的vector以维护和保存进程容器、就绪容器、 完成容器。 当程序启动时,用户可以选择不同的调度算法。然后用户从控制台输入 各个进程的信息,这些信息保存到进程容器中。进程信息输入完毕后,就开始了进程调度,每调度一次判断就绪队列是否为空,若为空则系统时间加一个时间片。判断进程容器中是否有新的进程可以加入就绪队列。 2. 算法流程图主程序的框架: ();//先来先服务 ();//最短进程优先调度//简单时间片轮转//最高优先数优先//输入进程信息 ();.m_WaitQueue.empty()||.m_ProcessQueue.empt() (); (); 进程调度过程: ; 3. 算法中用到的数据结构 struct fcfs{//先来先服务算法从这里开始char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float

操作系统实验报告(进程调度算法)

操作系统实验报告(进程调度算法)

实验1 进程调度算法 一、实验内容 按优先数调度算法实现处理器调度。 二、实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。 三、实验原理 设计一个按优先数调度算法实现处理器调度的程序。 (1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为: 进程名 指针 要求运行时 间 优先数

状态 其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。 指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。 要求运行时间——假设进程需要运行的单位时间数。 优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。 状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。 (2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。 (3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例: 队首标志 K2

1P1 K 2 P2 K 3 P3 K 4 P4 K 5 P5 0 K4K5K3K1 2 3 1 2 4 1 5 3 4 2 R R R R R PC B1 PC B2 PC B3 PC B4 PC B5 (4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行: 优先数-1 要求运行时间-1 来模拟进程的一次运行。 提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。

进程调度算法实验报告

作业调度 一、实验名称 作业调度算法 二、实验目标 在单道环境下编写作业调度的模拟程序,以加深对作业调度的理解。单道环境的特点使被调度的作业占有所有的资源。实现的算法有先来先服务,最短作业优先,最高响应比三种作业调度算法。 三、实验环境要求: 1.PC机。 2.Windows; 3.CodeBlocks 四、实验基本原理 1.本实验设计一个可指定作业个数的作业调度系统。可以输出先来先服务,最短作业优先,最高响应比三种作业调度算法的结果。 2.先来先服务就是按照各个作业进入系统的自然次序进行调度。最短作业优先就是优先调度并且处理短作业。最高响应比优先就是根据在程序运行过程中的最高响应比对应的作业先进行调度处理。 3.在设计程序过程中,将time相关的内容封装到类中,重载了加减乘除和输入输出以及比较运算符,方便12:00这种形式的数据的加减乘除运算和比较运算, 五、数据结构设计 1.时间类

class time { public: time(int x = 0, int y = 0) { time::hour = x; time::minute = y; } time& operator = (const time &t1) { this->hour=t1.hour; this->minute=t1.minute; return *this; } time operator + (time t2) { intminutes,hours; minutes = (minute + t2.minute) % 60; hours=hour+t2.hour+ (minute + t2.minute) /60; return time(hours,minutes); } time operator -(time t2) { intminutes,hours; minutes =minute - t2.minute; if (minute<0) { minutes += 60; hour--; }

进程调度算法模拟 (操作系统课程设计报告)

福建农林大学计算机与信息学院 课程设计报告 课程名称:操作系统 实习题目:进程调度算法模拟 姓名: 系:计算机科学与技术系 专业:计算机科学与技术 年级:2012 学号: 指导教师: 职称:副教授 年月日

福建农林大学计算机与信息学院计算机类 课程设计结果评定

目录 1.本选题课程设计的目的 (4) 2.本选题课程设计的要求 (4) 3.本选题课程设计报告内容 (4) 3.1前言 (4) 3.2进程调度算法模拟的环境 (4) 3.3系统技术分析 (4) 3.4系统流程图及各模块 (5) 3.5程序调试情况 (8) 4.总结 (11) 参考文献 (11) 程序代码 (12)

1.设计目的 课程设计将课本上的理论知识和实际有机的结合起来,锻炼学生的分析系统,解决实际问题的能力。提高学生分析系统、实践编程的能力。 2.设计要求 利用学到的操作系统和编程知识,完成具有一定难度的系统分析研究或系统设计题目。其中:专题系统理论研究应包括研究目的、目标,论点和论据以及证明推导等;分析、设计系统应包括编写、调试程序以及最后写出设计报告或系统说明文档文件,系统说明文档包括系统界面、变量说明、系统功能说明、编程算法或思路、流程图和完整程序。具体要求如下: 1、对系统进行功能模块分析、控制模块分析正确; 2、系统设计要实用; 3、编程简练,可用,功能全面; 4、说明书、流程图要清楚。 3.设计方案 3.1前言 本程序包括三种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。 3.2本选题设计的环境 WindowsXP下的Microsoft Visual C++ 6.0 3.3系统技术分析 (1)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。 进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。

计算机操作系统课后习题答案第三章(第四版)

第三章处理机调度与死锁 1,高级调度与低级调度的主要任务是什么?为什么要引入中级调度? 【解】(1)高级调度主要任务是用于决定把外存上处于后备队列中的那些作业调入内存,并为它们创建进程,分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。(2)低级调度主要任务是决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。(3)引入中级调度的主要目的是为了提高内存的利用率和系统吞吐量。为此,应使那些暂时不能运行的进程不再占用宝贵的内存空间,而将它们调至外存上去等待,称此时的进程状态为就绪驻外存状态或挂起状态。当这些进程重又具备运行条件,且内存又稍有空闲时,由中级调度决定,将外存上的那些重又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上,等待进程调度。 3、何谓作业、作业步和作业流? 【解】作业包含通常的程序和数据,还配有作业说明书。系统根据该说明书对程序的运行进行控制。批处理系统中是以作业为基本单位从外存调入内存。作业步是指每个作业运行期间都必须经过若干个相对独立相互关联的顺序加工的步骤。 作业流是指若干个作业进入系统后依次存放在外存上形成的输入作业流;在操作系统的控制下,逐个作业进程处理,于是形成了处理作业流。 4、在什么情冴下需要使用作业控制块JCB?其中包含了哪些内容? 【解】每当作业进入系统时,系统便为每个作业建立一个作业控制块JCB,根据作业类型将它插入到相应的后备队列中。 JCB 包含的内容通常有:1) 作业标识2)用户名称3)用户账户4)作业类型(CPU 繁忙型、I/O芳名型、批量型、终端型)5)作业状态6)调度信息(优先级、作业已运行)7)资源要求8)进入系统时间9) 开始处理时间10) 作业完成时间11) 作业退出时间12) 资源使用情况等 5.在作业调度中应如何确定接纳多少个作业和接纳哪些作业? 【解】作业调度每次接纳进入内存的作业数,取决于多道程序度。应将哪些作业从外存调入内存,取决于采用的调度算法。最简单的是先来服务调度算法,较常用的是短作业优先调度算法和基于作业优先级的调度算法。 7.试说明低级调度的主要功能。 【解】(1)保存处理机的现场信息(2)按某种算法选取进程(3)把处理机分配给进程。 8、在抢占调度方式中,抢占的原则是什么? 【解】剥夺原则有:(1)时间片原则各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。这种原则适用于分时系统、大多数实时系统,以及要求较高的批处理系统。(2)优先权原则通常是对一些重要的和紧急的作业赋予较高的优先权。当这种作业到达时,如果其优先权比正在执行进程的优先权高,便停止正在执行的进程,将处理机分配给优先权高的进程,使之执行。(3)短作业(进程)优先原则当新到达的作业(进程)比正在执行的作业(进程)明显地短时,将剥夺长作业(进程)的执行,将处理机分配给短作业(进程),使之优先执行。 9、选择调度方式和调度算法时,应遵循的准则是什么? 【解】应遵循的准则有(1)面向用户的准则:周转时间短,响应时间快,截止时间的保证,优先权准则。(2)面向系统的准则:系统吞吐量高,处理机利用率好,各类资源的平衡利用。 10、在批处理系统、分时系统和实时系统中,各采用哪几种进程(作业)调度算法? 【解】 批处理系统:FCFS算法、最小优先数优先算法、抢占式最小优先数优先算法 2 分时系统:可剥夺调度、轮转调度 实时系统:时间片轮转调度算法、非抢占优先权调度算法、基于时钟中断抢占的优先权调度算法、立即抢占的优先权调度。 11、何谓静态和动态优先权?确定静态优先权的依据是什么? 【解】静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变。动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。确定静态优先权的依据是:(1)进程类型,通常系统进程的优先权高于一般用户进程的优先权。(2)进程对资源的需要。(3)用户要求,用户进程的紧迫程度及用户所付费用的多少来确定优先权的。 12、试比较FCFS和SPF两种进程调度算法。 【解】FCFS算法按照作业提交或进程变为就绪状态的先后次序,分派CPU。当前作业或进程占有CPU,直到执行完或阻塞,才让出CPU。在作业或进程唤醒后,并不立即恢复执行,通常等到当前作业或进程让出CPU。FCFS比较有利于长作业,而不利于短作业;有利于CPU繁忙的作业,而不利于I/O繁忙的作业。SPF有利于短进程调度,是从就绪队列中选出一估计运行时间最短的进

进程调度算法实验报告

操作系统实验报告(二) 实验题目:进程调度算法 实验环境:C++ 实验目的:编程模拟实现几种常见的进程调度算法,通过对几组进程分别使用不同的调度算法,计算进程的平均周转时间和平均带权周转时间,比较 各种算法的性能优劣。 实验内容:编程实现如下算法: 1.先来先服务算法; 2.短进程优先算法; 3.时间片轮转调度算法。 设计分析: 程序流程图: 1.先来先服务算法 开始 初始化PCB,输入进程信息 各进程按先来先到的顺序进入就绪队列 结束 就绪队列? 运行 运行进程所需CPU时间 取消该进程 2.短进程优先算法

3.时间片轮转调度算法 实验代码: 1.先来先服务算法 #include #define n 20 typedef struct { int id; //进程名

int atime; //进程到达时间 int runtime; //进程运行时间 }fcs; void main() { int amount,i,j,diao,huan; fcs f[n]; cout<<"请输入进程个数:"<>amount; for(i=0;i>f[i].id; cin>>f[i].atime; cin>>f[i].runtime; } for(i=0;if[j+1].atime) {diao=f[j].atime; f[j].atime=f[j+1].atime; f[j+1].atime=diao; huan=f[j].id; f[j].id=f[j+1].id; f[j+1].id=huan; } } } for(i=0;i #define n 5 #define num 5 #define max 65535 typedef struct pro { int PRO_ID; int arrive_time;

进程模拟调度算法课程设计

一.课程概述 1.1.设计构想 程序能够完成以下操作:创建进程:先输入进程的数目,再一次输入每个进程的进程名、运行总时间和优先级,先到达的先输入;进程调度:进程创建完成后就选择进程调度算法,并单步执行,每次执行的结果都从屏幕上输出来。 1.2.需求分析 在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目,要使这多个进程能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。分配处理机的任务是由处理机调度程序完成的。由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。本次实验在VC++6.0环境下实现先来先服务调度算法,短作业优先调度算法,高优先权调度算法,时间片轮转调度算法和多级反馈队列调度算法。 1.3.理论依据 为了描述和管制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block),PCB中记录了操作系统所需的、用于描述进程的当前情况以及控制进程运行的全部信息,系统总是通过PCB对进程进行控制,亦即,系统是根据进程的PCB 而不是任何别的什么而感知进程的存在的,PCB是进程存在的惟一标志。本次课程设计用结构体Process代替PCB的功能。 1.4.课程任务 一、用C语言(或C++)编程实现操作模拟操作系统进程调度子系统的基本功能;运用多 种算法实现对进程的模拟调度。 二、通过编写程序实现进程或作业先来先服务、高优先权、按时间片轮转、短作业优先、多 级反馈队列调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。 三、实现用户界面的开发

进程调度算法的仿真实现

《计算机操作系统原理》课外上机 实验报告 题目:实验名称:进程调度算法的仿真实现 组长主要任务: 1.总体数据结构设计; 2.进程调度算法过程构架分析; 3.优先级算法静态优先级抢占算法; 4.动态优先级算法编写; 5.算法测试分析; 6.使用手册撰写。 组员主要任务: 1.总体数据结构设计; 2.进程调度算法过程构架分析; 3.进程创建算法编写; 4.时间片轮转法算法编写 5.用户界面编写; 6.实验报告撰写。 一、实验目的 1.仿真进程并发的调度环境,设计和实现PCB控制块、进程创建、进程切换、进程并发、进程阻塞和进程调度的算法 2.掌握进程调度的优先权法、时间片轮转法和多级反馈队列算法的实现 3.强化算法设计和数据结构。 二、核心设计思路及实现内容 1.利用随机数产生进程,创建PCB类的数组对象; 2.建立等待序列将创建好的PCB数组放入等待序列; 3.当进程的进入时间小于等于模拟的系统时间时,将该进程从等待序列进入就绪队列,并 将就绪队列内的进程按随机生成的优先级进行排序; 4.静态优先级算法:优先级高的进程优先的进入; 5.动态优先级算法:与静态优先级算法相类似,增加一个优先级减少的算法,优先级高的 进程优先的进入; 6.时间片算法:根据随机的优先级,确定时间片执行进程,就绪队列队头进入到运行态, 在时间片内不能完成的进入就绪队列,时间片未完成的插入到就绪队列队尾,时间片完成的从运行队列中删除。 三、数据结构及操作函数设计 1.总体数据结构:

class PCB( ) { public PCB(){} //构造函数 public PCB(ID){} //重载构造函数 public PCB(ID ,Priority ,in ,Alltime ,State){} //重载构造函数 } public partial class 进程调度 { //队列初始化 public 进程调度仿真() ; //用户界面 private void button_Click(); //按钮动作函数 private void AddListViewItem(); //输出显示窗口 private void staticPriority(); //静态优先级函数 private void ActivePriority(); //动态优先级函数 private void TimePiece(); //时间片轮转调度算法函数 } 2.模块 ①PCB 类:进程控制模块的类,类中包含进程名(ID ),优先级(priority ),进入时间(In ), 入运行队列 占 时间从运行队列中删除。

操作系统短作业优先调度算法

课程设计 采用短作业优先调度算法调度程序 学号: 姓名: 专业: 指导老师: 日期:

目录 一、实验题目 (3) 二、课程设计的目的 (3) 三、设计内容 (3) 四、设计要求 (3) 五、主要数据结构及其说明 (4) 六、程序运行结果 (5) 七、流程图 (7) 八、源程序文件 (9) 九、实验体会 (13) 十、参考文献 (13)

摘要 在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目。这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。分配处理机的任务是由处理机调度程序完成的。由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统性能(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。 在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。对于批量型作业而言,通常需要经历作业调度和进程调度两个过程后方能获得处理机。作业调度是对成批进入系统的用户作业,根据作业控制块的信息,按一定的策略选取若干个作业使它们可以去获得处理器运行的一项工作。而对每个用户来说总希望自己的作业的周转时间是最小的,短作业优先(SJF)便是其中一种调度方法。本次课程设计主要是模拟短作业优先(SJF)调度算法。

一、实验题目 采用短作业优先算法的的进程调度程序 二、课程设计的目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。 进一步巩固和复习操作系统的基础知识。 培养学生结构化程序、模块化程序设计的方法和能力。 提高学生调试程序的技巧和软件设计的能力。 提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。 三、设计内容 设计并实现一个采用短作业优先算的进程调度算法演示程序 四、设计要求 1. 每一个进程有一个PCB,其内容可以根据具体情况设定。 2. 进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定 3. 可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、时间片长度、进程优先级的初始化 4. 可以在运行中显示各进程的状态:就绪、执行(由于不要求设置互斥资源与进程间同步关系,故只有两种状态) 5. 采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以及相应的阻塞队列

进程调度算法1

进程调度算法(附录)#include #include #include #include #include #include #define P_NUM 5 #define P_TIME 50 enum state { ready, execute, block, finish }; struct pcb { char name[4]; int priority; int cputime; int needtime; int count; int round; state process; pcb * next; }; pcb * get_process(); pcb * get_process() { pcb *q; pcb *t; pcb *p; int i=0; cout<<"input name and time"<>q->name; cin>>q->needtime; q->cputime=0; q->priority=P_TIME-q->needtime; q->process=ready; q->next=NULL; if (i==0){ p=q; t=q;} else{t->next=q;t=q; } i++; } //while return p; }

void display(pcb *p) { cout<<"name"<<" "<<"cputime"<<" "<<"needtime"<<" "<<"priority"<<" "<<"state"<name; cout<<" "; cout<cputime; cout<<" "; cout<needtime; cout<<" "; cout<priority; cout<<" "; switch(p->process) { case ready:cout<<"ready"<next; } } int process_finish(pcb *q) { int bl=1; while(bl&&q){ bl=bl&&q->needtime==0; q=q->next; } return bl; } void cpuexe(pcb *q) { pcb *t=q; int tp=0; while(q){ if (q->process!=finish) { q->process=ready; if(q->needtime==0){ q->process=finish; } } if(tppriority&&q->process!=finish) { tp=q->priority; t=q;

进程调度算法实验报告

实验报告 实验一:进程调度算法 一、实验目的 1.利用高级语言实现三种不同及进程调度算法: 短作业优先算法、时间片轮转调度算法和优先级调度算法。 2.通过实验理解有关进程控制块,进程队列等的概念。 二、实验原理 各调度算法思想: 1.先来先服务算法(FCFS): 按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。 2.时间片轮转算法: 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。 3.优先权调度算法;在创建进程时就确定优先权,确定之后在整个程序运行期间不再改 变,根据优先级排列,系统会把CPU分配给优先权最高的进程。 三、实验步骤、数据记录及处理 1、算法流程

抽象数据类型的定义:PCB块结构体类型 struct PCB { int name; int arrivetime; // 到达时间 int servicetime; // 服务时间 //int starttime[max]; // 开始时间 int finishtime; // 完成/ 结束时间 int turntime; // 周转时间 int average_turntime; // 带权周转时间 int sign; // 标志进程是否完成 int remain_time; // 剩余时间 int priority; // 优先级 }pcb[max]; 主程序的流程以及各程序模块之间的层次( 调用) 关系:主程序中从键盘得到进程的数量,创建PCB,调用layout ()函数显示选择界面。 Layout ()函数中选择相应的算法并调用相关函数如:FCFS()、time_segment(); Priority() ,这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。 程序流程图:

进程调度算法的模拟实现

操作系统课程设计报告题目:进程调度算法的模拟实现_ 专业计算机科学与技术 学生姓名 班级 学号 指导教师 发放日期2015.1.30 信息工程学院

目录 1 概述 (1) 2 设计原理 (1) 2.1先来先服务算法 (1) 3 详细设计与编码 (2) 3.1 模块设计 (2) 3.2 系统流程图 (2) 3.3 系统详细设计 (2) 4 结果与分析 (6) 4.1 测试方案 (6) 4.2 测试结果 (6) 4.3 测试结果分析 (9) 5 设计小结 (10) 6 参考文献 (10) 附录程序代码 (12)

进程调度算法的模拟实现 进程调度算法的模拟实现 1 概述 选择一个调度算法,实现处理机调度,进程调度算法包括:先来先服务算法,短进程优先算法,时间片轮转算法,动态优先级算法。可选择进程数量,本程序包括四种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。 2 设计原理 2.1先来先服务(FCFS)算法 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列 2.2 时间片轮转法(RR)算法 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。 2.3短作业优先(SJF)算法 短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2.4最高优先权优先(HRRN)算法 优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

操作系统磁盘调度算法

操作系统课程设计任务书 题目: 磁盘调度算法 院系: 专业: 班级: 姓名: 学号: 指导教师: 设计时间:2018.1.1-2018.1.5 指导教师评语

目录 1、需求分析?4 1.1课题描述 (4) 1.2课题目的 (4) 1.3理论依据?7 2、概要设计?8 2.1设计方法 ............................................................................................... 82.2技术?8 2.3运行环境?8 3、详细设计?9 3.1流程图 (11) 3.2程序主要代码? 13 14 4、运行结果及分析? 4.1运行结果? 15 4.2结果详细分析?6 1 16 5、总结和心得? 7 1 6、参考文献? 2 7、附录:程序源代码? 3

1、需求分析 1.1课题描述 这次课程设计我研究的题目是:磁盘调度算法。具体包括三种算法分别是:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(电梯调度算法)(SCAN)。 1.2课题目的 通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS,最短寻道时间优先SSTF,扫描SCAN算法的实现方法。 1.3理论依据 设备的动态分配算法与进程调度相似,也是基于一定的分配策略的。常用的分配策略有先请求先分配、优先级高者先分配等策略。在多道程序系统中,低效率通常是由于磁盘类旋转设备使用不当造成的。操作系统中,对磁盘的访问要求来自多方面,常常需要排队。这时,对众多的访问要求按一定的次序响应,会直接影响磁盘的工作效率,进而影响系统的性能。访问磁盘的时间因子由3部分构成,它们是查找(查找磁道)时间、等待(旋转等待扇区)时间和数据传输时间,其中查找时间是决定因素。因此,磁盘调度算法先考虑优化查找策略,需要时再优化旋转等待策略。 平均寻道长度(L)为所有磁道所需移动距离之和除以总的所需访问的磁道数(N),即:L=(M1+M2+……+Mi+……+MN)/N

操作系统模拟进程调度算法

操作系统 ——项目文档报告 进程调度算法 专业: 班级: 指导教师: 姓名: 学号:

一、核心算法思想 1.先来先服务调度算法 先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。 2.短作业(进程)优先调度算法 短作业(进程)优先调度算法SJ(P)F,是指对短作业或短进程优先调度的算法。它们可以分别用于作业调度和进程调度。短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。该算法对长作业不利,完全未考虑作业的紧迫程度。 3.高响应比优先调度算法 在批处理系统中,短作业优先算法是一种比较好的算法,其主要不足之处是长作业的运行得不到保证。如果我们能为每个作业引人动态优先权,并使作业的优先级随着等待时间的增加而以速率a提高,则长作业在等待一定的时间后,必然有机会分配到处理机。该优先权的变化规律可描述为: 优先权=(等待时间+要求服务时间)/要求服务时间 即优先权=响应时间/要求服务时间 如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而该算法有利于短作业。 当要球服务的时间相同时,作业的优先权决定于其等待时间,等待时间越长,优先权越高,因而它实现的是先来先服务 对于长作业,作业的优先级可以随着等待时间的增加而提高,当其等待时间足够长时,其优先级便可以升到很高,从而也可获得处理机。 4.时间片轮转算法 在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。 二、核心算法流程图

几种操作系统调度算法

保证调度算法 基本思想:向用户做出明确的性能保证,然后去实现它.如你工作时有n个用户的登录,则你将获得cpu处理能力的1/n 算法实现:跟踪计算各个进程已经使用的cpu时间和应该获得的cpu时间,调度将转向两者之比最低的进程 五,保证调度算法 思想:向用户做出明确的性能保证,然后去实现它. 算法:容易实现的一种保证是:当工作时己有n个用户登录在系统,则将获得CPU处理能力的1/n.类似的,如果在一个有n个进程运行的用户系统中,每个进程将获得CPU处理能力的1/n. 实现方法:OS应记录及计算,各个进程在一定时间段内,已经使用的CPU时间和应该得到的CPU时间,二者之比小者优先级高. 5. 保证调度 一种完全不同的调度算法是向用户作出明确的性能保证,然后去实现它。一种很实际并很容易实现的保证是:若用户工作时有n个用户登录,则用户将获得CPU处理能力的1/n。类似地,在一个有n个进程运行的单用户系统中,若所有的进程都等价,则每个进程将获得1/n的CPU时间。看上去足够公平了。 为了实现所做的保证,系统必须跟踪各个进程自创建以来已使用了多少CPU时间。然后它计算各个进程应获得的CPU时间,即自创建以来的时间除以n。由于各个进程实际获得的CPU时间是已知的,所以很容易计算出真正获得的CPU时间和应获得的CPU时间之比。比率为0.5说明一个进程只获得了应得时间的一半,而比率为2.0则说明它获得了应得时间的2倍。于是该算法随后转向比率最低的进程,直到该进程的比率超过它的最接近竞争者为止。 彩票调度算法 基本思想:为进程发放针对系统各种资源(如cpu时间)的彩票;当调度程序需要做出决策时,随机选择一张彩票,持有该彩票的进程将获得系统资源 合作进程之间的彩票交换 六,彩票调度算法 彩票调度算法: 为进程发放针对各种资源(如CPU时间)的彩票.调度程序随机选择一张彩票,持有该彩票的进程获得系统资源. 彩票调度算法的特点: 平等且体现优先级:进程都是平等的,有相同的运行机会.如果某些进程需要更多的机会,可被给予更多彩票,增加其中奖机会. 易计算CPU的占有几率:某进程占用CPU的几率,与所持有的彩票数成正比例.该算法可实现各进程占用CPU的几率. 响应迅速 各个进程可以合作,相互交换彩票. 容易实现按比例分配如图象传输率,10帧/s,15帧/s,25帧/s

操作系统实验 第五讲 磁盘调度算法

操作系统 实验报告 哈尔滨工程大学 计算机科学与技术学院

第六讲磁盘调度算法 一、实验概述 1. 实验名称 磁盘调度算法 2. 实验目的 (1)通过学习EOS 实现磁盘调度算法的机制,掌握磁盘调度算法执行的条件和时机; (2)观察EOS 实现的FCFS、SSTF和SCAN磁盘调度算法,了解常用的磁盘调度算法; (3)编写CSCAN和N-Step-SCAN磁盘调度算法,加深对各种扫描算法的理解。 3. 实验类型 验证性+设计性实验 4. 实验内容 (1)验证先来先服务(FCFS)磁盘调度算法; (2)验证最短寻道时间优先(SSTF)磁盘调度算法; (3)验证SSTF算法造成的线程“饥饿”现象; (4)验证扫描(SCAN)磁盘调度算法; (5)改写SCAN算法。 二、实验环境 在OS Lab实验环境的基础上,利用EOS操作系统,由汇编语言及C语言编写代码,对需要的项目进行生成、调试、查看和修改,并通过EOS应用程序使内核从源代码变为可以在虚拟机上使用。 三、实验过程 1. 设计思路和流程图 (1)改写SCAN算法 在已有SCAN 算法源代码的基础上进行改写,要求不再使用双重循环,而是只遍历一次请求队列中的请求,就可以选中下一个要处理的请求。算法流程图如下图所示。

图 3.1.1 SCAN算法IopDiskSchedule函数流程图 (2)编写循环扫描(CSCAN)磁盘调度算法 在已经完成的SCAN算法源代码的基础上进行改写,不再使用全局变量ScanInside确定磁头移动的方向,而是规定磁头只能从外向内移动。当磁头移动到最内的被访问磁道时,磁头立即移动到最外的被访问磁道,即将最大磁道号紧接着最小磁道号构成循环,进行扫描。算法流程图如下图所示。 图 3.1.2 CSCAN算法IopDiskSchedule函数流程图 (3)编写N-Step-SCAN磁盘调度算法 在已经完成的SCAN 算法源代码的基础上进行改写,将请求队列分成若干个长度为N 的子队列,调度程序按照FCFS原则依次处理这些子队列,而每处理一个子队列时,又是按照SCAN算法。算法流程图如下图所示。

相关文档
最新文档