当前位置:文档之家› 多级反馈队列调度

多级反馈队列调度

多级反馈队列调度
多级反馈队列调度

[操作系统] 多级反馈队列的调度

实验目标

1.理解有关进程控制块,进程队列的概念。

2.掌握进程多级反馈队列的调度的处理逻辑。

3.设计进程控制块PCB的结构,分别适用于多级反馈队列的调度。

4.建立进程就绪队列。

5.编制多级反馈队列的调度算法。

实验要求

用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。设计思路

多级反馈队列

多级反馈队列原理

多级反馈队列调度算法又称反馈循环队列或多队列策略,主要思想是将就绪进程分为两级或多级,系统相应建立两个或多个就绪进程队列,较高优先级的队列一般分配给较短的时间片。处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取。

具体描叙如下:

①OS设置有多个就绪队列(用qReadyi, i=1,2, ... ,n表示),用于存放等待处理的进程,每个队列的优先权(priority)各不相同,从第一个到最后一个依次降低;

②各个队列中进程执行的时间片大小各不相同,优先级越高的队列时间片越小,各个队列的时间片可按下面的规定:每一个队列时间片都比前一个队列时间片长1倍;

③当一个进程进入内存后,先放入第一队列qReady1末尾,按先来先响应的原则排队等待处理。该进程执行时若在规定的时间片内完成,则处理完毕,可撤离系统,若第一个时间片结束时尚未完成,则该进程转入第二队列qReady2的末尾排队等待处理,依次下去,直至转到最后一个队列中。

④仅当第i个队列qReadyi为空,才能调度第i+1队列qReady (i+1)中的进程运行。如果第qReadyi队列中某进程正在执行,又有新进程进入第qReady1至qReady(i-1)中任何队列,则此时正在运行的进程放回第i队列末尾,运行新进程。

●每个进程在输入时,需描述下面的特征:

进程名(可用字符串或用整数简单表示)

到达时间(可用整数表示,以时间片为单位)

所需执行时间(整数,以时间片为单位)

多级反馈队列调度算法

需求分析

多级反馈队列调度算法是一种性能较好的作业低级调度策略,能够满足各类用户的需要。对于分时交互型短作业,系统通常可在第一队列(高优先级队列)规定的时间片内让其完成工作,使终端型用户都感到满意;对短的批处理作业,通常,只需在第一或第一、第二队列(中优先级队列)中各执行一个时间片就能完成工作,周转时间仍然很短;对长的批处理作业,它将依次在第一、第二、……,各个队列中获得时间片并运行,决不会出现得不到处理的情况。此系统模拟了多级反馈队列调度算法及其实现,包含了一下几个功能模块:(注:此系统中无法实现线程的功能,只能用人为的方式实现对多级反馈队列调度算法的模拟!)

①创建进程

该模块实现对进程任务的创建,要求用户在创建进程时输入进程名,所需运行时间,任务的到达时间(时间片)则由系统自动赋值,即任务一被创建后立刻进入qReady1中,则该

任务的到达时间(时间片)为qReady1就绪队列的时间片。

该模块由涉及的算法有:

Status creatPro(LinkQueue &quePro);

②运行进程

该模块首先判断运行队列中是否有任务在执行,如果处理器处于空闲状态,则按照多级反馈队列调度算法的原理依次从第一、第二……第i个就绪队列中选中一个进程任务进入运行队列。当处理器执行任务时间片到或者在规定的时间片内任务已完成,则把任务从处理器撤消或者让任务进入低优先级就绪队列中去,从新调度高优先级就绪队列中的任务进入运行队列,直到所有的就绪队列空了为止,或者处理器响应其他请求。

该模块由涉及的算法有:

void run();

void dealTime();

void runPro(void);

③阻塞进程

处理器在执行任务的过程中,出现等待使用资源或某事件的发生,如等待外设传输、等待人工干预等,则系统把运行队列中正在执行的任务撤消,让任务进入等待队列。

该模块由涉及的算法有:

void wait();

void wake();

④唤醒进程

任务进入等待队列后,当资源得到满足或某事件已经发生,如外设传输结束、人工干预完成时,处理器将等待队列中对应的任务重新调度到就绪队列中,等待处理器执行该任务。

该模块由涉及的算法有:

void wake();

⑤撤消进程

处理器在执行运行队列中的任务时,该模块模拟人工干预或其他中断导致任务提前退出系统的功能。

多级反馈队列调度算法主要数据结构

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

// 函数结果状态代码

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

///////////////////////

typedef int Status;

typedef int Boolean;

//////////////////////////////////////////

typedef struct QNode

{

char name[5];

int time;

int timeType;

QNode *next;

}*QueuePtr;

struct LinkQueue

{

QueuePtr front,rear; // 队头、队尾指针

};

int count=0; //时间计数变量

LinkQueue qRun,qWait,qReady1,qReady2,qReady3,qReady4;

主要代码结构

////////////////////////////////////////////////////////////////////////// void menu1();

void menu2();

void gotoxy(int x,int y);

void clrscr(void);

void clreol(void);

void clreoscr(void);

Status InitQueue(LinkQueue &Q);

Status creatPro(LinkQueue &quePro);

void dealTime();

void runPro(void);

void run();

void wait();

void wake();

void endPro();

//////////////////////////////////////////////////////////////////////////

//DOS界面坐标定位函数/////////////////////////////////////////////////////

void gotoxy(int x,int y)

{

CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //variablendklaration

HANDLE hConsoleOut;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);

csbiInfo.dwCursorPosition.X = x; //cursorposition X koordinate festlegen

csbiInfo.dwCursorPosition.Y = y; //cursorposition Y koordinate festlegen

SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition); //den cursor an die festgelegte koordinate setzen

}

void clrscr(void) //clearscreen: gesamten Bildschirm leeren

{

CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //variablendklaration

HANDLE hConsoleOut;

COORD Home = {0,0};

DWORD dummy;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);

FillConsoleOutputCharacter(hConsoleOut,' ',csbiInfo.dwSize.X * csbiInfo.dwSize.Y,Home,&dummy); //bis cursorposition leerzeichen ausgeben csbiInfo.dwCursorPosition.X = 0; //cursorposition X koordinate festlegen

csbiInfo.dwCursorPosition.Y = 0; //cursorposition Y koordinate festlegen

SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition); //den cursor an die festgelegte koordinate setzen

}

void clreol(void) //clear end of line

{

CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //variablendklaration

HANDLE hConsoleOut;

COORD Home,pos;

DWORD dummy;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);

Home = csbiInfo.dwCursorPosition;

pos.X = 80 - csbiInfo.dwCursorPosition.X;

