java模拟操作系统进程调优先级调度.docx
- 文档编号:10956431
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:19
- 大小:18.60KB
java模拟操作系统进程调优先级调度.docx
《java模拟操作系统进程调优先级调度.docx》由会员分享,可在线阅读,更多相关《java模拟操作系统进程调优先级调度.docx(19页珍藏版)》请在冰豆网上搜索。
java模拟操作系统进程调优先级调度
//进程块
/**
*
*①设计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的基本信息的构造方法
*
*@paramid
*@parampriority
*@paramcpuTime
*@paramallTime
*@paramstate
*/
publicPCB(intid,intpriority,intcpuTime,intallTime,intstate){
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 this.priority-=3; } return; } publicintgetCpuTime(){ returncpuTime; } publicvoidsetCpuTime(intcpuTime){ this.cpuTime=cpuTime; } /** *根据要求修改CPU时间 */ publicvoidmodifyCpuTime(){ this.cpuTime+=1; } publicintgetAllTime(){ returnallTime; } publicvoidsetAllTime(intallTime){ this.allTime=allTime; } /** *根据要求修改PCB占用的时间片 */ publicvoidmodifyAllTime(){ if(0 this.allTime-=1; } return; } publicintgetState(){ returnstate; } publicvoidsetState(intstate){ this.state=state; } /** *根据要求修改PCB的状态 */ publicvoidmidifyState(){ } /** *打印显示当前PCB的全部信息 */ publicvoidshowStatus(){ System.out.println("PCB[id="+id+",priority="+priority +",cpuTime="+cpuTime+",allTime="+allTime+",state=" +state+"]"); } /** *修改PCB的全部信息 */ publicvoidmodify(){ if(0 this.allTime-=1; } this.cpuTime+=1; if(0 this.priority-=3; } } } //采用链表存储 /** *创建PCB的数据结构 * *@author摆渡恋人* */ publicclassLineListNode privateLineListNode privateTelement; /** *创建空链表 */ publicLineListNode(){ this.node=null; this.element=null; } /** *创建一个存储特定元素的线性表 */ publicLineListNode(Telement){ this.node=null; this.element=element; } /** *返回当前结点点的下一个节点 */ publicLineListNode returnthis.node; } /** *设置当前结点的下一个结点 */ publicvoidsetNextNode(LineListNode this.node=node; } /** *返回当前结点存储的数据元素 */ 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.size=llp.getSize(); 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--; } /** *向PCB线性表中的添加数据元素 * *@paramelement */ publicvoidaddElement(PCBelement){ LineListNode if(this.headPcb==null){ /** *头结点为空,表示链表中当前没有数据元素,说明头结点和尾结点指向同一内存空间 */ this.headPcb=newElement; /** *新添加一个数据元素则仍然指向同一内存空间 */ this.lastPcb=this.headPcb; }else{ /** *链表不为空,在这里要保证最后一个结点与新加入的结点连接在一起 */ this.lastPcb.setNextNode(newElement); this.lastPcb=newElement; } this.size++; } /** *从PCB线性表中的头部移除数据元素,并将其添加到PCB线性表中的尾部 */ publicvoidremoveFromHeadAddToLast(){ if(this.size<=1){ return; } LineListNode this.headPcb=tempNode.getNextNode(); this.lastPcb.setNextNode(tempNode); this.lastPcb=tempNode; } /** *从PCB线性表中中的尾部移除数据元素,并将其添加到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 intcurrentPrority=((xiao.zhang.osa.PCB)headNode.getElement()) .getPriority(); LineListNode intnextPrority=((xiao.zhang.osa.PCB)nextNode.getElement()) .getPriority(); if(currentPrority>nextPrority){ return; }else{ this.headPcb=nextNode; } for(inti=2;i LineListNode 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 returnthis.headPcb; } /** *@returnthelastPcb */ publicLineListNode returnthis.lastPcb; } /** * *@returnPCB */ publicPCBgetPCB(){ returnthis.headPcb.getElement(); } /** *@paramheadPcb *theheadPcbtoset */ publicvoidsetHeadPcb(LineListNode this.headPcb=headPcb; } /** *@returnthesize */ publicintgetSize(){ returnthis.size; } /** *@paramsize *thesizetoset */ publicvoidsetSize(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("^**********************"+"进程" +pcb.getId()+"获得执行,并且移除就绪队列" +"^**********************"); System.out.println(); llp.removeElement(); } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 模拟 操作系统 进程 优先级 调度