●基本要求
模拟操作系统内核对进程的控制和管理:包括进程的创建和撤 销、进程状态的切换和简单的内存空间管理。
●实验提示:
1、 定义管理每个进程的数据结构 PCB:包含进程名称、队列指针、 分配的物理内存区域(基址和 长度 ) 。每创建一个进程时,需要为其创建 PCB 并 分配空闲内存空间 ,对 PCB 进行初始化,并加入就绪队列。可参考如下数据结构(动态形式)
typedef struct PCB
{
int adress;
int memery;
char name[16];
struct PCB *next;
}PCB,*linkpcb;
为了实现进程在不同状态下的切换,需要设置三个队列,分别是运行队列,阻塞队列,就绪队列。并在一开始的时候就初始化它们为空队列准备进程的进入。
队列使用的数据结构也是PCB
struct PCB *ready,*blocked,*running;
队列初始化函数参考:
void InitQueue(linkpcb &rear,linkpcb &front)//初始化队列
{
linkpcb lq=new PCB;
lq->next=NULL;
rear=lq;
front=lq;
}
进程进入队列的函数参考:
void InQueue(linkpcb &p,linkpcb &rear)//插入到队列中
{
p->next=NULL;
rear->next=p;
rear=p;
}
进程从某一个状态改变至另一种运行状态的过程需要从表示相应状态的队列中出队列再进入到目标状态的队列。这个操作也就是比较核心的进程状态改变操作。同时在实际函数调用的时候不要忘记判断一下队列是否为空的问题。
linkpcb DeQueue(linkpcb &front,linkpcb &rear)//删除队列的第一个元素,并返回这个元素
{
linkpcb p;
if(front==rear) //如果此时队列为空
return 0;
p=front->next;
front->next=p->next;
p->next=NULL;
if(rear==p)
rear=front;
return p;
}
设置全局变量memory和address,记录整个操作系统的基址和内存值
int Adress,Memery;
网友评论