操作系统实验 - 题目一 进程创建模拟实现

1.1 题目的主要研究内容及预期达到的目标

【设计目的】
(1)理解进程创建相关理论。
(2)掌握进程创建方法。
(3)掌握进程相关数据结构。
【课题描述】
本课题针对操作系统中进程的创建相关理论进行设计。要求编写程序并进行测试。代码简化了进程创建的多个步骤和内容。进程的树形结构采用广义二叉树的方式进行存储。
【课题内容】
(1)至少创建10个进程。
(2)创建进程树中4层以上的树型结构。。

1.2 题目研究的工作基础或实验条件

(1)硬件环境:Windows 10
(2)软件环境: VMware

1.3 设计思想

(1)进程树
进程的创建过程是操作系统重要的处理过程之一。在系统中运行的进程都
是由进程创建出来的,创建进程的进程与被创建的进程之间构成父子关系,子进
程还可以再创建它的子进程,由此可以构成颗进程树
(2)根进程
子进程的创建是基于父进程的,因此直追溯上去,总有一个进程是原始
的,是没有父进程的,这个进程是根进程。根进程没有可复制和参考的对象,它
所拥有的所有信息和资源都是强制设置的,不可复制的,这个过程称为手工设置,
也就是说根进程是“纯手工打造”的,它是操作系统中“最原始”的一个进程,它是个模子,后面的任何进程都是店于根进程生成的。
在Linux系统中的这个根进程的进程号是0,也把它叫做0号进程。创造0
号进程主要包括两部分:是创建进程 0运行时所需的所有信息,即填充0号进
程:二是调度0号进程的执行,即让它“动”起来,只有动起来,才是真正意义
上的进程,符合进程动态的概念。
(3)进程的创建过程
一但操作系统发现了要求创建进程的事件后,便调用进程创建原语按下述
步骤创建个新进程。
A、申请空白PCB
为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白 PCB.
如果无空白PCB,可以创建一个新的PCB.在本实验中,每次动态创建PCB.
B、为新进程分配资源
为新进程分配内存空间和栈空间。
C、初始化进程控制块
a)初始化标识信息;
b)初始化处理机状态信息;
c)初始化处理机控制信息。
D、将新进程插入就绪队列

1.4 流程图

在这里插入图片描述

图1-1 创建树形结构进程流程图

1.5 主要程序代码

************************
#include #include "dos.h" #include "stdlib.h" #include "conio.h" //PCB结构体 struct pcb{ int id; //进程序号 int ra; //所需资源A的数量 int rb; //所需资源B的数量 int rc; //所需资源C的数量 int ntime; //所需的时间片个数 int rtime; //已经运行的时间片个数 char state; //进程状态 struct pcb *next; } *hready=NULL,*hblock=NULL,*p; //hready,hblock分别为指向就绪和阻塞队列 typedef struct pcb PCB; int m,n,r,a,b,c,h=0,i=1,time1Inteval; //m为要模拟进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //建立一个PCB结构体型的空链表 PCB *increat(void) { PCB *head=NULL; //head=NULL; return(head); } //从链表起始地址开始输出该链表的内容 void disp(PCB *head) {PCB *p1; p1=head; AnsiString str2; if(head!=NULL) //链表非空 { do { str2+=" "; str2+=IntToStr(p1->id);str2+=" "; str2+=(p1->state);str2+=" "; str2+=IntToStr(p1->ra);str2+=" "; str2+=IntToStr(p1->rb);str2+=" "; str2+=IntToStr(p1->rc);str2+=" "; str2+=IntToStr(p1->ntime);str2+=" "; str2+=IntToStr(p1->rtime);str2+="\r\n"; p1=p1->next; }while(p1!=NULL); //不断输出进程的信息,直到链尾! } //if else { str2+="\t\t该 队 列 没 有 进 程!\r\n" ;} Form1->Memo1->Lines->Add(str2); } //将进程插入到链尾(包括就绪队列和阻塞队列) PCB *insert(PCB *head,PCB*pcb) //带两个指针形参:队列指针和当前进程PCB { PCB *pi,*p1; p1=head; pi=pcb; if (head==NULL) { head=pi; pi->next=NULL; } else { while(p1->next!=NULL) {p1=p1->next;} p1->next=pi; pi->next=NULL; } return(head); } //对进程进行初始化,建立就绪队阻塞队列。 void input() { AnsiString str1; m=StrToInt (Form1->Edit1->Text); //读取要模拟进程总数给m n=StrToInt (Form1->Edit2->Text); //读取需初
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值