搜档网
当前位置:搜档网 › 操作系统进程调度算法模拟__MFC实现

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

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

#include "windows.h"

#include "windowsx.h"

#include "tchar.h"

#include "strsafe.h"

#include "resource.h"

#pragma warning(disable:4312)

#pragma warning(disable:4244)

#define EDITLEN 20

#define RR 2 // 时间片

#define chHANDLE_DLGMSG(hWnd, message, fn) \

case (message): return (SetDlgMsgResult(hWnd, uMsg, \

HANDLE_##message((hWnd), (wParam), (lParam), (fn))))

struct ProcInfo {

int procID; // 进程ID

float arriveT; // 达到时间

float serverT; // 服务时间

float remainT; // 剩余运行时间

float lastrunT; // 上次运行时间

float runT; // 运行时间总和

float priority; // 优先级,高响应比优先调度算法时初始为1,其他算法未用到,初始为0

struct ProcInfo *next; // 下一结点

} *startProc,*endProc;

HWND hWnd;

/*

检查6个进程的到达时间和服务时间是否已经全部输入

已经全部输入返回TRUE,否则返回FALSE

*/

bool CheckEdits()

{

wchar_t str[EDITLEN];

for (int i=IDC_A1;i<=IDC_F1;i+=5) {

GetDlgItemText(hWnd,i,str,EDITLEN);

if (lstrcmp(str,_T("\0")) == 0)

return false;

GetDlgItemText(hWnd,i+1,str,EDITLEN);

if (lstrcmp(str,_T("\0")) == 0 )

return false;

}

return true;

}

/*

计算平均周转时间和平均带权周转时间,并显示*/

void ShowEdits()

{

float zzsj=0,pjzz=0;

wchar_t str[10];

for (int i=IDC_A4;i<=IDC_F4;i+=5) {

GetDlgItemText(hWnd,i,str,10);

zzsj += _wtof(str);

GetDlgItemText(hWnd,i+1,str,10);

pjzz += _wtof(str);

}

StringCchPrintf(str,10,_T("%f"),zzsj/6);

SetDlgItemText(hWnd,IDC_TIME1,str);

StringCchPrintf(str,10,_T("%f"),pjzz/6);

SetDlgItemText(hWnd,IDC_TIME2,str);

}

/*

清除所有编辑框的内容

*/

void ClearEdits()

{

for (int i=IDC_A1;i

SetWindowText(GetDlgItem(hWnd,i),_T(""));

}

}

/*

在链表尾部插入node结点

*/

void InsertNode(ProcInfo* node)

{

if (startProc == NULL) {

startProc = endProc = node;

} else {

endProc->next = node;

endProc = node;

if (startProc->next == NULL) {

startProc->next = endProc;

}

}

}

/*

移除链表头结点

*/

void RemoveNode()

{

if (startProc != NULL) {

float finishT;

wchar_t str[10];

ProcInfo *tmp = startProc;

if (startProc->next != NULL) {

startProc = startProc->next;

startProc->lastrunT = tmp->lastrunT+tmp->remainT;

} else {

startProc = endProc = NULL;

}

finishT = tmp->lastrunT+tmp->remainT;

StringCchPrintf(str,10,_T("%f"),finishT);

SetDlgItemText(hWnd,IDC_A3+5*tmp->procID,str);

StringCchPrintf(str,10,_T("%f"),finishT-tmp->arriveT);

SetDlgItemText(hWnd,IDC_A4+5*tmp->procID,str);

StringCchPrintf(str,10,_T("%f"),(finishT-tmp->arriveT)/(float)tmp->serverT);

SetDlgItem i Text(hWnd,IDC_A5+5*tmp->procID,str);

delete tmp;

}

}

/*

当链表头结点被抢占或时间片到时,将头结点移到尾结点

参数:moreT为头结点运行到被抢占或时间片到的时间间隔

*/

void ChangeNode(int moreT)

{

if (startProc != NULL) {

if (startProc->next != NULL) {

ProcInfo *tmp = startProc;

startProc = startProc->next;

tmp->next = NULL;

tmp->runT += moreT;

tmp->remainT -= moreT;

endProc->next = tmp;

endProc = tmp;

startProc->lastrunT = tmp->lastrunT+moreT;

} else {

startProc->lastrunT += moreT;

startProc->runT += moreT;

startProc->remainT -= moreT;

}

}

}

/*

先到先服务调度算法

*/

void AlgoFCFS(int *arrive,int *server)

{

int procNum = 6;

int index = 0;

ProcInfo *node;

startProc = endProc = NULL;

while (procNum) {

if (startProc != NULL) {

// 直接将每个进程插入链表,链表中每个结点按顺序运行

while (index<6) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 0;

node->next = NULL;

index++;

InsertNode(node);

}

RemoveNode();

procNum--;

} else {

if (index<6) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 0;

node->next = NULL;

index++;

InsertNode(node);

} else

break;

}

}

}

