PCB

来源:互联网 发布:剑灵捏人灵族数据 编辑:程序博客网 时间:2024/04/28 06:52
#include   <iostream > 
using   std::cout; 
using   std::cin; 
using   std::cerr; 

enum   Status{running,ready,blocked}; 
enum   Policy{fifo,spf,hpf,rr}; 

typedef   class   PCB 
{//定义PCB类。 
public: 
        int   id,priority,cputime,alltime,startblock,blocktime; 
        Status   state; 
        class   PCB   *next; 
        PCB() 
        { 
                priority=0; 
        } 
}PCB,*PCBptr,**PCBpp; 

char   x; 
PCBpp   pp;//两个全局变量 

void   Print(PCBptr   head) 
{//打印head为头指针的PCB链表信息。 
        PCBptr   p; 
        cout << "\n运行/Running: "; 
        for(p=head;p->next;p=p->next) 
        { 
                if(p->next->state==running) 
                { 
                        cout << "ID " <<p->next->id; 
                        break; 
                } 
        } 
        cout << "\n就绪队列/Ready   Queue: "; 
        for(p=head;p->next;p=p->next) 
                if(p->next->state==ready) 
                        cout << "ID " <<p->next->id;   
        cout << "\n阻塞队列/Block   Queue: "; 
        for(p=head;p->next;p=p->next) 
                if(p->next->state==blocked) 
                        cout << "ID " <<p->next->id;   

        cout << "\n-----------------------------------------------------------------------\n " 
                << " 进程号 优先数 已运行时间 还需要时间 开始阻塞时间 阻塞时间 状态\n "; 
        for(p=head;p->next;p=p->next) 
        { 
                cout << "   " <<p->next->id << "       " <<p->next->priority << "  " <<p->next->cputime << " " <<p->next->alltime << "       " <<p->next->startblock << "      " <<p->next->blocktime << "   "; 
                switch(p->next->state) 
                { 
                case   ready:cout << "就绪 ";break; 
                case   running:cout << "运行 ";break; 
                case   blocked:cout << "阻塞 ";break; 
                default:exit(0); 
                } 
                //cout << &apos;
        } 
        cout << "------------------------------------------------------------------------\n " 
                << "按任意键以继续... "; 
        cin >>x; 


void   Delete(PCBptr head,PCBptr p) 
{//删除以head为头指针的PCB链表中p所指向的结点。 
        PCBptr   q=head; 
        while(q->next!=p)   q=q->next; 
        q->next=p->next; 
        delete p; 


void   InsertSort(PCBpp Rdy,PCBpp RdyEd,Policy algthm) 
{//直接插入排序。 
        if(*(Rdy+1))//队列不为空 
                if(RdyEd-1!=Rdy+1) 
                {//Ready+1队列中不只一个。 
                        switch(algthm) 
                        { 
                        case   hpf: 
                                if((*(RdyEd-1))->priority >(*(RdyEd-2))->priority) 
                                { 
                                        PCBpp   tt; 
                                        *Rdy=*(RdyEd-1); 
                                        *(RdyEd-1)=*(RdyEd-2); 
                                        for(tt=RdyEd-3;(*Rdy)->priority >(*tt)->priority;tt--) 
                                                *(tt+1)=*tt; 
                                        *(tt+1)=*Rdy; 
                                } 
                                break; 
                        case   spf: 
                                if((*(RdyEd-1))->alltime <(*(RdyEd-2))->alltime) 
                                { 
                                        PCBpp   tt; 
                                        *Rdy=*(RdyEd-1); 
                                        *(RdyEd-1)=*(RdyEd-2); 
                                        for(tt=RdyEd-3;(*Rdy)->alltime <(*tt)->alltime;tt--) 
                                                *(tt+1)=*tt; 
                                        *(tt+1)=*Rdy; 
                                } 
                        } 
                } 


void   RunToBlk(PCBpp   Run,PCBpp   &BlkEd) 
{//定义运行态转为阻塞态。 
        (*Run)->state=blocked; 
        *BlkEd=*Run; 
        BlkEd++; 


void   RdyToRun(PCBpp   &Rdy,PCBpp   Run,Policy   algthm) 
{//定义就绪态转为运行态。 
        if(algthm==hpf ||algthm==spf) 
        { 
                if(*(Rdy+1)) 
                { 
                        (*(Rdy+1))->state=running; 
                        *Run=*(Rdy+1); 
                        Rdy++; 
                } 
        } 
        else 
        { 
                if(*Rdy) 
                { 
                        (*Rdy)->state=running; 
                        *Run=*Rdy; 
                        Rdy++; 
                } 
        } 


void   RunToRdy(PCBpp   Run,PCBpp   Rdy,PCBpp   &RdyEd,Policy   algthm) 
{//定义运行态转为就绪态。 
        (*Run)->state=ready; 
        *RdyEd=*Run; 
        RdyEd++; 
        if(algthm==hpf ||algthm==spf) 
                InsertSort(Rdy,RdyEd,algthm); 
0 0
原创粉丝点击