2699: 【操作系统】实验一 - 进程管理
金币值:1
定数:1
时间限制:1.000 s
内存限制:128 M
正确:1
提交:1
正确率:100.00% 命题人:
题目描述
实验目标
能够使用 $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$ 时会暂停当前程序,后续程序无法执行,该程序也就一直在运行,永远无法运行结束。
对比与上一段程序的异同?如果没有父进程中的 $wait(0)$ ,会出现什么现象?如果将子进程中 $sleep$ 系统调用改成系统调用 $pause()$,将什么结果?
$(1)$.如果没有 $wait(0)$:
执行程序会发现 $child$ $exit$ 没有输出出来。
$(2)$.如果 $sleep$ 改成 $pause$:
程序会持续执行,当运行到 $pause$ 时会暂停当前程序,后续程序无法执行,该程序也就一直在运行,永远无法运行结束。