/*

短进程优先调度算法

*/

void AlgoSJF(int *arrive,int *server)

{

int procNum = 6;

int index = 0;

float minremainT;

ProcInfo *node,*tmp,*seize,*mid,*tmp2;

startProc = endProc = NULL;

while (procNum) {

if (startProc != NULL) {

tmp = seize = startProc;

minremainT = startProc->remainT;

// 查看链表中是否有剩余运行时间比头结点小的进程,如果有存入最小运行

时间

while ((tmp=tmp->next) != NULL) {

if (tmp->remainT < minremainT) {

minremainT = tmp->remainT;

seize = tmp;

} else if (minremainT < startProc->remainT && tmp->remainT == minremainT) {

if (tmp->arriveT < seize->arriveT)

seize = tmp;

}

}

while (index<6) {

// 查看在头结点被短进程抢占,或运行结束时,是否有新进程到达

if (arrive[index] < (startProc->lastrunT+minremainT)) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 0;

node->next = NULL;

index++;

InsertNode(node);

// 当有新进程到达时,根据剩余运行时间插入到链表中

mid = NULL;

tmp = startProc;

while (tmp->next != endProc) {

if (tmp->next->remainT > endProc->remainT) {

mid = tmp;

break;

}

tmp = tmp->next;

}

if (mid != NULL) {

tmp = startProc->next;

while (tmp->next != NULL) {

if (tmp->next == endProc) {

tmp2 = endProc;

tmp->next = NULL;

endProc = tmp;

tmp2->next = mid->next;

mid->next = tmp2;

break;

}

tmp = tmp->next;

}

}

// 查看刚插入的结点的剩余运行时间是否小于最小剩余时间

if (node->remainT < minremainT) {

minremainT = node->remainT;

seize = node;

} else if (minremainT < startProc->remainT && node->remainT == minremainT) {

if (node->arriveT < seize->arriveT)

seize = node;

}

} else

break;

}

// 当seize仍为头结点时,表示没有比头结点更小的剩余运行时间,故移除头结点

if (seize == startProc) {

RemoveNode();

procNum--;

} else { // 否则,将抢占进程移到头结点之后,并更改结点

tmp = startProc;

while (tmp != NULL) {

if (tmp->next == seize) {

tmp->next = seize->next;

if (seize == endProc)

endProc = tmp;

break;

}

tmp = tmp->next;

}

seize->next = startProc->next;

if (startProc == endProc)

endProc = seize;

startProc->next = seize;

ChangeNode(minremainT);

}

} else {

if (index<6) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 0;

node->next = NULL;

index++;

InsertNode(node);

} else

break;

}

}

}

/*

高响应比优先调度算法

*/

void AlgoHRP(int *arrive,int *server)

