操作系统--进程(四)

4.3 进程操作

系统内的进程能并发执行,它们必须动态地被创建和删除。 因此, 操作系统必须提供某种机制(或工具) 以创建和终止进程。

4.3.1 进程创建

进程在其执行过程中, 能通过系统调用(create-process)创建多个新进程。 创建进程称为父进程, 而新进程称为 子进程。 这些新进程的每一个可以再创建其他进程, 从而形成了进程树。

通常进程 需要一定的资源(如CPU时间、内存、文件、I/O设备),以完成其任务。 在一个进程创建子进程时, 子进程可以从操作系统那里直接获得资源, 也可能只从其父进程资源自给 那里获得资源。 父进程 可能必须在其子进程之间分配资源或共享资源(如内存或文件)。 限制子进程只能使用父进程的资源 子集,能防止 创建过多的子进程而是系统超载。

在进程创建时, 除了得到各种 物理和逻辑资源外, 它还能 从父进程那里 得到所需的初始化数据(或输入)。 例如, 考虑 一个进程, 其功能是在终端 屏幕上显示文件(如F1)的状态。 在创建时, 它会得到来自父进程的输入, 如文件F1的名称, 它能使用 该数据执行以获得所需的信息。 它能 得到输出设备的名称。 有的操作系统将资源传递给子进程。 在这类系统上, 新进程可得到两个打开文件, 即F1 和中断设备, 只需在两者之间 传输数据。

当进程创建新进程时, 有两种执行可能:

1、父进程和子进程并发执行。
在这里插入图片描述
4.7 一个典型的UNIX 系统中的进程树
2. 父进程等待,直到某个或全部子进程执行完毕。
新进程的地址空间也有两种可能。

  1. 子进程时父进程的复制品
  2. 子进程装入另一个程序进来。

为了说明这些不同实现,来看一下UNIX系统。 在UNIX系统中, 每个进程都有一个唯一的整数形式的 进程标识符(process identifier)。通过系统调用fork, 可创建新进程。 新进程由原来进程的地址空间的复制组成。 这种机制允许父进程与子进程方便地进行通信。两个进程(父和子)进程, 系统调用fork 的返回值为0; 而对于父进程, 返回值为子进程(非零)进程标识符。

通常, 在系统调用fork 之后。一个进程会使用系统调用execlp,以用新程序来取代进程的内存空间。 系统调用 execlp将 二进制文件装入内存, 消除了 原来包含系统调用 execlp的程序的内存映射, 并开始执行。 采用这种方式, 两进程间能通信, 并能按各自的方式执行。 父进程就能创建更多子进程, 或者如果在子进程运行时没有什么事情可以做, 那么它采用系统调用wait 把自己移除就绪队列来等待子进程的终止。 如图4.8所示的C程序说明了上述一程序。 子进程中的pid值为0; 而父进程 的pid的值大于0。子进程通过系统调用execlp 用UNIX 命令/bin/ls (用来列出目录清单)来覆盖其地址空间。 父进程通过系统调用wait 来等待子进程的完成。 当子进程完成时, 父进程会从wait调用出开始继续, 并调用系统调用exit 来表示结束。

相反, DEC VMS 操作系统创建新的进程,将制定程序装入 该进程, 并开始执行。

#include<stdio.h>
void main(int argc, char *argv[])
{
int pid;
	/*fork another process*/
	if (pid < 0) {/*error occurred*/
		fprintf(stderr, "Fork Failed");
		exit(-1);}
	else if (pid == 0){/*child process*/
		execlp("/bin/ls", "ls", NULL);
	}
	else {/*parent process*/
		/*parent will wait for the child to complete*/
		wait(NULL);
		printf("Child Complete");
		exit(0);
	}
}

/* fork 另外一个进程的C 程序*/

4.3.2 进程终止

当进程完成执行最后的语句并使用系统调用exit 请求操作系统调用exit 请求操作系统删除它时, 进程终止。 这时, 进程可以返回数据(输出)到父进程(通过系统调用wait)。 所有进程资源,包括物理和虚拟内存,、打开文件和I/O缓冲操作, 会被操作系统所释放。

在其他情况下,也会出现终止。 进程通过适当的系统调用(如abort)能终止另一个进程。 通常,只能被终止进程的父进程才能执行这一系统调用。 否则,用户可能会任意地终止彼此的作业。 因此, 当一个进程创建一个新进程时, 新创建进程的标识符要传递给父进程。

父进程终止其子进程的原因有很多, 如下面一些原因:

  • 子进程使用了超过他所分配到的一些资源。 这要求父进程有一个检查其子进程的状态的机制。
  • 分配给子进程的任务已不再需要。
  • 父进程退出,如果父进程终止,那么操作系统不允许子进程继续。 对于这类系统, 如果一个进程终止(正常或不正常)。那么它的所有子进程也被终止。这种现象,称为 级联终止(cascading termination),通常是由操作系统进行的。
    为了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值