模拟操作系统进程优先级调度.docx
- 文档编号:5531214
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:13
- 大小:18.52KB
模拟操作系统进程优先级调度.docx
《模拟操作系统进程优先级调度.docx》由会员分享,可在线阅读,更多相关《模拟操作系统进程优先级调度.docx(13页珍藏版)》请在冰豆网上搜索。
模拟操作系统进程优先级调度
//进程块
*①设计PCB及其数据结构:
进程标识数:
ID进程优先数:
PRIORITY(优先数越大,优先级越高)
*进程已占用时间片:
CPUTIME,每得到一次调度,值加1;
*进程还需占用时间片:
ALLTIME,每得到一次调度,该值减1,
一旦运行完毕,ALLTIME为0)进程队列指针:
NEXT,用来将PCB排成队列
*进程状态:
STATE(一般为就绪,可以不用)②设计进程就绪队列及数据结构;③设计进程调度算法,并画出程序流程图;④设计输入数据和输出格式;
*结构格式:
当前正运行的进程:
0当前就绪队列:
2,1,3,4⑤
编程上机,验证结果
*
*
*/
publicclassPCB{
privateintid;
privateintpriority;
privateintcpuTime;
privateintallTime;
privateintstate;//状态为1的时候表示准备就绪/**
*无参数的构造方法,通过geter,seter器来对PCB的信息进行获
取的修改
*/publicPCB(){
}
/**
初始化PCB的基本信息的构造方法
*@param
id
*@param
priority
*@param
cpuTime
*@param
allTime
*@param
state
*/
publicPCB(int
id,intpriority,intcpuTime,intallTime,int
state){
super();
this.id=id;
this.priority=priority;
this.cpuTime=
cpuTime;
this.allTime=allTime;this.state=state;
}publicintgetId(){returnid;
}publicvoidsetId(intid){this.id=id;
}publicintgetPriority(){returnpriority;
}
publicvoidsetPriority(intpriority){this.priority=priority;
}/**
*根据要求来修改PCB的优先级*/
publicvoidmodifyPriority(){if(0 returnpublicintgetCpuTime(){returncpuTime; publicvoidsetCpuTime(intcpuTime){this.cpuTime=cpuTime; /** *根据要求修改CPU时间 */publicvoidmodifyCpuTime(){this.cpuTime+=1; publicintgetAllTime(){returnallTime; publicvoidsetAllTime(intallTime){this.allTime=allTime; /** *根据要求修改PCB占用的时间片 */publicvoidmodifyAllTime(){if(0 } return; } publicintgetState(){returnstate; } publicvoidsetState(intstate){this.state=state; } /** *根据要求修改PCB的状态*/ publicvoidmidifyState(){ } /** *打印显示当前PCB的全部信息 */publicvoidshowStatus(){ System.out.println("PCB[id="+id+",priority=" priority allTime +",cpuTime="+cpuTime+",allTime=",state=" /** +state+"]"); *修改PCB的全部信息 */ publicvoidmodify(){ if(0 this.allTime-=1; } this.cpuTime+=1; if(0 this.priority-=3; } } } //采用链表存储 创建PCB的数据结构 *@author摆渡恋人 */publicclassLineListNode 创建空链表 */publicLineListNode(){ this.node=null; this.element=null; } /** *创建一个存储特定元素的线性表 */publicLineListNode(Telement){this.node=null; this.element=element; } 返回当前结点点的下一个节点 */publicLineListNode } 设置当前结点的下一个结点 */publicvoidsetNextNode(LineListNode } /** *返回当前结点存储的数据元素 */publicTgetElement(){returnthis.element; } /** *设置当前结点存储的数据元素*/ publicvoidsetElement(Telement){this.element=element; packagexiao.zhang.backup; importxiao.zhang.osa.LineListNode; /** *创建一个存储PCB用来线性链表,通过线性链表的相关操作来实 现相应的功能 *@authorXiaoZhang */publicclassLineListPcb *表示PCB线性表的长度 */privateintsize; /** *表示PCB线性表的头元素结点 */privateLineListNode /** *表示PCB线性表尾元素结点 privateLineListNode /** 创建一个空的PCB线性存储链表 */publicLineListPcb(){ this.size=0; this.headPcb=null; this.lastPcb=this.headPcb; } /** 创建一个具有特定元素的PCB线性存储链表 */publicLineListPcb(LineListPcb this.headPcb=llp.getHeadPcb(); this.lastPcb=llp.getLastPcb(); } /** *从PCB线性表中的头部移除数据元素 @paramelement publicvoidremoveElement(){if(0==this.size){ return; } /** *这一段主要是为了处理移除数据元素后只剩下一个数据元素的时候的线性链表处理 */ if(this.size==1){ //this.headPcb.setNextNode(this.lastPcb); //this.lastPcb=this.headPcb; //this.lastPcb.setNextNode(null); this.headPcb=null; this.size--; return; } LineListNode this.headPcb=tempNode.getNextNode();tempNode=null; this.size--; /** *@paramelement */publicvoidaddElement(PCBelement){ LineListNode LineListNode if(this.headPcb==null){/** *头结点为空,表示链表中当前没有数据元素,说明头结 点和尾结点指向同一内存空间 */ this.headPcb=newElement; /** *新添加一个数据元素则仍然指向同一内存空间 */ this.lastPcb=this.headPcb; }else{ /** *链表不为空,在这里要保证最后一个结点与新加入的结 点连接在一起 PCB线性 PCB的 this.lastPcb.setNextNode(newElement); this.lastPcb=newElement; } this.size++; } *从PCB线性表中的头部移除数据元素,并将其添加到 表中的尾部 */ publicvoidremoveFromHeadAddToLast(){ if(this.size<=1){return; } LineListNode this.lastPcb.setNextNode(tempNode); this.lastPcb=tempNode; } /** *从PCB线性表中中的尾部移除数据元素,并将其添加到线性表中的头部 publicvoidremoveFromLastAddToHead(){if(0==this.size){return; } LineListNode 设置尾结点的以一个结点为空 */ LineListNode *@i=1表示指向PCB线性表的元素为线性表的第一个元素 *@i=this.size-1表示指向线性表的元素为线性表的末尾第 二个数据元素 */ for(inti=1;i lastSecondNode=lastSecondNode.getNextNode(); }lastSecondNode.setNextNode(null); /** *设置PCB线性表尾结点的下一个结点为头结点的下一个结点,头结点为为尾结点 tempNode.setNextNode(this.headPcb.getNextNode()); this.headPcb=tempNode; /** *@从PCB线性表中的头部移除数据元素 *并根据线性表中的数据元素的优先级从高到低的顺序将头数 据元素放置在合适的位置 *//** *@基本思想是: *1.通过获得头数据元素,并且得到其优先级 *2.获得链表的下一个数据元素tempNode,并得到其优先级 * *3.通过比较头数据元素的优先级priority和通过线性表获得的数据元素的优先级tempPrority的比较 * *3.1如果大于等于则将头数据元素插入在当前(tempNode)的数据元素的后面 *3.2如果小于则继续2-3步 */ publicvoidinsertPCBByPrority(){ if(this.size==1){ return; } LineListNode .getPriority(); LineListNode intnextPrority=((xiao.zhang.osa.PCB)nextNode.getElement()) .getPriority(); if(currentPrority>nextPrority){ return; }else{ this.headPcb=nextNode; } for(inti=2;i nextNode.getNextNode(); intnextNextPrority=((xiao.zhang.osa.PCB)nextNextNode .getElement()).getPriority(); if(currentPrority &¤tPrority>nextNextPrority){nextNode.setNextNode(headNode);headNode.setNextNode(nextNextNode);return; } nextNode=nextNextNode; //nextNode.setNextNode(nextNextNode); nextPrority=nextNextPrority; } this.lastPcb.setNextNode(headNode);headNode.setNextNode(null); this.lastPcb=headNode; }/** *判断PCB线性表是否为空 */ publicbooleanisEmpty(){returnthis.size==0; /** *@returntheheadPcb */publicLineListNode } /** *@returnthelastPcb */publicLineListNode } *@returnPCB */ publicPCBgetPCB(){ returnthis.headPcb.getElement(); } @paramheadPcb theheadPcbtoset */publicvoidsetHeadPcb(LineListNode /** *@returnthesize */ publicintgetSize(){returnthis.size; } /** *@paramsize *thesizetoset */ publicvoid setSize(intsize){ this.size= size; } } 主方法: publicclassPCBProcess{ 进入 *@paramp *@paramllp */ privatestaticvoidcomeLineList(PCB[]p,LineListPcb for(inti=0;i intminIndex=i; for(intj=i+1;j if(p[minIndex].getPriority() /** *在这里也可以直接对PCB线性链表添加数据元素 */ minIndex=j; break; } } if(minIndex! =i){ PCBtemp=p[minIndex]; p[minIndex]=p[i]; p[i]=temp; } /** *向PCB线性表中添加数据元素 */ llp.addElement(p[i]); } } publicstaticvoidmain(String[]args){ PCB[]p={newPCB(0,9,0,3,1),newPCB(1,38,0,2,1),newPCB(2,30,0,6,1),newPCB(3,29,0,3,1),newPCB(4,0,0,4,1)}; /** *进行优先级的调度算法 */ LineListPcb comeLineList(p,llp); /** *业务处理流程 */ while(true){ if(llp.getSize()==0){break; } LineListNode PCBpcb=lln.getElement(); System.out.print("进程占有时间片前状态"+pcb.getId()); pcb.showStatus(); pcb.modify(); System.out.print("进程占有时间片后状态"+pcb.getId()); pcb.showStatus(); if(0! =pcb.getAllTime()){ System.out.println();llp.insertPCBByPrority(); }else{ System.out.println(); System.out.println( “八**********************" I! 程" +pcb.getId()+"获得执行,并且移除就绪队列 +"八**********************" System.out.println(); llp.removeElement(); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 操作系统 进程 优先级 调度