实验学时:2 实验类型:验证 实验要求:必修
一、实验目的
1) 理解进程创建相关理论; 2) 掌握进程创建方法; 3) 掌握进程相关数据结构。
二、实验容
本实验针对操作系统中进程创建相关理论进行实验。要验者输入实验指导书提供的代码并进行测试。代码简化了进程创建的多个步骤和容。进程的树形结构采用广义二叉树的方式进行存储。
三、实验原理
1)进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个进程控制块(PCB),它是进程实体的一部分,是操作系统管理进程最重要的数据结构。其主要包含四类信息:
(1) 进程标识符
它唯一地标识一个进程。通常包括进程号 pid,父进程号 ppid 和用户号 uid。
(2) 处理机状态
处理器的状态通常由处理机的各种寄存器中的容组成。PCB 存放中断(阻塞,挂起)时的各寄存器值,当该进程重新执行时,可以从断点处恢复。主要包括:
a) 通用寄存器; b) 指令计数器; c) 程序状态字 PSW; d) 用户栈指针。 (3) 进程调度信息 a) 进程状态;
b) 进程优先级(用于描述优先使用 cpu 级别的一个整数,高优先级的进程先得到
cpu,通常情况下,优先值越小优先级越高);
c) 其它信息(等待时间、总执行时间等); d) 事件(等待原因)。 (4) 进程控制信息
a) 程序和数据的地址(程序在存和外存中的首址); b) 进程同步和通信机制;
c) 资源列表(进程除 CPU 以外的所有资源);
d) 指针(进程队列中指向下一个进程的 PCB 首址)。
2) 进程创建流程 (1) 申请空白 PCB
为新进程申请获得唯一的数字标识符,并从 PCB 集合中索取一个空白 PCB。如果无空白
PCB,可以创建一个新的 PCB。在本实验中,每次动态创建 PCB。 (2) 为新进程分配资源
为新进程分配存空间和栈空间。 (3) 初始化进程控制块
a) 初始化标识信息;
b) 初始化处理机状态信息; c) 初始化处理机控制信息。 (4) 将新进程插入就绪队列 3) 进程树
P1
P2
P3
P4
P5
P6 P7 P8 P9 P10 P11
P12
图 1-1 进程树
进程树用于描述进程家族关系,如图 1-1 中可以看出,进程 P1 创建了进程 P2、P3、P4、P5,而 P2 又创建了 P6、P7、P8 …… 。在进程创建过程中,需要对每一个新增加的进程加入到进程树中,有了清晰的父子关系,可以使资源继承或进程删除等操作变得很方便。
4) 进程总链
它是一个 PCB 链表,每一个新创建的进程必须把其 PCB 放入总链中,该总链可以对破坏的进程树进行修复,也方便 PCB 查找。
四、可能用到的数据结构和操作的部分代码
1. 数据结构
//process control block:有些pcb的容是考虑到以后调度功能而设置的 struct pcb {
int pid;//process id
int ppid;//parent process id int prio;//priority int state;//state
int lasttime;//last execute time int tottime; //totle execute time };
//process node struct pnode
{
pcb *node; pnode *sub; pnode *brother; pnode *next; };
//信号量
struct semphore{
char name[5]; //名称 int count;//计数值
int curpid;//当前进程 id pnode *wlist; //等待链表 }; 2.操作
2.1 //初始化错误提示信息; 2.2 //create process int createpc(int *para) {
//add your code here: // find ppid of this process //init new pcb
//add to process tree // add to process link }
//show process detail void showdetail() {
//add your code here //print all pcb info }
//main函数可参考下面的代码,也可以自己写 void main() {
initerror();
short cflag/*(命令标志)*/,pflag/*(参数标志)*/; char cmdstr[32];
proot = new pnode; //创建根节点进程 proot->node=new pcb; //初始化根节点的pcb proot->node->pid=0; proot->node->ppid=-1; proot->node->prio=0; proot->next=NULL;
}
proot->sub=NULL; proot->brother=NULL; plink=proot; for(;;) { cflag=0; pflag=0; printf(\"cmd:\"); scanf(\"%s\ if(!strcmp(cmdstr,\"exit\")) //exit the program break; if(!strcmp(cmdstr,\"showdetail\")) { cflag = 1; pflag = 1; showdetail(); } else { int *para; char *s,*s1; s = strstr(cmdstr,\"createpc\"); //create process if(s) { cflag=1; para = (int *)malloc(3); //getparameter s1 = substr(s,instr(s,'(')+1,strlen(s)-2); //get param string para=strtoarray(s1);//get parameter createpc(para); //create process pflag=1; } } if(!cflag) geterror(0); else if(!pflag) geterror(1); }
五、实验步骤
完善实验提供的代码后,输入 createpc 命令创建进程,输入 showdetail 显示每个进程及其子进程的信息,测试命令解释如下:
1) createpc 创建进程命令。
参数: 1、 pid(进程 id) 2 、ppid(父进程 id)3、prio(优先级)。
示例:createpc(1,0,1) 。创建一个进程,其进程号为 1,父进程号为 0,优先级为 1.
createpc(2,1,2) 。创建一个进程,其进程号为 2,父进程号为 1,优先级为 2。
2) showdetail 显示进程信息命令。 3) exit退出命令行。
六、实习报告容
1.画出你所创建的进程树的结构图(也可以用上述图1-1)。
P8 P1 P2 P4 P5 P6 P3 P7 P9 P10 P11P12P13 P14
P15 2.显示运行结果:至少有五次运行过程截图,这五次截图分别展现不同类型的父子关系,并在截图的下方配文字以说明自己创建的进程数量以及这图所展示的进程家族关系。
createpc(1,0,1) Showdetail
以P1为第一层,运行结果;
createpc(1,0,1) createpc(2,1,2) createpc(3,1,2) Showdetail
以P1为第一层,P2,P3为第二层,且为P1的子进程,运行结果;
createpc(1,0,1) createpc(2,1,2) createpc(3,1,2) createpc(4,2,3) createpc(5,2,3) createpc(6,3,3) createpc(7,3,3) Showdetail
以P1为第一层,P2,P3为第二层,且为P1的子进程;P4,P5,P6,P7为第三层;P4,P5为P2的子进程;P6,P7为P3的子进程;运行结果;
createpc(1,0,1) createpc(2,1,2) createpc(3,1,2) createpc(4,2,3) createpc(5,2,3) createpc(6,3,3) createpc(7,3,3) createpc(8,4,4) createpc(9,4,4) createpc(10,6,4) createpc(11,6,4) createpc(12,7,4) createpc(13,7,4) Showdetail
以P1为第一层,P2,P3为第二层,且为P1的子进程;P4,P5,P6,P7为第三层;P4,P5为P2的子进程;P6,P7为P3的子进程;P8,P9,P10,P11,P12,P13为第四层,且P8,P9为P4的子进程;P10,P11为P6的子进程;P12,P13为P7的子进程;运行结果;
createpc(1,0,1) createpc(2,1,2) createpc(3,1,2) createpc(4,2,3) createpc(5,2,3) createpc(6,3,3) createpc(7,3,3) createpc(8,4,4) createpc(9,4,4) createpc(10,6,4) createpc(11,6,4) createpc(12,7,4) createpc(13,7,4) createpc(14,8,5) createpc(15,8,5) Showdetail
以P1为第一层,P2,P3为第二层,且为P1的子进程;P4,P5,P6,P7为第三层;P4,P5为P2的子进程;P6,P7为P3的子进程;P8,P9,P10,P11,P12,P13为第四层,且P8,P9为P4的子进程;P10,P11为P6的子进程;P12,P13为P7的子进程;运行结果;P14,P15为第五层,且为P8的子进程,运行结果;
3.说明您的关键函数的流程:说明createpc(para)函数、showdetail()函数和main()函数的功能,并以流程图或文字的形式展现。
createpc(para)函数:创建进程
showdetail()函数:显示进程的细节 将建立的进程遍历并输出。
结束 p=plink 开 始 否 进程为真 是进程存在 是 输出进程存在并返回-1 否 添加进程
main()函数:主函数 结束exit showdetail()输出进程 createpc(para)创建进程 输入 initerror()是用来初始化错误的 开始 4.思考题
(1)进程创建的核心容是什么? 答:1>申请空白PCB 2>为新进程分配资源
3>初始化进程控制块 4>将新进程插入到就绪队列
(2)你的设计和实际的操作系统进程创建相比,缺少了哪些步骤? 答:只是模拟的创建,并没有分配资源
5.最后将代码以附件形式上交。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务