FillConsoleOutputCharacter(hConsoleOut,' ',pos.X,Home,&dummy);

}

void clreoscr(void) //clear end of screen: alles nach dem cursor

{

CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

HANDLE hConsoleOut;

COORD Home;

DWORD dummy;

hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);

Home=csbiInfo.dwCursorPosition;

FillConsoleOutputCharacter(hConsoleOut,' ',csbiInfo.dwSize.X * csbiInfo.dwSize.Y,Home,&dummy);

}

///////////////////////////////////////////////////////////////////////////////

Status InitQueue(LinkQueue &Q)

{ // 构造一个空队列Q

if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))

exit(OVERFLOW);

Q.front->next=NULL;

return OK;

}

Status EnQueue(LinkQueue &Q,char e[5],int proTime,int tType)

{ // 插入元素e为Q的新的队尾元素

QueuePtr p;

if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败

exit(OVERFLOW);

strcpy(p->name,e);

p->time=proTime;

p->timeType=tType;

p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return OK;

}

Status DeQueue(LinkQueue &Q,char e[5])

{ // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR QueuePtr p;

if(Q.front==Q.rear)

return ERROR;

p=Q.front->next;

strcpy(e,p->name);

Q.front->next=p->next;

if(Q.rear==p)

Q.rear=Q.front;

free(p);

return OK;

}

Status QueueTraverse(LinkQueue &Q,int x,int y)

{

QueuePtr p;

p=Q.front->next;

while(p)

{

gotoxy(x,y);

printf("%s",p->name);

gotoxy(x,y+1);

printf("%d",p->time);

p=p->next;

x+=6;

}

printf("\n");

return OK;

}

void print()

{

if(qRun.front!=qRun.rear){

QueueTraverse(qRun,17,5);

}

if(qWait.front!=qWait.rear){

QueueTraverse(qWait,17,8);

}

if(qReady1.front!=qReady1.rear){

QueueTraverse(qReady1,17,11);

}

if(qReady2.front!=qReady2.rear){

QueueTraverse(qReady2,17,14);

}

if(qReady3.front!=qReady3.rear){

QueueTraverse(qReady3,17,17);

}

if(qReady4.front!=qReady4.rear){

QueueTraverse(qReady4,17,20);

}

}

Status creatPro(LinkQueue &quePro)

{

char proName[5];

int proTime;

QueuePtr p;

b: gotoxy(22,3);

printf("进程名: ");

gotoxy(36,3);

printf("所需时间: ");

gotoxy(30,3);

scanf("%s",&proName);

gotoxy(46,3);

scanf("%d",&proTime);

if(proTime<=0)

{

gotoxy(22,3);

printf("信息提示: 输入时间错误!请按Enter键返回!");gotoxy(15,3);

getchar();getchar();

gotoxy(0,0);

menu1();

goto b;

}

getchar();

if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败

exit(OVERFLOW);

strcpy(p->name,proName);

p->time=proTime;

p->timeType=10; //进入时间片为10的就绪队列,即优先级最高的就绪队列p->next=NULL;

quePro.rear->next=p;

quePro.rear=p;

return OK;

}

void dealTime()

{

char e[5];

int tType=qRun.front->next->timeType;

++count;

qRun.front->next->time--;

if(qRun.front->next->time==0)

{

DeQueue(qRun,e);

runPro();

count=0;

}

else

if(qRun.front->next->timeType==count)

{

if(qRun.front->next->timeType==10)

EnQueue(qReady2,qRun.front->next->name,qRun.front->next->time,tType+10);

if(qRun.front->next->timeType==20)

EnQueue(qReady3,qRun.front->next->name,qRun.front->next->time,tType+20);

if(qRun.front->next->timeType==40)

EnQueue(qReady4,qRun.front->next->name,qRun.front->next->time,80);

if(qRun.front->next->timeType==80)

EnQueue(qReady4,qRun.front->next->name,qRun.front->next->time,80);

DeQueue(qRun,e);

runPro();

count=0;

}

}

void runPro(void)

{

char e[5];

int pTime,f1=0,f2=0,f3=0,f4=0;

if(qReady1.front!=qReady1.rear)

{

pTime=qReady1.front->next->time;

EnQueue(qRun,qReady1.front->next->name,pTime,qReady1.front->next->timeType);

DeQueue(qReady1,e);

f1=1;

}

else

{

if(qReady2.front!=qReady2.rear)

{

pTime=qReady2.front->next->time;

EnQueue(qRun,qReady2.front->next->name,pTime,qReady2.front->next->timeType);

DeQueue(qReady2,e);

f2=1;

}

else

{

if(qReady3.front!=qReady3.rear)

{

pTime=qReady3.front->next->time;

EnQueue(qRun,qReady3.front->next->name,pTime,qReady3.front->next->timeType);

DeQueue(qReady3,e);

f3=1;

}

else

{

if(qReady4.front!=qReady4.rear)

{

pTime=qReady4.front->next->time;

EnQueue(qRun,qReady4.front->next->name,pTime,qReady4.front->next->timeType);

DeQueue(qReady4,e);

f4=1;

}

}

}

}

gotoxy(0,4);

menu2();

if(f1==0 && f2==0 && f3==0 && f4==0)

{

gotoxy(0,0);

menu1();

gotoxy(22,3);

printf("信息提示:无就绪进程,请输入其他功能选项!");

}

gotoxy(0,4);

menu2();

}

void run()

{

if(qRun.front==qRun.rear)

runPro();

else

dealTime();

}

void endPro()

{

char e[5];

if(qRun.front==qRun.rear)

{

gotoxy(0,0);

menu1();

gotoxy(22,3);

printf("信息提示:无运行进程,请按Enter键运行进程!");

gotoxy(15,3);

}

else

{

DeQueue(qRun,e);

gotoxy(0,0);

menu1();

gotoxy(22,3);

printf("信息提示:选择菜单功能或按Enter键执行进程!");

gotoxy(0,4);

menu2();

print();

}

}

void wait()

{

char e[5];

if(qRun.front!=qRun.rear)

{

EnQueue(qWait,qRun.front->next->name,qRun.front->next->time,qRun.front->next->timeTy pe);

DeQueue(qRun,e);

gotoxy(0,4);

menu2();

print();

gotoxy(22,3);

printf("信息提示: 选择菜单功能或按Enter键执行进程!");

}

else

{

gotoxy(0,0);

menu1();

gotoxy(22,3);

printf("信息提示:无运行进程,请输入其他功能选项!");

}

}

void wake()

