Linux——信号(3)

经过前两部分的介绍,我们现在已经认识了信号是如何产生的,并且知道无
论信号是如何产生的,最终只能由操作系统来对特定进程发送信号,而发送
信号其实也就是写信号,往内核数据结构(pending表)中写。我们也认识了
信号的几种状态,也直到了关于信号的一些操作,但是我们之前说过,当信
号处于信号未决状态时,进程会在合适的时候对信号进行处理,那么这个“合
适”的时候是什么时候呢?这就是我们今天要谈论的主要问题。

1. 信号的处理和捕获

我们现在知道了,信号的处理方式有三种:默认处理方式,忽略和自定义捕捉。那么接着上面的话题,“合适”的时候究竟是什么时候呢?这里直接给出答案:
进程在从内核态到用户态的时候会进行信号的检测并处理。

a. 小铺垫

从这里就出现了两个新的名词:用户态和内核态。它们俩代表了计算机中进程的不同的身份,从名字来看,内核态所能使用的资源一定是多于用户态的,事实也是正如你所想的。
那么什么是内核态,什么是用户态呢?
我们的代码在编写号的时候,难免会使用到系统调用,访问到系统的内核级资源(例如管道资源,task_struct结构体等等),那么对于我们用户来说,内核级资源是我们普通用户能够访问的吗?答案是肯定不能的,所以当我们的进程调用系统调用访问系统内核级资源的时候,进程要进行从用户态到内核态的身份的转换。比如我们的信号:
在这里插入图片描述
其中我们使用signal函数进行自定义捕捉然后向进程发送对应信号时,我们的进程一定是经过了从用户到内核的。
我们以前看到地址空间的时候可能看到的是这样的分布:
在这里插入图片描述

我们应该都直到用户区的各种分区代表的什么意思,但是内核数据区我们好像不是那么熟悉。
那你有没有想过我们调用系统调用的时候,这个系统调用在哪里呢?系统调用又不是我们写的,系统调用也肯定不是什么库函数那自然也不在共享区中,我们也没有什么系统库这样的说法。
此时地址空间这幅图里面有一个区域:内核数据区,地址空间中的内核数据区有自己独立的页表会跟内存中的操作系统进行映射。内存中的操作系统有一部分就是系统调用,当然除了系统调用外,还有各种管理体系,调度方法,内核数据结构等,这些都会通过内核级页表来跟地址空间中的内核数据区进行映射(要知道操作系统也是一个软件,也是一个进程,它也有代码和数据)。
那么此时就说得通了,调用系统调用就跟调用库函数一样,也是在地址空间中进行的。
在32位机器下地址空间的大小是4GB其中用户区占[0, 3GB],内核占[3GB, 4GB]。
在这种机制下,我们进程的代码所有的执行都是在资金的地址空间进行调用,跳转,和返回。
此外这么做的话,要知道计算机是不论何时都会有进程在运行,系统中又不止一个进程,那么我们要进行我们的文件系统,驱动管理,调度方法等等直接就可以通过当前调度进程的地址空间的内核区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值