{

int procNum=6;

int index=0;

float waitT,minwaitT,waitT2,lastwaitT;

ProcInfo *node,*tmp,*seize,*second;

float prio=0,stmp;

startProc = endProc = NULL;

while(procNum) {

if (startProc != NULL) {

tmp = seize = second = startProc;

minwaitT = startProc->remainT;

// 计算在头结点剩余时间内,是否有进程的优先级超过头结点,如果有,取最先超过头结点的进程为抢占进程

while((tmp=tmp->next) != NULL) {

waitT = (startProc->priority-1)*tmp->serverT+0.1; // 计算超过头结点的最小等待时间

lastwaitT = waitT-(startProc->lastrunT-tmp->arriveT-tmp->runT); // 计算头结点运行期间还需要等待的时间

if (lastwaitT < minwaitT) { // 当小于最小时间时,更新最小时间,优先级,

和抢占进程

minwaitT = lastwaitT;

tmp->priority = waitT/tmp->serverT+1;

seize = tmp;

} else if (minwaitT < startProc->remainT && lastwaitT == minwaitT) { // 当等于最小时间时,服务时间越小,优先级越高

if (tmp->serverT < seize->serverT) {

tmp->priority = waitT/tmp->serverT+1;

seize = tmp;

} else if (tmp->serverT == seize->serverT) { // 当等于最小时间,服务时间也相同时,先到达者优先

if (tmp->arriveT < seize->arriveT) {

tmp->priority = waitT/tmp->serverT+1;

seize = tmp;

}

}

} else {

if (minwaitT == startProc->remainT) { // 当头结点剩余时间内,没有进程的优先级抢占时,计算优先级第二高的进程

waitT2 = startProc->lastrunT-tmp->arriveT-tmp->runT+startProc->remainT;

stmp = waitT2/tmp->serverT+1;

if (stmp>prio) {

tmp->priority = prio = stmp;

second = tmp;

}

}

}

}

while (index<6) { // 查看在头结点的剩余时间内,或被抢占的时间间隔内,是否有进程到达

if (arrive[index] < (startProc->lastrunT+minwaitT)) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 1;

node->next = NULL;

index++;

InsertNode(node);

// 查看在该进程到达,到头结点运行结束,或被抢占前,优先级是否能超过头结点

waitT = (startProc->priority-1)*node->serverT+0.1;

lastwaitT = waitT+(node->arriveT-startProc->lastrunT);

if (lastwaitT < minwaitT) {

minwaitT = lastwaitT;

node->priority = waitT/node->serverT+1;

seize = node;

} else if (minwaitT < startProc->remainT && lastwaitT == minwaitT) {

if (node->serverT < seize->serverT) {

node->priority = waitT/node->serverT+1;

seize = node;

} else if (node->serverT == seize->serverT) {

if (node->arriveT < seize->arriveT) {

node->priority = waitT/node->serverT+1;

seize = node;

}

}

} else {

if (minwaitT == startProc->remainT) {

waitT2 = startProc->remainT-(node->arriveT-startProc->lastrunT);

stmp = waitT2/node->serverT+1;

if (stmp > prio) {

node->priority = prio = stmp;

second = node;

}

}

}

} else

break;

}

// 当计算的抢占结点仍为头结点时,表示没有抢占的进程,故将第二高优先级的进程移到头结点之后,并移除头结点

if (seize == startProc) {

if (second != startProc) {

tmp = startProc;

while (tmp != NULL) {

if (tmp->next == second) {

tmp->next = second->next;

if (second == endProc)

endProc = tmp;

break;

}

tmp = tmp->next;

}

second->next = startProc->next;

if (startProc == endProc)

endProc = second;

startProc->next = second;

}

RemoveNode();

procNum--;

} else { // 当计算的抢占结点不为头结点时,表示存在能够抢占的进程,故将该抢占进程移到头结点之后,并更改结点

tmp = startProc;

while (tmp != NULL) {

if (tmp->next == seize) {

tmp->next = seize->next;

if (seize == endProc)

endProc = tmp;

break;

}

tmp = tmp->next;

}

seize->next = startProc->next;

if (startProc == endProc)

endProc = seize;

startProc->next = seize;

ChangeNode(minwaitT);

}

} else {

if (index<6) {

node = new ProcInfo;

node->procID = index;

node->arriveT = arrive[index];

node->serverT = server[index];

node->remainT = server[index];

node->lastrunT = arrive[index];

node->runT = 0;

node->priority = 1;

node->next = NULL;

index++;

InsertNode(node);

} else

break;

}

}

}

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

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

福建农林大学计算机与信息学院 课程设计报告 课程名称:操作系统 实习题目:进程调度算法模拟 姓名: 系:计算机科学与技术系 专业:计算机科学与技术 年级: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,并规定优先数越大的进程,其优先权越高。

时间片轮转进程调度模拟算法的实现