{

char e[5];

if(qWait.front!=qWait.rear)

{

EnQueue(qReady1,qWait.front->next->name,qWait.front->next->time,qWait.front->next->ti meType);

DeQueue(qWait,e);

gotoxy(0,4);

menu2();

print();

gotoxy(22,3);

printf("信息提示: 选择菜单功能或按Enter键执行进程!");

}

else

{

gotoxy(0,0);

menu1();

gotoxy(22,3);

printf("信息提示:无等待进程,请输入其他功能选项!");

}

}

void menu1()

{

printf(" ┏━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");

printf(" ┃1-> 创建进程┃2-> 撤销进程┃3-> 阻塞进程┃4-> 唤醒进程┃0->退出系统┃\n");

printf(" ┣━━━━━━━╋━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┫\n");

printf(" ┃菜单选择: ┃┃\n");

}

void menu2()

{

printf(" ┣━━━━━┳━┻┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┫\n");

printf(" ┃Run: ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");

printf(" ┃Wait: ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");

printf(" ┃Ready1 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time:10 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");

printf(" ┃Ready2 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time:20 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");

printf(" ┃Ready3 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time:40 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");

printf(" ┃Ready4 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┃Time:80 ┃┃┃┃┃┃┃┃┃┃┃\n");

printf(" ┗━━━━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┛\n");

}

void main()

{

char a=NULL;

system("color 0B");

InitQueue(qRun);

InitQueue(qWait);

InitQueue(qReady1);

InitQueue(qReady2);

InitQueue(qReady3);

InitQueue(qReady4);

menu1();

menu2();

gotoxy(15,3);

scanf("%c",&a);

while(1)

{

gotoxy(0,0);

menu1();

switch(a)

{

case '1':creatPro(qReady1);

print();

gotoxy(22,3);

printf("信息提示: 选择菜单功能或按Enter键执行进程!");

while(1)

{

f: gotoxy(15,3);

a=getchar();

if(a=='\n')

{

gotoxy(22,3);

printf("信息提示: 选择菜单功能或按Enter键执行进程!");

run();

gotoxy(0,4);

menu2();

print();

}

else

break;

}

getchar();

break;

case '2':endPro();goto f;break;

case '3':wait();

goto f;

print();

break;

case '4':wake();

goto f;

print();

break;

case '0':

gotoxy(22,3);

exit(0);

break;

default:

gotoxy(22,3);

printf("信息提示: 输入错误!请选择正确的菜单功能选项!");

goto f;

}

print();

}

}

代码段分析

多级反馈队列调度算法又称反馈循环队列或多队列策略,主要思想是将就绪进程分为两级或多级,系统相应建立两个或多个就绪进程队列,较高优先级的队列一般分配给较短的时间片。处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取。使用这种调度策略具有较好的性能,能够满足各类用户的需要。

此系统简单模拟实现多级反馈队列调度算法,但是只是人为的模拟多线程实现处理器的分配,没有真正地实现多线程,只是单执行流过程。

在这次操作系统中,使我对操作系统中进程的概念,进程的状态转换,线程的概念和多线程实现对处理器分配的基本原理有了更加深刻的理解。其中也体现了我的不足:

①系统冗余代码过多。为了实现在dos下表格的制作,使用了一些特殊的表格线而非

利用C语言中的画图功能,频繁的进行光标定位和结果输出,冗余代码过多,浪费系统资源。

②算法效率较低。算法的实现都只考虑到效果的实现,而算法的效率则次之。

③使用dos界面运行程序而非可视化窗口界面。

④为了实现模拟的效果而采用了些低效率的做法,如:对进程的状态切换直接使用删

除、插入进程节点的方法,而非利用指针定位实现状态的切换,使系统每次运行相

关程序时,都要大量地执行删除、插入等操作,降低了系统的性能。

实验心得

此系统的界面是在DOS界面下输出的,所以以下的输出结果均是DOS界面截图。

①初始化界面:

②创建进程:依次创建进程任务:a , b , c , d , e , f

③运行进程:按Enter键执行进程,运行时间减1,如图所示任务a执行了

4秒。

④阻塞进程:任务a执行4秒后,进入阻塞状态,按Enter键继续执行就

绪任务b。

⑤唤醒进程:任务b运行2秒后,任务a被唤醒,进入就绪队列1。

⑥撤消进程:任务b继续运行5秒后被撤消。

多级反馈队列调度算法的实现

学生实习报告 课程名称_ 数据结构与数据处理应用训练 题目名称多级反馈队列调度算法的实现 学生学院计算机与计算科学 专业班级 学号 学生姓名 指导教师 2012年 2月 16 日 多级反馈队列调度算法的实现 【摘要】 多级反馈队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。UNIX操作系统便采取这种算法,而本次试验就是试用C语言模拟某多级反馈队列调度算法。本次试验中前三级就绪队列采用时间片轮转法,时间片大小分别为2、4和8,最后一级就绪队列采用FIFO调度,将任务进入多级队列进行模拟,任务从优先级高的队列到优先级地的队列的顺序逐一进入,还用了算法支持抢占式,最后完成模拟,得到各个任务先后完成的顺序,还有得到各个任务的响应时间、离开时间、周转时间。 【关键词】队列优先级任务时间 1 内容与要求 【内容】 多级反馈队列调度算法是操作系统中CPU处理机调度算法之一,该算法既能使高优先级的进程(任务)得到响应又能使短进程(任务)迅速完成。UNIX操作系统便采取这种算法,本次试验就是试用C语言模拟某多级反馈队列调度算法,通过输入任务号、到达时间、运行时间,求出任务完成的先后顺序以及各个任务

的响应时间、离开时间、周转时间。 【要求】 多级反馈队列调度算法描述: 1、该调度算法设置四级就绪队列:前三级就绪队列采用时间片轮转法,时间片大小分别为 2、4和8;最后一级就绪队列采用FIFO调度。 2、任务在进入待调度的队列等待时,首先进入优先级最高的队列等待。 3、首先调度优先级高的队列中的任务。若高优先级中队列中已没有调度的任务,则调度次优先级队列中的任务,依次类推。 4、对于同一个队列中的各个任务,按照队列指定调度方法调度。每次任务调度执行后,若没有完成任务,就被降到下一个低优先级队列中。 5、在低优先级的队列中的任务在运行时,又有新到达的任务,CPU马上分配给新到达的任务。(注:与原来的题目不同,原题是在低优先级的队列中的任务在运行时,又有新到达的任务时,要在运行完这个时间片后,CPU马上分配给新到达的任务,而本题不需要在运行完这个时间片,即正在进行的任务立刻停止,CPU 马上分配给新到达的任务) 6、为方便实现,时间以1为单位,用整数数据表示;且每个时间点,最多只有一个任务请求服务(即输入)。 2 总体设计 算法总体思路: 这是建立在一个时间轴上的,即时刻,一个一个时刻(时间点)进行。 2.1.1 主函数思路:

