因此可将进程控制块结构定义如下:
struct pcb
{int name; /*进程标识符*/
int status; /*进程状态*/
int ax, bx, cx,dx; /*进程现场信息,通用寄存器内容*/
int pc; /*进程现场信息,程序计数器内容*/
int psw; /*进程现场信息,程序状态字寄存器内容*/
int next; /*下一个进程控制块的位置*/
}
确定进程控制块内容后,要考虑的就是如何将进程控制块组织在一起。多道程序设计
系统中,往往同时创建多个进程。在单处理器的情况下,每次只能有一个进程处于运行态
其他的进程处于就绪状态或等待状态。为了便于管理,通常把处于相同状态的进程的进程
控制块链接在一起。单处理器系统中,正在运行的进程只有一个。因此,单处理器系统中
进程控制块分成一个正在运行进程的进程控制块、就绪进程的进程控制块组织成的就绪队
列和等待进程的进程控制块组成的等待队列。由于实验模拟的是进程调度,没有对等待队
列的操作,所以实验中只有一个指向正在运行进程的进程控制块指针和一个就绪进程的进
程控制块队列指针。操作系统的实现中,系统往往在主存中划分出一个连续的专门区域存
放系统的进程控制块,实验中应该用数组模拟这个专门的进程控制块区域,定义如下:
#define n 10 /*假定系统允许进程个数为 10*/
struct pcb pcbarea[n]; /*模拟进程控制块区域的数组*/
这样,进程控制块的链表实际上是数据结构中使用的静态链表。进程控制块的链接方式
可以采用单向和双向链表,实验中,进程控制块队列采用单向不循环静态链表。为了管理
空闲进程控制块,还应该将空闲控制块链接成一个队列。
实验中采用时间片轮转调度算法,这种算法是将进程控制块按照进入就绪队列的先后
次序排成队列。关于就绪队列的操作就是从队头摘下一个进程控制块和从队尾挂入一个进
程控制块。因此为就绪队列定义两个指针,一个头指针,指向就绪队列的第一个进程控制
块;一个尾指针,指向就绪队列的最后一个进程控制块。
实验中指向运行进程的进程控制块指针、就绪队列指针和空闲进程控制块队列指针定
义如下:
int run; /*定义指向正在运行进程的进程控制块的指针*/
struct
{int head;
int tail;
}ready; /*定义指向就绪队列的头指针 head 和尾指针 tail*/
int pfree; /*定义指向空闲进程控制块队列的指针*/
以上是如何组织进程,下面考虑如何创建进程。
进程创建是一个原语,因此在实验中应该用一个函数实现,进程创建的过程应该包括:
① 申请进程控制块:进程控制块的数量是有限的,如果没有空闲进程控制块,则进程
不能创建,如果申请成功才可以执行第②步;
② 申请资源:除了进程控制块外,还需要有必要的资源才能创建进程,如果申请资源
不成功,则不能创建进程,并且归还已申请的进程控制块;如果申请成功,则执行第三步
实验无法申请资源,所以模拟程序忽略了申请资源这一步;
③ 填写进程控制块:将该进程信息写入进程控制块内,实验中只有进程标识符、进程
状态可以填写,每个进程现场信息中的寄存器内容由于没有具体数据而使用进程(模拟进
- 1
- 2
- 3
- 4
- 5
- 6
前往页