武汉理工大学华夏学院课程设计报告书 课程名称:操作系统原理 题目:时间片轮转进程调度模拟算法的实现系名:信息工程系 专业班级:计算机1132班 姓名:李杰 学号: 10210413209 指导教师: 司晓梅 2015年 6 月 26日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:操作系统原理课程设计指导教师:司晓梅 班级名称:计算机1131-2 开课系、教研室:自动化与计算机 一、课程设计目的与任务 操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练, 加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、 Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题 和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。 学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。 二、课程设计的内容与基本要求 1、课程设计题目 时间片轮转进程调度模拟算法的实现 2、课程设计内容 用c/c++语言实现时间片轮转的进程调度模拟算法。要求: 1.至少要有5个以上进程 2.进程被调度占有CPU后,打印出该进程正在运行的相关信息 提示: 时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。 1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。 2)为进程设计出PCB结构。PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息等。 3、设计报告撰写格式要求: 1设计题目与要求 2 设计思想 3系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明 6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)

实验一 模拟实现进程调度算法

实验一模拟实现进程调度算法(4学时) ①、实验目的 a、进程调度是处理机管理的核心内容。观察、体会操作系统的进程调度方法,并通过一个简单的进程调度模拟程序的实现,加深对进程控制块、进程队列、进程调度算法,进程切换的理解,并体会和了解各种调度算法的具体实施办法。 b、提高实际动手编程能力,为日后从事软件开发工作打下坚实基础。 ②、实验内容 a、设计进程控制块PCB表结构,模拟实现进程调度算法:FIFO,静态优先级调度,时间片轮转调度,短进程优先调度算法,多级反馈队列调度。(实现静态优先级调度算法、短进程优先调度算法)。 b、编写一个进程调度程序模拟程序。模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 c、由用户输入(可通过文件输入)进程名、进程状态、进程运行时间和进程优先级等数据。 ③、实验要求 a、使用模块化设计思想来设计。 b、给出主函数和各个算法函数的流程图。 c、学生可按照自身条件,随意选择采用的算法,(例如:采用冒泡法编写程序,实现短进程优先调度的算法)。 d、进程调度程序模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。 ④、运行结果 a、给出进程的调度模拟操作排序结果。 ⑤、提示 a、每个进程可有三个状态,并假设初始状态为就绪状态。 b、为了便于处理,程序中的进程运行时间以纳秒为单位计算。 C、各进程的优先级或轮转时间数以及进程需运行的纳秒数的初始值均由用户给定。 d、在优先级算法中,采用静态优先级。在时间片轮转算法中,采用可变时间片,由用户给定。 e、对于遇到优先级一致的情况,采用FIFO策略解决。

f、输入:进程流文件(文本文件),其中存储的是一系列要执行的进程,每个进程包括四个数据项:进程名进程状态(1就绪2等待3运行) 所需时间优先级(0级最高)。 g、输出:进程执行流等待时间平均等待时间。 ⑥、分析与讨论 a、各种进程调度算法的异同? b、如何理解“算法+数据结构=程序设计”? c、如何理解“数据结构始终是为实现功能服务的”? ⑦、参考代码 参看:附录A1 考核方法: 1、实验报告占50%,程序设计30%,出勤占20%; 3、每次实验100分,2次实验的平均分为最终实验成绩。 注:无出勤只交实验报告者,以实验报告成绩×50%为最后成绩。 打游戏者发现一次本次实验扣10分。 早退者本次实验扣10分。 点名时未到者,后来补签到按照迟到时间长短扣分,点名后即来扣5分,1节课过后才来扣10分。

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

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

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

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

进程调度算法的模拟实现

操作系统课程设计报告题目:进程调度算法的模拟实现_ 专业计算机科学与技术 学生姓名 班级 学号 指导教师 发放日期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)算法 优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。

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

使用动态优先权的进程调度算法的模拟实验 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

进程调度算法实验报告

实验报告 实验一:进程调度算法 一、实验目的 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() ,这三个函数分别实现先来先服务算法,时间片轮转算法和优先级算法,最后分别打印。 程序流程图:

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

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

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

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

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

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

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

进程调度模拟实验

进程调度模拟实验

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)//若剩余时间大于时间片

进程调度算法模拟程序设计C++