第三章习题

第三章 1、在各种作业调度算法中,若所有作业同时到达,则平均等待时间最短的算法是 A、先来先服务 B、优先数 C、最高响应比优先 D、短作业优先 2、既考虑作业等待时间,又考虑作业执行时间的调度算法是 A、响应比高者优先 B、短作业优先 C、优先级调度 D、先来先服务 3、作业调度程序从处于状态的队列中选取适当的作业投入运行。 A、运行 B、提交 C、完成 D、后备 4、是指从作业提交给系统到作业完成的时间间隔。 A、周转时间 B、响应时间 C、等待时间 D、运行时间 5、作业从进入后备队到被调度程序中的时间间隔称 为。 A、周转时间 B、响应时间 C、等待时间 D、触应时间 6、假设下述四个作业同时到达,当使用最高优先数优先调度算法时,作业的平均周转时间为小 时。 作业所需运行时间优先数 1 2 4 2 5 9 3 8 1 4 3 8 A、4.5 B、10.5 C、4.75 D、10.25 7、下述作业调度算法中,调度算法与作业的 估计运行时间有关。 A、先来先服务 B、短作业优先 C、均衡 D、时间片轮转 8、用户通过终使用计算机系统控制作业执行的方式称为。 A、自动 B、联机 C、脱机 D、假脱机 9、作业生存期共经历四个状态,它们是提交、后备、 和完成。 A、就绪 B、执行 C、等待 D、开始 10、系统在,发生从目态到管态的转换。 A、发出P操作时 B、发生V操作时 C、执行系统调用时 D、执行置程序状态字时 11、以下叙述中正确的是 A、操作系统的作业管理是一种微观的低级管理。 B、作业的提交方式有两种,但对应的作业控制方式只有一种。 C、一个作业从进入系统到运行结束,一般要经历的状态是:后备状态、就绪状态和完成状态。 D、多道批处理与单道批处理的主要区别在于它必须有作业调度功能和进程调度功能,内存中可以存放多道作业。 12、在分时操作系统中,进程调度经常采用算法。 A、先来先服务 B、最高优先权 C、时间片轮转D随机 13、资源的按序分配策略可以破坏条件。 A、互斥使用资源 B、占用且等待资源 C、非抢夺资源 D、循环等待资源 14、在为多道程序所提供的可共享的系统资源不足时,可能出现死锁。但是,不适当的

操作系统第三章作业讲解.doc

第三章 作业讲解 1、有5个作业进入就绪队列等待运行,预计它们的运行时间分别为9、6、3、5与X ,它们以什么样的调度顺序运行时会取得最小的响应时间?(答案与X 值有关) 答:短作业优先调度算法是使响应时间最小的调度算法: 0 < X ≤ 3时,调度顺序为: X 、3、5、6、9 3 < X ≤ 5时,调度顺序为: 3、X 、5、6、9 5 < X ≤ 6时,调度顺序为: 3、5、X 、6、9 6 < X ≤ 9时,调度顺序为: 3、5、6、X 、9 X > 9时,调度顺序为: 3、5、6、9、X 2、假设一个系统中有4个进程,它们的到达时间和服务时间如表所示,忽略I/O 以及其他开销时间,若分别按先来先服务(FCFS )、非抢占及抢占的短进程优先(SPF )、高响应比优先(HRRN )、时间片轮转(RR ,时间片=1)、多级反馈队列调度算法(FB ,第i 级队列的时间片=2i-1)进行CPU 调度,请给出各进程的完成时间、周转时间、带权周转时间、平均周转时间和平均带权周转时间。 算法 时间 进程 平均时间 A B C D FCFS 完成时间 周转时间 带权周转时间 5 5 1 7 6 3 16 13 1.44 23 1 7 2.43 10.25 1.97 SPF (非抢占) 完成时间 周转时间 带权周转时间 5 5 1 7 6 3 23 20 2.22 14 8 1.14 9.75 1.835 SPF (抢占) 完成时间 周转时间 带权周转时间 7 7 1.4 3 2 1 23 20 2.22 14 8 1.14 9.25 1.435 HRRN 完成时间 周转时间 带权周转时间 5 5 1 7 6 3 16 13 1.44 23 17 2.43 10.25 1.97 RR (q=1) 完成时间 周转时间 带权周转时间 12 12 2.4 4 3 1.5 23 20 2.22 22 16 2.29 12.75 2.1 FB (q=2i-1) 完成时间 周转时间 带权周转时间 13 13 2.6 6 5 2.5 23 20 2.22 21 15 2.14 13.25 2.365 3、若有4个周期性任务,任务A 要求每30ms 执行一次,执行时间为15ms ;任务B 要求每50ms 执行一次,执行时间为5ms ;任务C 要求每50ms 执行一次,执行时间为15ms ;任务D 要求每100ms 执行一次,执行时间为10ms ,应如何按最低松弛度优先算法对它们进行CPU 调试? (要求画出0-150ms 时段的调度时序图,并列出每次切换时每个任务的松弛度) 进程 到达时间 服务时间 A 0 5 B 1 2 C 3 9 D 6 7

多级反馈队列调度算法

#include #include <> #include<> #define NULL 0 #define MAL(type) (type *)malloc(sizeof(type)) using namespace std; typedef struct LNode {char name[5]; char state; int runtime; int needtime; struct LNode *next; }LNode; LNode *H; int T,D,J; void print() {LNode *p=H; printf("\n进程名需执行时间已执行时间状态\n"); for(int i=0;iname,p->needtime,p->runtime,p->state); p=p->next; } system("PAUSE");

void input() {int i; printf("请输入进程数:"); scanf("%d",&J); for(i=0;iname); printf("请输入第%d个进程需要的执行时间:",i+1); scanf("%d",&q->needtime); if(q->needtime<=0) {printf("所需时间要大于0\n 请重新输入——\n");i--;} else {q->runtime=0; q->state='N'; q->next=NULL; } if(i==0) H=p=q; else {p->next=q;p=q;} } printf("\n进程初始化态为:"); print();

加权公平队列调度算法

