您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 操作系统进程同步实验
石家庄铁道大学实验报告课程名称操作系统(B)专业数字媒体技术学生姓名王赛赛班级信1406学号20142988任课教师沙金完成日期2015年112月1日信息科学与技术学院1实验二进程同步一、实验目的处理机调度是处理机管理的核心内容。本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解进程调度算法的具体实施办法。二、实验内容(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——进程状态3NEXT——链指针注:(1)为了便于处理,程序中进程的的运行时间以时间片为单位进行计算;(2)各进程的优先数或轮转时间片数,以及进程运行时间片数的初值,均由用户在程序运行时给定。4.进程的就绪态和等待态均为链表结构。5.在优先数算法中,进程优先数的初值设为:50-NEEDTIME每执行一次,优先数减1,CPU时间片数加1,进程还需要的时间片数减1。6.在轮转法中,采用固定时间片单位(两个时间片为一个单位),进程每轮转一次,CPU时间片数加2,进程还需要的时间片数减2,并退出CPU,排到就绪队列尾,等待下一次调度。六:程序清单#includeiostream#includestdio.h#includestring#includewindows.husingnamespacestd;//hyugtyftydrtdtrdrrtrdrtstructNode{stringname;//进程(作业)名称intarriveTime;//到达时间intServerTime;//服务时间intleftTime;//thelefttimeNode*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;this-last=NULL;}else{Current=p.first;first=newNode;first-name=Current-name;//first-arriveTime=Current-arriveTime;first-ServerTime=Current-ServerTime;first-link=NULL;last=first;Current=Current-link;while(Current!=NULL){newNode=newNode;newNode-name=Current-name;newNode-arriveTime=Current-arriveTime;newNode-ServerTime=Current-ServerTime;newNode-link=NULL;last-link=newNode;last=newNode;Current=Current-link;}}}return*this;}CProcess::CProcess(){//构造函数first=NULL;last=NULL;}CProcess::~CProcess(){Node*temp;while(first!=NULL){temp=first;first=first-link;deletetemp;}last=NULL;}voidCProcess::insertNode(string&na,int&at,int&st){//按照到达时间升序排序Node*Current;Node*trailCurrent;//指向Current的前一个节点Node*newNode;boolfound;newNode=newNode;//建立一个新节点newNode-name=na;newNode-arriveTime=at;newNode-ServerTime=st;newNode-link=NULL;//if(first==NULL)//如果第一个节点为空(如果是第一次插入元素)first=newNode;//将新节点赋给第一个节点else{//如果不是第一次Current=first;found=false;while(Current!=NULL&&!found){if(Current-arriveTime=at)found=true;else{trailCurrent=Current;Current=Current-link;}}if(Current==first){newNode-link=first;first=newNode;}else{trailCurrent-link=newNode;newNode-link=Current;}}}intCProcess::length(){intcount=0;//声明变量,并初始化为0(用来记录长度)Node*Current;Current=first;while(Current!=NULL)//当前节点不为空,记录值自加,一直向后遍历,{count++;Current=Current-link;}returncount;//返回长度}voidCProcess::sort()//按照服务时间,升序排列{//冒泡排序stringsname;intat;intst;Node*Current;//指向当前节点Node*trailCurrent;//指向当前节点的前一个节点for(trailCurrent=first-link;trailCurrent!=NULL;trailCurrent=trailCurrent-link)//控制条件有问题{for(Current=trailCurrent-link;Current!=NULL;Current=Current-link)//控制条件有问题{if(trailCurrent-ServerTimeCurrent-ServerTime){sname=trailCurrent-name;at=trailCurrent-arriveTime;st=trailCurrent-ServerTime;trailCurrent-name=Current-name;trailCurrent-arriveTime=Current-arriveTime;trailCurrent-ServerTime=Current-ServerTime;Current-name=sname;Current-arriveTime=at;Current-ServerTime=st;}}}}boolCProcess::isEmpty()//判断是否为空{return(first==NULL);//如果第一个节点为空,返回值}voidCProcess::print(){Node*Current;Current=first-link;//头节点赋给当前节点while(Current!=NULL)//当前节点不为空,一直向后遍历打印{coutCurrent-name;coutCurrent-arriveTime;coutCurrent-ServerTime\n;Current=Current-link;}}voidCProcess::destroy(){Node*temp;//定义一个临时指针变量while(first!=NULL){temp=first;first=first-link;deletetemp;}last=NULL;}voidCProcess::FCFS()//先到先服务{Node*Current;intT0=0;//完成时间intT1=0;//周转时间Current=first-link;//头节点赋给当前节点while(Current!=NULL){if(T0Current-arriveTime){T0=Current-arriveTime+Current-ServerTime;T1=T0-Current-arriveTime;coutCurrent-name\t;//打印出进程名coutT0\t;//打印出完成时间coutT1\n;//打印出周转时间Current=Current-link;}else{T0=Current-ServerTime+T0;T1=T0-Current-arriveTime;//周转时间等于,完成时间-到达时间coutCurrent-name\t;//打印出进程名coutT0\t;//打印出完成时间coutT1\n;//打印出周转时间Current=Current-link;}}}voidCProcess::SJF()//短进程(作业)优先{//首先执行第一个到达的作业Node*Current;intT0=0;//完成时间intT1=0;//周转时间T0=first-link-ServerTime+T0;T1=T0-first-link-arriveTime;coutfirst-link-name\t;coutT0\t;//打印出完成时间coutT1\n;//打印出周转时间first-link=first-link-link;//删除//执行剩下的sort();//对剩下的排序Current=first-link;//头节点赋给当前节点while(Current!=NULL){if(T0Current-arriveTime){T0=Current-arriveTime+Curren
本文标题:操作系统进程同步实验
链接地址:https://www.777doc.com/doc-4988310 .html