SHAOXIAOJ正在加载中...

2699: 【操作系统】实验一 - 进程管理

金币值:1 定数:1 时间限制:1.000 s 内存限制:128 M
正确:1 提交:1 正确率:100.00% 命题人:
点赞量:0 收藏量:0 题目类型:程序 知识点: 顺序结构 操作系统

题目描述

实验目标

能够使用 $Linux$ 系统进程相关的系统调用编程实现进程控制、同步以及通信。


一、实验内容

进程创建的步骤:
1.申请空白 $PCB$:操作系统从 $PCB$(进程控制块)池中申请一个空白 $PCB$,用来记录进程的相关信息。
2.为新进程分配资源:包括内存空间,以及可能需要的 $I/O$ 设备等资源 。
3.初始化 $PCB$:
(1).标识信息:为进程分配唯一的标识符。
(2).处理机状态:设置进程初始状态,如就绪态等;初始化程序计数器等寄存器的值。
(3).进程控制信息:设置进程的优先级、调度信息等。
4.将新进程插入就绪队列:完成上述步骤后,把新进程插入到就绪队列中,等待处理机调度执行 。

编写一段源程序,使用系统调用 $fork()$ 创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。在程序中分别使用系统调用 $getpid()$ 获得父进程和子进程的进程号,观察父进程和子进程的 $PID$ 号有何关系?如何区分父进程和子进程?

二、实验过程

直接输出以下内容即可:
进程创建:
I am a child!
child pid is 6007
child exit
I am a parent!
parent pid is 6006
parent exit

进程同步:
I am a child!
child pid is 6077
I am a parent!
parent pid is 6076
child exit
parent exit
program end!
完成后,请留意“测试代码”区的代码,他可以帮助你深刻的了解进程的过程。

测试代码   复制

/*进程创建*/
#include "sys/types.h"  //Unix/Linux系统的基本系统数据类型的头文件
#include "unistd.h"  //UNIX系统服务的函数原型
#include "stdio.h"
int main(){
        int pid;
        pid=fork();
        if(pid==0)    //子进程
        {
           printf("I am child!\n");
           printf("child pid is %d\n",getpid());
           printf("child exit\n");
        }
        else if(pid>0)  //父进程
        {
           printf("I am parent!\n");
           printf("parent pid is %d\n",getpid());
           printf("parent exit\n");
        }
        else     //创建失败
           printf ("fork faile!\n");
}

/*进程同步*/
#include "stdlib.h"
#include "sys/types.h"
#include "unistd.h"
#include "stdio.h"
int main(){
        int pid;
        pid=fork();
        if(pid==0)
        {
           printf("I am child!\n");
           printf("child pid is %d\n",getpid());
           sleep(10);   //子进程sleep10秒钟
           printf("child exit\n");
           exit(0);   //退出
        }
        else if(pid>0)
        {
           printf("I am parent!\n");
           printf("parent pid is %d\n",getpid());
           wait(0);    //父进程等待子进程退出
           printf("parent exit\n");
        }
        else
           printf ("fork faile!\n");
        printf("program end!\n");
}

输出格式

直接输出"输出样例"的内容即可。

输出样例    复制

进程创建:
I am a child!
child pid is 6007
child exit
I am a parent!
parent pid is 6006
parent exit

进程同步:
I am a child!
child pid is 6077
I am a parent!
parent pid is 6076
child exit
parent exit
program end!

提示

信号量机制说明:
对比与上一段程序的异同?如果没有父进程中的 $wait(0)$ ,会出现什么现象?如果将子进程中 $sleep$ 系统调用改成系统调用 $pause()$,将什么结果?
$(1)$.如果没有 $wait(0)$:
执行程序会发现 $child$ $exit$ 没有输出出来。
$(2)$.如果 $sleep$ 改成 $pause$:
程序会持续执行,当运行到 $pause$ 时会暂停当前程序,后续程序无法执行,该程序也就一直在运行,永远无法运行结束。