2008年2月 February 2008 —28— 计 算 机 工 程Computer Engineering 第34卷 第4期 Vol.34 No.4 ·博士论文· 文章编号:1000—3428(2008)04—0028—03 文献标识码:A 中图分类号:TP391 一种新的加权公平队列调度算法 尹德斌,谢剑英 (上海交通大学自动化系,上海 200240) 摘 要:传统公平队列调度算法(WFQ 、WRR 等)普遍存在基于数据包的权重参数计算问题,由此产生的高复杂度使其难以获得广泛应用。该文提出一种新的加权公平队列调度算法,使用服务概率和随机数实现加权公平调度,显著降低了算法的复杂度。同时使用自适应服务概率计算解决了数据包变长度带来的不公平性。通过队列管理技术有效地提高了交换机的缓冲区利用率,并减小了排队延迟抖动。仿真结果证明了算法的有效性和实用性。 关键词: 队列调度;加权公平排队;自适应队列管理;分组交换网络 New Weighted Fair Queue Scheduling Algorithm YIN De-bin, XIE Jian-ying (Department of Automation, Shanghai Jiaotong University, Shanghai 200240) 【Abstract 】Traditional weighted fair queue algorithms have the main drawback: the calculation of the weight parameters according to each packet.The paper proposes a new weighted fair queueing algorithm(SPFQ), which uses service probability to schedule packets and a random number to decide which packet to be served next. In addition, a novel adaptive service probability parameter calculation method is used to solve the unfair problem induced by the variable packet length and an adaptive queue management technology to improve the utilization of the server's queue buffer and reduce the delay burstiness. Simulation results demonstrate the validity and practicability of SPFQ. 【Key words 】queue scheduling; weighted fair queueing; adaptive queue management; packet switching network 1 概述 队列调度是当前互联网技术领域的一个研究热点。其中,加权公平队列调度算法由于能够根据各业务流的权重进行区分服务而受到广大研究者的广泛关注[1-9]。其中最著名的是加权公平WFQ [1]和加权轮询WRR [6]两类算法。WFQ 及其改进算法[3,5,7]都基于通用处理机共享模型[2],使用虚时间(virtual time)进行数据包转发。WFQ 算法在业务流受漏斗约束的情况下可以提供精确的带宽保证和最大时延上限,并且数据包的转发不受其他业务流特性影响。但是它的计算复杂度太高。WRR [2,6]是另一类复杂度相对较低的常用加权队列调度算法;各业务流在一次轮询中所允许发送的数据包个数由队列权重决定。DRR [4]引入了差额计数器(dificit conter),记录由数据包长度不同引起的服务量差。轮询类算法复杂度较低,但无法提供确定的带宽保证和时延上限。 国内的研究者近年来也提出了许多队列调度算法。文 献[8]针对SS 和BF 两种业务流,提出了一种对数自适应调度算法,但该算法对类内各业务流之间如何调度并没有说明,且不能提供公平服务和隔离特性。文献[9]提出了一种用于区分服务网络的虚时钟核心无状态队列调度算法,各数据包自身携带虚时钟状态信息,中心服务器根据虚时钟进行转发,但需要根据虚时钟将入队列数据包插入到转发队列中,这无疑是一项沉重的计算负担。另外,该算法并未考虑虚时钟清零问题。本文提出了一种新的加权队列调度算法SPFQ 。由于采用了指数移动平均算法和阀值触发的平均数据包长度更新,使得服务概率计算频度大大降低,从而显著降低了算法的复杂度。 2 SPFQ 队列调度算法 2.1 SPFQ 的基本原理 SPFQ 算法依据各业务流的平均数据包长度将它们的权重转换成归一化服务概率,通过该参数实现加权服务。为了降低算法的复杂度,系统采用事件触发方式计算队列的平均长度。在算法实现中,使用单独模块计算服务概率,以减轻调度器的负荷。 2.2 SPFQ 的结构 数据包分类器图1 SPFQ 算法结构 基金项目:国家自然科学基金资助项目(60572157);国家“863”计划基金资助项目(2003AA123310) 作者简介:尹德斌(1978-),男,博士,主研方向:包交换网络的队列调度和管理;谢剑英,教授、博士生导师 收稿日期:2007-03-10 E-mail :yin_db@https://www.doczj.com/doc/cc4647242.html,

操作系统论文-----多级反馈队列调度算法

在多道程序环境下,主存中有着多个进程,其数目往往多过于处理机数目。这就要求系统能按某种算法,动态的把处理机分配给就绪队列中的一个进程,使之执行。 在OS中的调度的实质是一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,目前存在的多种调度算法中,有的算法适用于作业电镀,有的算法适用于进程调度;但也有些调度算法即可用于作业调度,也可用于进程调度。 多级反馈队列调度算法是一种CPU处理机调度算法,它不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。 多级反馈队列调度算法的思想 设置多个就绪队列,并为各个队列赋予不同的优先级和不同长度的时间片;第一个队列的优先级最高,进程所执行时间片最小。 新创建的进程挂到第一优先级的队列后,然后按FCFS 原则排队等待调度。当轮到其执行时,如它能在时间片内完成,便撤离系统;如果不能完成,便被挂入第二级队列后,……; 仅当第一级队列空闲时,调度程序才调度第二级队列中的进程运行,依次类推……;新进程可抢占低级进程的处理机。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一

样的。一般来说,优先级Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最低的队列)的时间片一般很大(不需要考虑这个 问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1 队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 ,运行1个时间片,时间片还未到,此时J2到达。 2、时刻1 J2到达。由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给 J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。

多级反馈队列_实验_操作系统

实验名称:多级反馈队列调度 09091201丁奎荣 一、实验目的: 1、综合应用下列知识点设计并实现操作系统的进程调度,进程状态转换,多组级反馈队列进程调度算法。 2、加深理解操作系统进程调度的过程。 3、加深理解多级反馈队列进程调度算法。 二、实验内容: 1、采用一种熟悉的语言,编制程序,最好采用C/C++,界面设计可采用其它自己喜欢的语言。 2、采用多级反馈队列进程调度算法进行进程调度。 3、每个进程对应一个PCB。在PCB中包括进程标识符pid、进程的状态标志status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。 4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid时在1到100范围的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程号是空闲的,“假”表示下标对应的进程号已分配给某个进程。 5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。 6、进程优先级priority是0到49范围内的一个随机整数。 7、生命周期life是1到5范围内的一个随机整数。 8、初始化时,创建一个邻接表,包含50各就绪队列,各就绪队列的进程优先级priority分别是0到49。 9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个过程,然后将该PCB插入就绪队列中。按ctrl+q 退出进程调度循环。 10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。设计图形用户界面GUI,在窗口中显示该进程和其他所

进程调度算法实验报告

一、实验目的 多道程序系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现进程调度,以加深对进程概念和不同进程调度算法的理解。 二、实验环境 1.PC微机。 2.Windows 操作系统。 3.C/C++/VB等开发集成环境。 三、实验内容与步骤 编程实现如下进程调度算法: 1)时间片轮转调度算法:时间片长度在运行时可从键盘输入。 2)多级反馈队列调度算法:至少要有三个队列,第i+1队列进程运行的时间片是第i 队列的2倍。 3)高响应比优先调度算法:当调度响应比高的进程运行时,仍然是运行一个时间片, 而不是完全结束,刚运行的进程,其以前的等待时间清零。 实现提示: (1)PCB数据结构(参考) PCB 至少包括:进程标识符、进程名、到达时间、服务时间、等待时间、完成时间、响应比等(可根据不同的算法增减)。假设多个PCB 利用链接方式进行组织。 (2)主要功能模块(参考) ●进程初始化; ●显示初始化后进程的基本信息; ●时间片轮转调度算法; ●多级反馈队列调度算法; ●高响应比优先调度算法; 输入要求:可将进程初始化信息事先存入文件中,程序运行从文件中读取信息,避免从键盘输入速度慢且易出错。 输出要求:每种调度算法每次调度后应直观显示,进程调度的依据、各进程的各项参数。每种调度算法运行结束后,输出各个进程对应的完成时间、周转时间和带权周转时间,以及整体的平均带权周转时间。 四、实验结果与分析

