目录
前序:
信号流程图:
pending表(信号未决表
block表(信号阻塞表
handler表(信号递达表
小知识点
1:handler保存的是什么
前序:
进程信号中的三大表格
首先在了解进程信号中的三大表格之前我们必须知道3个概念:
1、信号递达(Delivery):信号递达指的是进程实际执行信号的处理动作。
2、信号未决(pending):信号从产生到递达之间的状态。
3、阻塞(block):进程可以选择阻塞一个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对该信号的阻塞,才能执行递达的动作。
信号流程图:
信号的流程
pending表(信号未决表
这是一个位图,存在32位与64位图,我们用32位做讲解。也是个位图结构
信号写入pending表,将对应的位图(2号信号,第2位比特位)反转位为1。
block表(信号阻塞表
也是一个位图结构来保存数据。
进程接收信号写入pending表后,会检查同位置的block表的比特位,为一阻塞,为零执行信号行为。
handler表(信号递达表
这可就不是位图了,他是一个结构体数组里面保存着,这个每一个元素对应着一个信号执行方式
有一个地方值得注意,当我们信号执行完毕后,对应在pending表的信号位会恢复为0;
小知识点
1:handler保存的是什么
handler保存的是一个结构体,我们自定义了某个信号的自定义行为其实就是吧结构体里信号行为指针指向了自定义的函数,但是信号的默认地址并不会呗覆盖。
改变信号行为就是将自己的函数写入自定义函数地址,然后用函数指针指向自定义函数
大致行为就是
结构体中可能保存了自定义函数地址的指针变量,也可能只是行为函数指针指向函数地址,运行被下一个地址覆盖。
2、什么是信号在合适的时候执行
结论:在内核态中,从内核态返回用户态的时候,进行信号检测和处理
每个进程都有分用户态与内核态,在CPU中有个内用寄存器,保存着当前进程状态的寄存器,他也是个位图,该位图在某个比特位保存当前进程的运行态。
为什么会陷入内核态?执行系统调用,缺陷陷阱异常等等,我们的进程就会陷入内核态。
如何陷入呢?在汇编指令中有个int 80(不是整型int),他会改变状态寄存器记录运行态的比特位,当执行系统函数内前几句会执行该指令,将运行状态改变,进程陷入内核态,在进程出该系统函数前会再次调用int80 ,回到我们的用户态环境。
3:操作系统其实也是通过进程中跑的
在进程的虚拟内存地址空间中3~4G内存存储着内核代码与数据。当我们系统调用的时候其实也是从地址空间的0~3G跳转到3~4G中,然后通过内核的页表,去物理地址访问数据。
我们在执行open函数:
在用户态调用open--->jump到内核态--->通过内核页表找到OS的open代码数据执行。
进程切换其实就是2个进程见内核间的互动。先在被占进程的内核地址中跑,然后再在占领进程的内核中跑