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 << '
}
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);
}
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 << '
}
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
- pcb
- PCB
- PCB
- PCB
- PCB
- PCB
- PCB
- PCB
- PCB
- PCB
- PCB
- 【PCB设计】PCB改版
- PCB设计;PCB制造;PCB抄板
- PCB concept
- PCB布线
- pcb经验谈
- 模拟PCB
- PCB告一段落
- 怎样花两年时间去面试一个人
- java 中的线程池
- pgsql 安装详解
- ARM学习笔记015之GPIO(汇编、key、led接线、int main、-wall)
- 64位ubuntu 12.04 LTS 一步一步安装 hadoop2.2.0
- PCB
- 怒写论文
- 面试问题系列:c++学习推荐书籍
- 嵌入式 linux下字符串简单转为对应的数字
- crontab命令的使用
- 对多元二次函数的理解
- Windows窗口的创建
- Linux_Struct_inode() 结构体详解
- flex 双击事件不起作用