(1)程序的框架说明 (2)各调度算法的设计思想 1、时间片轮转算法 该算法采取了非常公平的方式,即让就绪队列上的每个进程每次仅运行一个时间片。如果就绪队列上有N个进程,则每个进程每次大约都可获得1/N的处理机时间。时间片的大小对于系统性能有很大的影响。若选择很小的时间片,将有利于短作业,但意味着会频繁地执行进程调度和进程上下文的切换,这无疑会增加系统的开销。反之,若时间片选择得太长,且为使每个进程都能在一个时间片内完成,RR算法便退化为FCFS算法,无法满足短作业和交互式用户的需求。进程的切换时机体现出RR算法的特点。若一个进程在时间片还没结束时就已完成,此时立即激活调度程序,将它从执行队列中删除。若一个进程在时间片结束时还未运行完毕,则调度程序将把它送往就绪队列的末尾,等待下一次执行。 2、多级反馈队列调度算法 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 3、高响应比优先调度算法

多级反馈队列-实验-操作系统

多级反馈队列-实验-操作系统 以下是为大家整理的多级反馈队列-实验-操作系统的相关范文,本文关键词为多级,反馈,队列,实验,操作系统,实验,名称,多级,反馈,队,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 实验名称:多级反馈队列调度09091201丁奎荣 一、实验目的: 1、综合应用下列知识点设计并实现操作系统的进程调度,进程

状态转换,多组级反馈队列进程调度算法。 2、加深理解操作系统进程调度的过程。 3、加深理解多级反馈队列进程调度算法。二、实验内容: 1、采用一种熟悉的语言,编制程序,最好采用c/c++,界面设计可采用其它自己喜欢的语言。 2、采用多级反馈队列进程调度算法进行进程调度。 3、每个进程对应一个pcb。在pcb中包括进程标识符pid、进程的状态标志status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。 4、创建进程时即创建一个pcb,各个进程的pid都是唯一的,pid 时在1到100范围的一个整数。可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程号是空闲的,“假”表示下标对应的进程号已分配给某个进程。 5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。被进程调度程序选中后变为“run”。 6、进程优先级priority是0到49范围内的一个随机整数。 7、生命周期life是1到5范围内的一个随机整数。 8、初始化时,创建一个邻接表,包含50各就绪队列,各就绪队列的进程优先级priority分别是0到49。 9、为了模拟用户动态提交任务的过程,要求动态创建进程。进入进程调度循环后,每次按ctrl+f即动态创建一个过程,然后将该pcb 插入就绪队列中。按ctrl+q退出进程调度循环。

多级反馈队列调度算法_C语言

多级反馈队列调度算法C语言模拟实现 多级反馈队列调度算法: 1、设置多个就绪队列,并给队列赋予不同的优先级数,第一个最高,依次递减。 2、赋予各个队列中进程执行时间片的大小,优先级越高的队列,时间片越小。 3、当一个新进程进入内存后,首先将其放入一个对列末尾,如果在一个时间片 结束时尚未完成,将其转入第二队列末尾。 4、当一个进程从一个对列移至第n个队列后,便在第n个队列中采用时间片轮转执行完。 5、仅当时间片空闲时,才调度第二个队列中的进程。 (1~i-1)空闲时,才调度i,如果处理机正在第i队列中运行,又有新进程进入优先权较高 队列,则新进程抢占处理机,将正在运行的进程放入第i队列队尾,将处理机分给新进程。view plaincopy to clipboardprint? #include #include #include typedef struct node /*进程节点信息*/ { char name[20]; /*进程的名字*/ int prio; /*进程的优先级*/ int round; /*分配CPU的时间片*/ int cputime; /*CPU执行时间*/ int needtime; /*进程执行所需要的时间*/ char state; /*进程的状态,W——就绪态,R——执行态,F——完成态*/ int count; /*记录执行的次数*/ struct node *next; /*链表指针*/ }PCB; typedef struct Queue /*多级就绪队列节点信息*/ { PCB *LinkPCB; /*就绪队列中的进程队列指针*/ int prio; /*本就绪队列的优先级*/ int round; /*本就绪队列所分配的时间片*/ struct Queue *next; /*指向下一个就绪队列的链表指针*/ }ReadyQueue; PCB *run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/ ReadyQueue *Head = NULL; /*定义第一个就绪队列*/ int num; /*进程个数*/ int ReadyNum; /*就绪队列个数*/ void Output(); /*进程信息输出函数*/ void InsertFinish(PCB *in); /*将进程插入到完成队列尾部*/ void InsertPrio(ReadyQueue *in); /*创建就绪队列,规定优先数越小,优先级越低*/ void PrioCreate(); /*创建就绪队列输入函数*/ void GetFirst(ReadyQueue *queue); /*取得某一个就绪队列中的队头进程*/ void InsertLast(PCB *in,ReadyQueue *queue); /*将进程插入到就绪队列尾部*/ void ProcessCreate(); /*进程创建函数*/ void RoundRun(ReadyQueue *timechip); /*时间片轮转调度算法*/ void MultiDispatch(); /*多级调度算法,每次执行一个时间片*/ int main(void) { PrioCreate(); /*创建就绪队列*/ ProcessCreate();/*创建就绪进程队列*/

进程管理自测题2-3