(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)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。 (5)分析程序运行的结果,谈一下自己的认识。 实验代码 #include "iostream.h" #include "windows.h" //#define N 3 typedef struct{ int ID; int PRIORITY; int CPUTIME;

int ALLTIME; int STARTBLOCK; int BLOCKTIME; int STATE;//0-运行1-阻塞2-就绪3-结束4-未到达 int REACH; int TIME; }PROCESS; void textcolor (int color) { SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), color ); } void main(){ int i,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0; PROCESS pro[10]; textcolor(13); cout<<"注意:本程序中状态代表如下"<>N; cout<<"请设置时间片长度:"; cin>>time; cout<<"请输入各进程初始状态:"<>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;

进程调度模拟实验说明书

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

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

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

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

实验四 进程调度模拟实现

计算机操作系统综合设计 实验四 实验名称:进程调度模拟实现 实验类型:设计型实验 实验环境: Visual C++ 6.0 指导老师:陈立伟 专业班级: 姓名: 学号: 联系电话: 实验地点:东六E座4-02 实验日期: 2014年12月7日 实验报告日期: 2014年12月 7日 成绩:__________________________

一、实验目的 1)理解进程调度相关理论。 2)掌握FCFS进程调度方法。 二、实验平台 windows 7 Visual C++ 6.0 三、实验步骤 1、实验内容 1)设计可用于该实验的进程控制块,进程控制块至少包括进程号、到达时间和要求服务时间; 2)动态或静态创建多个(≥10)进程; 3)实现FCFS或其他调度算法; 4)可动态修改进程到达时间; 5)调度所创建的进程并显示调度结果。 2、实验步骤 1)输入给定的实验指导书中提供的代码 A、打开Visual C++ 6.0; B、新建c++文件,创建FCFS.cpp; 2)进行功能测试并得出正确结果 A、编译、运行FCFS.cpp; 输入8,即是8个进程数。 输入8个进程号,以及到达时间和所需时间。

得到执行结果: 进程执行的先后顺序; 进程开始执行的时间; 输入y:要修改输入修改项,再次得到结果;

四、实验总结 因为FCFS是先来先服务的算法,我们是依据它的进程到达的时间来规定进程的执行顺序的,所以还要对输入的进程,按照它的进程到达时间来排序,并按照这个顺序执行进程,输入的有进程号,进程到达时间,进程执行时间,所以我们定义了一个结构体,里面包含了以上三个内容,并且定义两个全局变量:int time = 0; char flag = 'y'; 来计算总的时间还有标识是否结束程序,初始化为0和标识程序不结束的标识y。因为进程号不应该相同,所以我们不应该在输入的时候还要做一个判断遍历前面已经输入的进程,若当前输入的进程号已经存在那么提示并重新输入,不存在则顺序执行。当要修改程序到达的时间,我们要修改的必须是一个存在的,所以在做修改的输入判断的时候,就是遍历所有的进程,当输入的进程号存在的时候才做出相应动作,如果不存在那么输出提示并询问是否继续修改。

模拟一种处理机调度算法

课程设计报告 设计名称:模拟实现一种处理机调度算法 学生姓名: xxx 专业:计算机科学与技术 班别: xxxxxxxx 学号: xxxxxx 指导老师: xxxxx 日期: 2014 年 6 月 20 日

初始条件: 1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.模拟进程调度,能够处理以下的情形: ⑴能够选择不同的调度算法(要求中给出的调度算法); ⑵能够输入进程的基本信息,如进程名、优先级、到达 时间和运行时间等; ⑶根据选择的调度算法显示进程调度队列; ⑷根据选择的调度算法计算平均周转时间和平均带权周 转时间。 2.设计报告内容应说明: ⑴需求分析; ⑵功能设计(数据结构及模块说明); ⑶开发平台及源程序的主要部分; ⑷测试用例,运行结果与运行情况分析; ⑸自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出 色; ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中 的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方 法); 进程调度模拟设计——先来先服务、优先级法1、背景: 当计算机系统是多道程序设计系统时,通常会有多个进程或线程同时竞争CPU。只要有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序,该程序使用的算法成为调度算法。 进程调度的核心问题是采用什么样的算法把处理机分配给进程,好的算法将提高资源利用率,减少处理机的空闲时间,避免有些作业长期得不到相应的情况发生等,从而设计出受欢迎的操作系统。较常见的几种进程调度算法有:先来先服务调度算法;短作业优先调度算法;时间片轮转调度算法;优先级调度算法;高响应比优先算法和多级反馈队列调度算法等。 2.1设计目的 无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机

