this.priority-=3;
}
}
}
//采用链表存储
/**
*创建PCB的数据结构
*
*@author摆渡恋人*
*/
publicclassLineListNode{
privateLineListNodenode;
privateTelement;
/**
*创建空链表
*/
publicLineListNode(){
this.node=null;
this.element=null;
}
/**
*创建一个存储特定元素的线性表
*/
publicLineListNode(Telement){
this.node=null;
this.element=element;
}
/**
*返回当前结点点的下一个节点
*/
publicLineListNodegetNextNode(){
returnthis.node;
}
/**
*设置当前结点的下一个结点
*/
publicvoidsetNextNode(LineListNodenode){
this.node=node;
}
/**
*返回当前结点存储的数据元素
*/
publicTgetElement(){
returnthis.element;
}
/**
*设置当前结点存储的数据元素
*/
publicvoidsetElement(Telement){
this.element=element;
}
}
packagexiao.zhang.backup;
importxiao.zhang.osa.LineListNode;
/**
*创建一个存储PCB用来线性链表,通过线性链表的相关操作来实现相应的功能
*
*@authorXiaoZhang
*
*/
publicclassLineListPcb{
/**
*表示PCB线性表的长度
*/
privateintsize;
/**
*表示PCB线性表的头元素结点
*/
privateLineListNodeheadPcb;
/**
*表示PCB线性表尾元素结点
*/
privateLineListNodelastPcb;
/**
*创建一个空的PCB线性存储链表
*/
publicLineListPcb(){
this.size=0;
this.headPcb=null;
this.lastPcb=this.headPcb;
}
/**
*创建一个具有特定元素的PCB线性存储链表
*/
publicLineListPcb(LineListPcbllp){
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;
}
LineListNodetempNode=this.headPcb;
this.headPcb=tempNode.getNextNode();
tempNode=null;
this.size--;
}
/**
*向PCB线性表中的添加数据元素
*
*@paramelement
*/
publicvoidaddElement(PCBelement){
LineListNodenewElement=newLineListNode(element);
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;
}
LineListNodetempNode=this.headPcb;
this.headPcb=tempNode.getNextNode();
this.lastPcb.setNextNode(tempNode);
this.lastPcb=tempNode;
}
/**
*从PCB线性表中中的尾部移除数据元素,并将其添加到PCB的线性表中的头部
*/
publicvoidremoveFromLastAddToHead(){
if(0==this.size){
return;
}
LineListNodetempNode=this.lastPcb;
/**
*设置尾结点的以一个结点为空
*/
LineListNodelastSecondNode=this.headPcb;
/**
*@i=1表示指向PCB线性表的元素为线性表的第一个元素
*@i=this.size-1表示指向线性表的元素为线性表的末尾第二个数据元素
*/
for(inti=1;ilastSecondNode=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;
}
LineListNodeheadNode=this.headPcb;
intcurrentPrority=((xiao.zhang.osa.PCB)headNode.getElement())
.getPriority();
LineListNodenextNode=headNode.getNextNode();
intnextPrority=((xiao.zhang.osa.PCB)nextNode.getElement())
.getPriority();
if(currentPrority>nextPrority){
return;
}else{
this.headPcb=nextNode;
}
for(inti=2;iLineListNodenextNextNode=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
*/
publicLineListNodegetHeadPcb(){
returnthis.headPcb;
}
/**
*@returnthelastPcb
*/
publicLineListNodegetLastPcb(){
returnthis.lastPcb;
}
/**
*
*@returnPCB
*/
publicPCBgetPCB(){
returnthis.headPcb.getElement();
}
/**
*@paramheadPcb
*theheadPcbtoset
*/
publicvoidsetHeadPcb(LineListNodeheadPcb){
this.headPcb=headPcb;
}
/**
*@returnthesize
*/
publicintgetSize(){
returnthis.size;
}
/**
*@paramsize
*thesizetoset
*/
publicvoidsetSize(intsize){
this.size=size;
}
}
主方法:
publicclassPCBProcess{
/**
*实现进程进如就绪队列的时后进行由优先级由高到低的顺序进入
*
*@paramp
*@paramllp
*/
privatestaticvoidcomeLineList(PCB[]p,LineListPcbllp){
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)};
/**
*进行优先级的调度算法
*/
LineListPcbllp=newLineListPcb();
comeLineList(p,llp);
/**
*业务处理流程
*/
while(true){
if(llp.getSize()==0){
break;
}
LineListNodelln=llp.getHeadPcb();
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();
}
}
}
}