第2-3章 一、选择题 1.预防死锁不可以去掉以下哪个条件? A. 互斥 B. 请求与保持 C. 不可剥夺 D. 环路 2.资源分配图是不可以完全简化的是判断死锁的什么条件? A. 充分条件 B. 必要条件 C. 充分必要条件 D. 什么也不是 3.设有4个作业同时到达,每个作业的执行时间是2min,它们在一台处理机上按单道方 式运行,则平均周转时间为? A. 1min B. 5min C. 2.5min D. 8min 4.若系统中有8台绘图仪,有多个进程均需要使用两台,规定每个进程一次仅允许申请一 台,则至多允许多少个进程参与竞争,而不会发生死锁? A. 5 B. 6 C. 7 D. 8 5.产生系统死锁的原因可能是? A. 一个进程进入死循环 B. 多个进程竞争资源出现了循环等待 C. 进程释放资源 D. 多个进程竞争共享型设备 6.以下哪种方法可以解除死锁? A. 挂起进程 B. 剥夺资源 C. 提高进程优先级 D. 降低进程优先级 7.采用有序分配资源的策略可以破坏产生死锁的哪个条件? A. 互斥条件 B. 请求与保持条件 C. 不可剥夺条件 D. 环路条件 8.以下解决死锁的方法中,属于预防策略的是? A. 化简资源分配图 B. 银行家算法 C. 资源的有序分配 D. 死锁检测法 9.下面哪种说法是对可剥夺系统的正确描述? A. 时间片轮转法是一种可剥夺式调度 B. 进程因等待某一事件而引起系统调度是一种可剥夺调度 C. 实时系统采用可剥夺式调度 D. 优先级低的进程放弃CPU,让优先级高的进程运行 10.以下关于调度的说法,正确的是 A. 进程通过调度得到CPU B. 优先级是进程调度的主要依据,一旦确定就不能改变 C. 在单CPU的系统中,任何时刻都有一个进程处于运行状态(就绪) D. 进程申请CPU得不到时,其状态为阻塞 11.作业从提交到完成的时间间隔成为作业的? A. 周转时间 B. 响应时间 C. 等待时间 D. 运行时间 12.下述哪种调度算法要事先估计进程的运行时间? A. 时间片轮转 B. 短进程优先 C. 优先级调度 D. 先来先服务 13.如果所有进程同时到达,下述哪种算法使进程的平均周转时间最短? A. 时间片轮转 B. 短进程优先

处理器调度习题

处理器调度 选择题 ?当CPU执行操作系统代码时,则处理机处于( )。 ?A.执行态B.目态C.管态D.就绪态 ?( )是机器指令的扩充,是硬件的首次延伸,是加在硬件上的第一层软件。 ?A.系统调用B.操作系统C.内核D.特权指令 ?操作系统提供给程序员的接口是( )。 ?A.进程B.系统调用C.库函数D.B和C ?用户程序向系统提出使用外设的请求方式是( )。 ?A.作业申请B.原语C.系统调用D.I/O指令 ?当作业正常完成进入完成状态时,操作系统( )。 ?A.将输出该作业的结果并删除内存中的作业 ?B.将收回该作业的所占资源并输出结果 ?C.将收回该作业的所占资源及输出结果,并删除该作业 ?D.将收回该作业的所占资源及输出结果,并将它的控制块从当前的队列中删除 ?下列选项是关于作业和进程关系的描述,其中哪一个是不正确的( )。 ?A.作业的概念主要用在批处理系统中,而进程的概念则用在几乎所有的OS中。 ?B.作业是比进程低一级的概念。 ?C.一个作业至少由一个进程组成。 ?D.作业是用户向计算机提交任务的实体,而进程是完成用户任务的执行实体以及向系统申请分配资源的基本单位。 ?作业从后备作业到被调度程序选中的时间称为( )。 ?周转时间B.响应时间C.等待调度时间D.运行时间 ?设有三个作业J1,J2,J3,它们同时到达,运行时间分别为T1,T2,T3,且T1≤T2≤T3,若它们在一台处理机上按单道运行,采用短作业优先算法,则平均周转时间为( )。 ?A.T1+T2+T3 B.1/3(T1+T2+T3) ?C.T1+2/3T2+1/3T3 D.T1+1/3T2+2/3T3 ?从作业提交给系统到作业完成的时间间隔称为作业的( )。 ?A.中断时间B.等待时间C.周转时间D.响应时间 ?设有四个作业同时到达,每个作业执行时间均为2 h,它们在一台处理机上按单道方式运行,则平均周转时间为( )。 ?A.1 h B.5 h C.2.5 h D.8 h ?FCFS调度算法有利于( )。 ?A.长作业和CPU繁忙型作业B.长作业和I/O繁忙型作业 ?C.短作业和CPU繁忙型作业D.短作业和I/O繁忙型作业 ?下列哪种说法不是SJ(P)F调度算法的缺点( )。 ?A.对于长作业(进程)不利 ?B.未考虑作业(进程)的紧迫程度 ?C.不能有效降低作业(进程)的平均等待时间 ?D.由于根据的是用户提供的估计执行时间,因此不一定真正做到短而优先。 ?选择排队进程中等待时间最长的进程被优先调度,该调度算法是( )。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.优先权调度算法D.高响应比优先调度算法 ?在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则此时的优先权调度算法实际上和( )相同。 ?A.先来先服务调度算法B.短进程优先调度算法 ?C.时间片轮转调度算法D.长进程优先调度算法

操作系统原理-第四章 处理机调度(有答案)

第四章处理机调度 4.3 习题 4.3.1 选择最合适的答案 1.某系统采用了银行家算法,则下列叙述正确的是()。 A.系统处于不安全状态时一定会发生死锁 B.系统处于不安全状态时可能会发生死锁 C.系统处于安全状态时可能会发生死锁 D.系统处于安全状态时一定会发生死锁 2.银行家算法中的数据结构包括有可利用资源向量Available、最大需求矩阵Max、分配矩阵Allocation、需求矩阵Need,下列选项正确的是()。 A.Max[i,j]=Allocation[i,j]+Need[i,j] B.Need[i,j]= Allocation[i,j]+ Max[i,j] C.Max[i,j]= Available[i,j]+Need[i,j] D.Need[i,j]= Available[i,j]+ Max[i,j] 3.下列进程调度算法中,()可能会出现进程长期得不到调度的情况。 A.非抢占式静态优先权法 B.抢占式静态优先权法 C.时间片轮转调度算法 D.非抢占式动态优先权法 4.在下列选项中,属于预防死锁的方法是()。 A.剥夺资源法 B.资源分配图简化法 C.资源随意分配 D.银行家算法 5.在下列选项中,属于检测死锁的方法是()。 A.银行家算法 B.消进程法 C.资源静态分配法 D.资源分配图简化法 6.在下列选项中,属于解除死锁的方法是()。 A.剥夺资源法 B.资源分配图简化法 C.银行家算法 D.资源静态分配法 7.为了照顾紧迫型作业,应采用()。 A.先来服务调度算法 B.短作业优先调度算法 C.时间片轮转调度算法 D.优先权调度算法 8.在采用动态优先权的优先权调度算法中,如果所有进程都具有相同优先权初值,则

