Linux——进程

一、进程的相关概念

1.进程的定义

进程是一个正在运行的程序。是操作系统资源分配的最小单位,有自己的地址空间,但进程创建消耗的资源大,进程切换开销也大。

2.PCB

进程控制块,是进程存在的唯一标志。用来描述进程的属性信息。每当创建一个新进程,操作系统就会为其分配一个pcb,记录进程的所有重要状态信息。

二、fork()复制进程

1.函数原型

pid_t  fork(void) 

pid_t:返回值类型,本质是int型。

2.原理

fork函数执行后,会生成一个新的进程,新的进程将原本进程进行复制。原本的进程为父进程,新生成的进程为子进程。父子进程的地址空间是独立的。但实际上,子进程创建成功后,只要有当需要进行修改时,才会复制父进程,在不需要修改时,与父进程共享当前页(写时拷贝技术)。

子进程创建成功,子进程的id会返回0,父进程id的返回值是子进程的pid。如果子进程创建失败,则返回-1。

通过返回值可以区分父子进程。

注意点:

(1)子进程创建成功后,父子进程并发运行。

(2)fork()之后,子进程与父进程完全相同,对于一个变量而言,其在子进程和父进程中的地址如果相同,则表示的是逻辑地址相同。但实际上,物理地址是不同的。

3.代码解释

(1)源代码

(2)运行截图

4.fork()与文件

当父进程先打开一个文件后,在进行fork()复制后,父子进程会共享父进程fork()之前打开的文件。

(fork()创建子进程时,会将父进程的PCB进行复制,父进程的PCB中文件表已经指向了打开的文件,所以子进程也指向了该文件)

三、僵死进程

1.僵死状态

子进程结束后,仍然存在于进程表中,占用系统资源,但是子进程实际上已经运行结束了。此时这种状态称为僵死状态。

2.产生的原因

子进程先于父进程结束,父进程此时未获取子进程的退出码。

如果父进程先于子进程结束,则不会产生僵死进程,因为此时子进程会变为孤儿进程,这时,系统会为子进程重新分配父进程,系统分配的父进程会回收子进程的空间。

3.解决僵死进程的原因

当产生一个进程实体时,系统会为其分配一个进程控制块(PCB),会占用一定的资源,如果这时,进程实体已不存在,但没有回收该进程的进程控制块,会造成资源的浪费。

4.解决办法

(1)在父进程中调用wait()获取子进程的退出码。但要注意,虽然解决了僵死进程,但是父进程调用wait()后,会被阻塞。

(2)使用信号解决:不仅可以解决僵死进程,也可以处理父进程被阻塞的情况。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值