操作系统课程试验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章处理机管理
7.1实验内容
处理机管理是操作系统中非常重要的部分。为深入理解进程管理部分的功能,设计几个调度算法,模拟实现处理机的调度。
7.2实验目的
在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。也就是说能运行的进程数远远大于处理机个数。为了使系统中的各进程能有条不紊地运行,必须选择某种调度策略,以选择一进程占用处理机。要求学生设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。
7.3实验题目
7.3.1设计一个按先来先服务调度的算法
提示
(1)假设系统中有5个进程,每个进程由一个进程控制块(PCB)来标识。进程控制块内容如图7-1所示。
进程名即进程标识。
链接指针:按照进程到达系统的时间将处于就绪状态的进程连接成一个就绪队列。指针指出下一个到达进程的进程控制块首地址。最后一个进程的链指针为NULL。
估计运行时间:可由设计者指定一个时间值。
达到时间:进程创建时的系统时间或由用户指定。调度时,总是选择到达时间最早的进程。
进程状态:为简单起见,这里假定进程有两种状态:就绪和完成。并假定进程一创建就处于就绪状态,用R表示。当一个进程运行结束时,就将其置成完成状态,用C表示。
(2)设置一个队首指针head,用来指出最先进入系统的进程。各就绪进程通过链接指针连在一起。
(3)处理机调度时总是选择队首指针指向的进程投入运行。由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:
估计运行时间减1
用这个操作来模拟进程的一次运行,而且省去进程的现场保护和现场恢复工作。
(4)在所设计的程序中应有显示或打印语句,能显示或打印正运行进程的进程名,已运行是、还剩时间,就绪队列中的进程等。所有进程运行完成是,给出各进程的周转时间和平均周转时间。
先来先服务(FCFS)调度算法
/*源程序1.cpp,采用先来先无法法在Visual C++ 6.0下调试运行*/
/*数据结构定义及符号说明*/
#include
#include
#include
#include
using namespace std;
enum STATUS {RUN,READY,WAIT,FINISH};
struct PCBNode
{
int processID; //进程ID
STATUS status; //进程状态
int reqTime; //总的需要运行时间
int remainTime; //剩下需要运行时间
int arriveTime; //进入就绪队列时间
int startTime; //开始运行时间
int finishTime; //结束运行时间
int totalTime; //周转时间
float weightTotalTime; //带权周转时间
};
struct QueueNode //队列结点结构
{
int ID; //进程ID
struct QueueNode * next; //队列中下一个进程指针
};
struct LinkQueue //队列结构
{
QueueNode *head;//队首
};
void Fcfs(LinkQueue& R, int& totalTimeSum, int& weightTotalTimeSum,PCBNode * ProcessTable);
void InitialQueue(LinkQueue& R,PCBNode * ProcessTable,const int processnum);
//初始化就绪队列R
void Input(PCBNode * ProcessTable, const int processnum);
//从input.txt文件输入数据
int main()
{
LinkQueue R; //就绪队列R
R.head = NULL; //首地址为空
const int processnum =5;//进程数为5
int totalTimeSum = 0; //定义周转时间
int WeightTotalTimeSum = 0;//定义带权周转时间
PCBNode * ProcessTable=new PCBNode[processnum]; //建立进程表
Input(ProcessTable, processnum); //输入进程表,进程数
InitialQueue(R, ProcessTable, processnum); //初始队列
Fcfs(R, totalTimeSum,WeightTotalTimeSum,ProcessTable); //定义为FCFS结构 cout<<"先来先服务的平均周转时间为:"< cout<<"先来先服务的平均带权周转时间为:"< delete [] ProcessTable;//删除进程表 return 0; } void Fcfs(LinkQueue& R, int& totalTimeSum, int& weightTotalTimeSum,PCBNode * ProcessTable)//初始化FCFS { totalTimeSum = 0;//初始化周转时间 weightTotalTimeSum = 0;//初始化平均周转时间 QueueNode* p; QueueNode* q;//队列结点p、q p = R.head->next;//头结点指向下一个结点为p if (p !=NULL ) //设p不为空 { ProcessTable[p->ID].startTime = ProcessTable[p->ID].arriveTime;//进程表p进程开始时间=到达时间 ProcessTable[p->ID].finishTime = ProcessTable[p->ID].arriveTime + ProcessTable[p->ID].reqTime;//进程表p进程结束时间=到达时间 } for(q=p->next; q!=NULL; q=q->next)// for循环 { if (ProcessTable[q->ID].arriveTime < ProcessTable[p->ID].finishTime)//如果进程表q进程到达时间 { ProcessTable[q->ID].startTime = ProcessTable[p->ID].finishTime;//进程表q进程开始时间=p进程结束时间 ProcessTable[q->ID].finishTime = ProcessTable[p->ID].finishTime+ProcessTable[q->ID].reqTime;//进程表q进程结束时间=p 进程结束时间+q进程总需要时间