操作系统实验报告之进度调度模拟程序

目录 进程调度程序设计 一、实验目的和要求 (1) 二、实验内容及原理 (2) 三、实验仪器设备 (4) 四、操作方法与实验步骤 (4) 五、实验数据记录和处理 (5) 六、实验结果与分析 (12) 七、实验感想 (14) 实验一进程调度程序设计 一、实验目的和要求 1、目的

进程是操作系统最重要的概念之一,进程调度是操作系统的主要内容。理解操作系统进程管理中进行进程调度的过程和编程方法,掌握先来先服务调度算法和最高优先数优先的调度算法,创建进程控制块PCB。理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。通过实验,加深对进程调度和各种调度算法的认识与了解。 2、要求 (1)设计一个有几个进程并发执行的进程调度程序,每个进程由一个进程控制块(PCB)表示,进程控制块通常应包括下述信息:进程名,进程优先数,进程需要运行的时间,占用CPU的时间以及进程的状态等,且可按照调度算法的不同而增删。 (2)调度程序应包含2—3种不同的调度算法,运行时可以任选一种,以利于各种方法的分析和比较。 (3)系统应能显示或打印各进程状态和参数的变化情况,便于观察 二、实验内容及原理 编写并调试一个模拟的进程调度程序,采用“多级反馈队列”调度算法对五个进程进行调度。 多级反馈队列调度算法的基本思想是:当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度.当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行,以此类推。 1、设置多个就绪队列,并给队列赋予不同的优先级数,第一个最高,依次递减。 2、赋予各个队列中进程执行时间片的大小,优先级越高的队列,时间片越小。

多级反馈队列调度

课程设计计划设计题目:多级反馈队列进程调度算法的模拟 班级:网络工程一班 组长姓名: 组内成员: 指导教师:王华彬 计划时间:2012年2月

多级反馈队列调度算法,不必事先知道个进程所需的执行时间,而且还可以满足各种类型进程的需求,因而它是目前被公认的一种较好的的进程调度算法。 一.多级反馈队列调度算法实施过程 (1)应设多个就绪队列,并为各个队列赋予不同的优先级。 第一个队列的优先级最高,第二个队列次之,其余队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先级愈高的队列中,为每个进程所规定的执行时间就愈小。 (2)但一个新的进程进入内存后,首先将它放入队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时。如果它在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束尚未完成,调度程序便将该进程转入第二队列的末尾,在同样地按FCFS 原则等待等待调度执行;如果在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业从第一个队列依次降到第n队列,在第n队列中便采用按时间片轮转的方式运行。 (3)仅当第一队列空闲时,调度程序才调度第二队列的进程运行;仅当第1-(i-1)队列均空闲时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服时,又有一个

新的进程进入优先权较高的队列,则此进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回第i队列的末尾,把处理机分配给新到的高优先权进程。 二.算法的实现 (1)编写平台 1. Windows xp 系统 2.MFC软件包 3. Visual C++ 6.0 编译器 (2)具体设计 在我们的“多级反馈队列调度”模拟程序中,用一个进程控制块(PCB)代表一个程序。下面是我们设计的PCB块的结构:typedef struct ProcessNode{ CString ProcessName; //进程名 int time; //要求运行时间 int advantage; //优先数 int state; //状态 struct ProcessNode *next; //指针 }ProcessNode,*ProcessPtr,*ProcessQueue; 由于我们的程序只是用来模拟进程的调度算法,所以用PCB代表一个进程是适合的,并且我们新建的所谓“进程”不做任何事务,仅用FCB中的time减1来表示这个进程的一次调度(或者说

多级反馈队列调度

[操作系统] 多级反馈队列的调度 实验目标 1.理解有关进程控制块,进程队列的概念。 2.掌握进程多级反馈队列的调度的处理逻辑。 3.设计进程控制块PCB的结构,分别适用于多级反馈队列的调度。 4.建立进程就绪队列。 5.编制多级反馈队列的调度算法。 实验要求 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。设计思路 多级反馈队列 多级反馈队列原理 多级反馈队列调度算法又称反馈循环队列或多队列策略,主要思想是将就绪进程分为两级或多级,系统相应建立两个或多个就绪进程队列,较高优先级的队列一般分配给较短的时间片。处理器调度先从高级就绪进程队列中选取可占有处理器的进程,只有在选不到时,才从较低级的就绪进程队列中选取。 具体描叙如下: ①OS设置有多个就绪队列(用qReadyi, i=1,2, ... ,n表示),用于存放等待处理的进程,每个队列的优先权(priority)各不相同,从第一个到最后一个依次降低; ②各个队列中进程执行的时间片大小各不相同,优先级越高的队列时间片越小,各个队列的时间片可按下面的规定:每一个队列时间片都比前一个队列时间片长1倍; ③当一个进程进入内存后,先放入第一队列qReady1末尾,按先来先响应的原则排队等待处理。该进程执行时若在规定的时间片内完成,则处理完毕,可撤离系统,若第一个时间片结束时尚未完成,则该进程转入第二队列qReady2的末尾排队等待处理,依次下去,直至转到最后一个队列中。 ④仅当第i个队列qReadyi为空,才能调度第i+1队列qReady (i+1)中的进程运行。如果第qReadyi队列中某进程正在执行,又有新进程进入第qReady1至qReady(i-1)中任何队列,则此时正在运行的进程放回第i队列末尾,运行新进程。 ●每个进程在输入时,需描述下面的特征:

多级反馈队列调度算法(word文档良心出品)

#in elude #i nclude #in clude #defi ne NULL 0 #defi ne MAL(type) (type *)malloc(sizeof(type)) using n amespace std; typedef struct LNode {char n ame[5]; char state; int run time; int n eedtime; struct LNode *n ext; }LNode; LNode*H; int T,D,J; void prin t() {LNode *p=H; printf("\n进程名需执行时间已执行时间状态\n"); for(i nt i=0;i name,p-> needtime,p->ru ntime,p->state); p=p->n ext; } system("PAUSE"); } void in put() {i nt i; printf("请输入进程数:"); scan f("%d",&J); for(i=0;i name); printf("请输入第%d个进程需要的执行时间:",i+1); sca nf("%d", &q-> needtime); if(q->n eedtime<=0) {printf("所需时间要大于0\n请重新输入\n");i--;}

相关主题
文本预览
相关文档 最新文档