操作系统进程同步实验文档格式.docx
《操作系统进程同步实验文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统进程同步实验文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![操作系统进程同步实验文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/9/266beda4-8004-401d-aedc-b3dd34b4acf9/266beda4-8004-401d-aedc-b3dd34b4acf91.gif)
(1)编写一个进程调度模拟程序,实现以下调度算法:
先来先服务调度,
时间片轮转调度算法,短作业优先调度算法,最高响应比优先调度算法,多级反
馈队列调度算法。
(2)计算平均周转时间和平均带权的周转时间。
(3)先来先服务调度,短作业优先调度算法测试用例。
(4)时间片为4的轮转调度算法的测试用例。
(5)最高响应比优先调度算法的测试用例。
(6)多级反馈队列调度算法的测试用例。
三、实验要求
1.设计进程控制块PCB的结构,通常应包括如下信息:
进程名、进程优先数(或轮转时间片数)、进程已占用的CPU时间、进程
到完成还需要的时间、进程的状态、当前队列指针等。
2.能演示进程调度过程。
3.界面友好。
4.实验报告书写请参考附录
四、设计原理
1.每个进程可有三种状态;
执行状态(RUN)、就绪状态(READY,包括等待状
态)和完成状态(FINISH),并假定初始状态为就绪状态。
2.主程序定义PCB结构和其他有关变量,每个调度算法用一个子程序实现。
3.进程控制块结构参考:
NAME——进程标示符
PRIO/ROUND——进程优先数/进程每次轮转的时间片数(设为常数2)
CPUTIME——进程累计占用CPU的时间片数
NEEDTIME——进程到完成还需要的时间片数
STATE——进程状态3
NEXT——链指针
注:
(1)为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;
(2)各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由
用户在程序运行时给定。
4.进程的就绪态和等待态均为链表结构。
5.在优先数算法中,进程优先数的初值设为:
50-NEEDTIME
每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。
6.在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮
转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪
队列尾,等待下一次调度。
六:
程序清单
#include<
iostream>
stdio.h>
string>
windows.h>
usingnamespacestd;
//hyugtyftydrtdtrdrrtrdrt
structNode
{
stringname;
//进程(作业)名称
intarriveTime;
//到达时间
intServerTime;
//服务时间
intleftTime;
//thelefttime
Node*link;
//指向下一个节点的指针
};
classCProcess
public:
CProcess();
//构造函数
~CProcess();
//析构函数
constCProcess&
operator=(constCProcess&
p);
//重载赋值操作符
voidinsertNode(string&
na,int&
at,int&
st);
//插入新元素(at由小到大)到链表合适的位置
voidsort();
//按照服务时间由大到小排序
boolisEmpty();
//判断是否为空
voiddestroy();
//销毁
intlength();
//求出链表长度
voidprint();
//打印出元素
voidFCFS();
//先到先服务
voidSJF();
//短进程(作业)优先
voidRR(int&
q);
//时间片轮转
voidpriority();
//优先权调度
protected:
Node*first;
Node*last;
constCProcess&
CProcess:
:
operator=(constCProcess&
p)
Node*newNode;
Node*Current;
if(this!
=&
p)//避免自己给自己赋值
{
if(first!
=NULL)//如果链表不为空
destroy();
if(p.first==NULL)
{
//如果要拷贝的对象为空
this->
first=NULL;
last=NULL;
}
else
Current=p.first;
first=newNode;
first->
name=Current->
name;
//
arriveTime=Current->
arriveTime;
ServerTime=Current->
ServerTime;
link=NULL;
last=first;
Current=Current->
link;
while(Current!
=NULL)
{
newNode=newNode;
newNode->
link=NULL;
last->
link=newNode;
last=newNode;
Current=Current->
}
}
return*this;
}
CProcess:
CProcess()
{//构造函数
first=NULL;
last=NULL;
~CProcess()
Node*temp;
while(first!
temp=first;
first=first->
deletetemp;
voidCProcess:
insertNode(string&
st)
{//按照到达时间升序排序
Node*Current;
Node*trailCurrent;
//指向Current的前一个节点
Node*newNode;
boolfound;
newNode=newNode;
//建立一个新节点
newNode->
name=na;
arriveTime=at;
ServerTime=st;
if(first==NULL)//如果第一个节点为空(如果是第一次插入元素)
first=newNode;
//将新节点赋给第一个节点
else
{//如果不是第一次
Current=first;
found=false;
while(Current!
=NULL&
&
!
found)
if(Current->
arriveTime>
=at)
found=true;
trailCurrent=Current;
Current=Current->
if(Current==first)
link=first;
first=newNode;
trailCurrent->
link=newNode;
link=Current;
intCProcess:
length()
intcount=0;
//声明变量,并初始化为0(用来记录长度)
Current=first;
while(Current!
=NULL)//当前节点不为空,记录值自加,一直向后遍历,
count++;
Current=Current->
returncount;
//返回长度
sort()//按照服务时间,升序排列
{//冒泡排序
stringsname;
intat;
intst;
//指向当前节点
//指向当前节点的前一个节点
for(trailCurrent=first->
trailCurrent!
=NULL;
trailCurrent=trailCurrent->
link)//控制条件有问题
for(Current=trailCurrent->
Current!
Current=Current->
if(trailCurrent->
ServerTime>
Current->
ServerTime)
sname=trailCurrent->
at=trailCurrent->
st=trailCurrent->
trailCurrent->
Current->
name=sname;
boolCProcess:
isEmpty()//判断是否为空
return(first==NULL);
//如果第一个节点为空,返回值
print()
Current=first->
//头节点赋给当前节点
=NULL)//当前节点不为空,一直向后遍历打印
cout<
<
name<
"
"
;
arriveTime<
ServerTime<
\n"
destroy()
{
//定义一个临时指针变量
FCFS()