进程调度模拟实验(四种)

进程调度模拟实验 1.实验目的 通过对进程调度算法的模拟加深对进程概念和进程调度过程的理解。 2.实验内容 用C语言、Pascal语言或其他开发工具实现对N(N=5)个进程的调度模拟,要求至少采用两种不同的调度算法(如简单轮转法Round Robin和优先权高者优先算法Highest Priority First),分别进行模拟调度。 每个用来标识进程的进程控制块PCB用结构(记录)来描述,根据需要,它包括以下字段: 进程标识数ID。 进程优先数Priority,并规定优先数越大的进程,其优先权越高。采用简单轮转法时该字段无用。 进程已经占用的CPU时间CPUTIME(以时间片为单位,下同)。 进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。 进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。 进程被阻塞的时间BLOCKTIME,表示已经阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。 进程状态STATE。 队列指针NEXT,用来将PCB排成队列。 优先数改变的原则(采用简单轮转法时该字段无用): 进程在就绪队列中等待一个时间片,优先数增加1; 进程每运行一个时间片,优先数减3。 假设在进行调度前,系统中有5个进程,它们的初始状态可以编程输入(更具有灵活性),也可以初始化为如下内容: ID PRIORITY CPUTIME ALLTIME STARTBLOCK BLOCKTIME STATE 0 9 0 3 2 3 READY 1 38 0 3 -1 0 READY 2 30 0 6 -1 0 READY 3 29 0 3 -1 0 READY 4 0 0 4 -1 0 READY 为了清楚地观察诸进程的调度过程,程序应该将每个时间片内各进程的情况显示出来并暂停,参考格式如下: 运行/Running:I 就绪队列/Ready Queue:Idi,Idj,… 阻塞队列/Block Queue:Idk,Idl,… ====================================================================== 进程号优先数已运行时间需要时间开始阻塞时间阻塞时间状态 0 P0 C0 A0 T0 B0 S0 1 P1 C1 A1 T1 B1 S1 2 P2 C2 A2 T2 B2 S2 3 P3 C3 A3 T3 B3 S3 4 P4 C4 A4 T4 B4 S4 ======================================================================

进程调度模拟实现

盛年不重来,一日难再晨。及时宜自勉,岁月不待人。 操作系统课程设计报告题目:进程调度算法的模拟实现 专业计算机科学与技术 学生姓名刘远强 班级计算机131 学号1310704109 指导教师韩立毛 完成日期2015.7.10 信息工程学院

目录 1 概述 (3) 1.1 设计目的 (3) 1.2 设计要求 (3) 2 设计原理 (3) 2.1 先来先服务算法 (3) 2.2 短进程优先算法 (3) 2.3高优先权优先算法 (3) 2.4高响应比优先算法 (3) 3 概要设计 (4) 3.1 功能结构 (4) 4 详细设计 (4) 4.1 用户界面模块设计 (4) 4.2 算法模块设计 (5) 5 测试与分析 (12) 5.1 测试方案 (12) 5.2 测试结果 (12) 5.3 结果分析 (14) 6 设计小结 (15) 7 参考文献 (15) 附录源程序代码 (15)

题目:进程调度算法的模拟实现 1 概述 1.1 设计目的 在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个,也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机调度的概念。 1.2设计要求 a)至少有四种作业调度算法; b)能根据不同的调度算法算出每个作业的周转时间和带权周转时间,并通过一组作业算出系统的平均周转时间和平均带权周转时间,比较各种算法的优缺点; c)设计一个实用的用户界面,以便选择不同的作业调度算法。 2 设计原理 2.1 先来先服务算法 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列。 2.2 短进程优先算法 短进程优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。 2.3高优先权优先算法 a)当该算法用于作业调度时,系统从后备作业队列中选择若干个优先级最高的,且系统能满足资源要求的作业装入内存运行。 b)当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。 2.4高响应比优先算法 高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。

相关主题