从异常到进程(外加fork原理)

什么是异常控制流?


现代系统使用控制流发生突变来对系统状态变化做出反应,一般而言,我们把这些突变称为异常控制流(Exceptional Control Flow,ECF)。

 

什么是异常?

异常(Exception)就是控制流中的突变,用来响应处理器状态中的某种变化。

异常处理的过程是什么样的?

在我们的系统中,系统为异常的每种类型都分配了一个唯一的非负整数的异常号。这个异常号相当于一个指针,指向具体的异常。在系统启动时,操作系统分配和初始化一张异常表,它是一张跳转表。如下。

在这张表中,对于k项对应的是异常k的处理函数地址。当系统运行的时候,处理器检测到某个事件,并且这个事件对应某个异常号k,那么,就会触发异常,接着就会通过异常表来调用异常处理程序。在处理完事件之后,它通过执行一系列特殊的“从中断返回”指令,可选地返回到被中断的程序。

上面提到过,这个异常号相当于一个索引号,一场表的起始地址放在一个叫做异常表基址寄存器的特殊寄存器当中。具体调用过程如下。

异常的类别有哪些?

异常的类别可以分为四类:中断(interrupt)、陷阱(trap)、故障(fault)和终止(abort)。

什么是进程?

进程是一个执行中程序的实例,我比较喜欢的一个比喻是程序就是一个菜谱,而进程就是正在做菜所发生着的那个流程。进程是系统资源分配最小的单位。系统中的每个程序都运行在某个进程的上下文(context)中。上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用的目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

 

什么是并发流?

对于两个进程,如果它们在执行的过程当中,两个进程在交错的占用CPU的事件,那么可以将这两个进程称为并发流,这两个进程被称为并发地运行。如下图中的进程A和进程B,进程A和进程C,进程B和进程C不是并发,因为它们的运行时间没有交错。

因为并发的存在,对于单核的CPU,都给我们一种多个进程并行运行的错觉。多个流并发地执行的一般现象称为并发。一个进程和其他进程轮流运行称为多任务。一个进程执行它的控制流的一部分的每一个时间段叫做时间片。因此多任务也叫做时间分片

 

Fork()方式创建进程

父进程可以通过调用fork()函数创建子进程,新创建的子进程几乎但不完全和父进程相同。子进程得到和父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝,包括文本、数据和bss段、堆以及用户栈。子进程和父进程最大的区别是它们有不同的PID。

fork()函数被调用一次,它会被返回两次:一次在父进程中,一次在子进程中。在父进程中,fork返回子进程的PID。在子进程中,fork返回0。

关于fork()产生的子进程个数的讨论

上面这个看起来非常乱,换成下面这个图就清楚了。

可以看到调用3次fork函数,连同父进程,总共生成4个进程,如果一直循环下去,可以推理出循环n次,会调用2n-1次fork,会生成2n个进程(包含第一个父进程)。每产生一个新的进程,就调用了一次fork。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值