从Linux内核角度理解信号信号集

Linux操作系统分为用户空间和内核空间,用户进程通过C库调用系统调用与内核交互。内核管理资源并实现进程间的通信,如通过信号进行异步通信。进程控制块PCB包含了进程的状态和控制信息。信号集是表示信号状态的位图,阻塞信号集用于延迟信号处理,未决信号集记录待处理的信号。当信号产生时,会先标记在未决信号集中,等待进程被调度时检查并处理。
摘要由CSDN通过智能技术生成

前置知识:

Linux的体系结构大致可分为两部分,上面是用户(或应用程序)空间,由用户应用程序和C库组成,下面是内核空间,由系统调用,内核和平台架构相关代码组成。

用户空间:这是用户应用程序执行的地方,GNU C Library (C库)也在用户空间,这个库提供了连接内核的系统调用接口,程序调用C库的函数都要通过这里,他还提供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。

内核空间:Linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本的功能,例如 read 和 write。系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。这些代码是 Linux 所支持的所有处理器体系结构所通用的。在这些代码之下是依赖于体系结构的代码,构成了通常称为 BSP(Board Support Package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。

内核可以管理计算机的资源,将可用的资源,比如CPU时间资源,磁盘资源,I/O等分配给各个进程,从而实现进程之间的切换(因为单CPU的计算机同时只能执行一个进程),进程的调度,以及我要讲的进程间的通信,由于各个用户进程间的地址空间独立,只有内核又单独的地址空间,所以进程间的通信就需要使用到内核机制。

信号:Linux进程间通信的一种方式,是一种“软件中断”,是一种异步进程通信,信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而去处理某一个突发的事件。特点:简单,携带数据量少,优先级高。

PCB:Linux内核的进程控制块PCB是一个结构体task_struct,包含进程的标识号(进程ID,父ID,组ID),处理器状态(寄存器,栈指针),还有就是进程的控制信息,文件描述符表,以及信号相关的信息,主要就是指阻塞信号集和未决信号集,数据类型是sigset_t的数据结构。

信号集:数据类型是sigset_t的数据结构,其实就是一个整数,64位。Linux中有62种信号,每一位取0或1,用来表示每一位信号。未决信号集和阻塞信号集都是内核使用位图机制来实现的。

阻塞信号集:也叫信号屏蔽字段,mask,信号掩码,用某些信号集合来设置阻塞信号集,此信号的位为1,处于阻塞状态,当在收到这个信号的时候,该信号的处理将推后。

未决信号集:信号产生,未决信号集中的描述该信号的的位立刻从0变到1,表示信号处于未决状态,然后去看阻塞信号集此信号位是否阻塞,若不阻塞,则信号被处理,对应位变回0,若阻塞,信号不能抵达,在阻塞解除前,信号处于未决状态,位为1.

发往进程的信号都是源于内核,也就是进程通过内核向异步进程发送信号,下面举个例子来说明工作过程:

用户通过Ctrl+C产生SIGINT使进程产生中断。工作过程:可以把终端看成进程A,需要中断的进程看成进程B,内核调度进程A使用CPU,进程A通过用户的输入Ctrl+C,产生信号SIGINT,这时并不意味着进程B立即捕捉信号然后做出处理,而是信号产生先将内核的未决信号集标志位置为1,然后等待内核调度进程B使用CPU,和阻塞信号集比较,如果此信号处于阻塞状态,信号继续处于未决信号状态,直到解除阻塞,信号被处理,标志位改为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想念你的程客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值