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

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 主要程序代码

*********************************1.cpp*****************************************
#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
    pid_t pid[2];// 记录生成的两个子进程的PID
    int layer = 1;
    const int targetLayer = 4;// 目标层数
    printf("Root pid is %d.\n",getpid());
    for( int i=0;i<2; ){// 这里没有++i哦
        if( i==0 ) layer++;// 条件控制,使得整个循环中layer只增加1
        pid[i] = fork();
        if( pid[i]==0 ){// 子进程
            printf("My parent is %d, my pid is %d.\n",getppid(),getpid());
            if( layer>=targetLayer ){// 层数够了,结束
                printf("Process %d had exited.\n",getpid());
                exit(0);
            }else{
                i = 0;// 从头开始循环,以便fork两次
        }else if( pid[i]!=-1 ){// 父进程
            printf("Parent process %d create child process %d.\n",getpid(),pid[i++]);//下标+1
        }else{
            printf("Error: when %d fork()!\n",getpid());
        }
    }
    for( int i=0;i<2;++i ){//回收
        waitpid(pid[i],NULL,0);
    }
    printf("Process %d had exited.\n",getpid());
    exit(0);
}

1.6 运行结果及分析

在这里插入图片描述

图1-2 运行结果图

1.7 心得体会

子进程会复制父进程的数据,所以我们可以利用这一点,来实现终止条件的控制,从而实现进程的创建。

  • 13
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章 绪论作业答案(共50分) 一、分析如下程序 (1)~ (10)各语句的频度。(每个1分,共10分) Ex( ) { int i , j , t ; (1) for( i=1 ; i<10 ; i++) //n = (2) printf(“\n %d” , i ); //n = (3) for(i=1; i<=2; i++) //n = (4) printf(“\n”); //n = (5) for(i=1; i<=9; i++) //n = { (6) for(j=1; j <= i ; j++) //n = { (7) t = i * j ; //n = (8) printf(“]”,t); //n = } (9) for(j=1; j 0) { if(x > 100) {x -= 10 ; y -- ;} else x ++ ; } 问if 语句执行了多少次?(2分) y--执行了多少次?(2分) x ++执行了多少次?(2分) 三、回答问题(共25分) 书16页的起泡排序如下: void bubble_sort(int a[],int n){ //将a整数序列重新排列成自小至大有序的整数序列。 for(i=n-1,change=TRUE;i>=1&&change;--i){ change=FALSE; for(j=0;ja[j+1]{a[j]<-->a[j+1];change=TRUE; } } }//bubble_sort 1.(共15分)分析该算法的最佳情况 ,最坏情况和平均情况下各自的时间复杂度(给出分析思路与过程)。 (1) 最佳情况的时间复杂度分析(5分): (2) 最坏情况的时间复杂度分析(5分): (3) 平均情况的时间复杂度分析(5分): 2.(共10分)比较与C语言书的起泡排序异同,并从时空效率角度说明谁更优。 四、完成如下选择题(每3分,共9分)。 1. 设f为原操作,则如下算法的时间复杂度是( )。 for (i = 1; i*i=1;i--) for(j=1;jA[j+1]) A[j]与A[j+1]对换; 其n为正整数,则算法在最坏情况下的时间复杂度为( )。 A.O(n) B.O(nlog2n) C. O(n3) D. O(n2)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值