任何硬件都会发生中断,即使当前任务并没有进行中断,也会有专门的一个模块负责每秒钟发出几千甚至更多中断。例如打印一个 Hello World ,屏幕上看上去好像一闪而过,没有打断,但其实它已经被中断了很多次
信号的不可靠:
是指信号的行为不可靠,因为执行现场不是我们布置的,而是由内核布置的,所以有可能第一次调用还没有结束的时候,就发生了第二次调用。
可重入函数:就是为了解决信号的不可靠
第一次调用还没有结束的时候,就发生了第二次调用,但是不会出错,这样的函数叫做 可重入函数。所有的系统调用都是可重入的,一部分库函数也是可重入的,比如:memcpy()。
内核为每个进程都维护了两个位图:
信号屏蔽字 mask :用来表示当前信号的状态,mask初始值一般全部都是 1
pending位图: 用来记录当前进程收到哪些信号,一般初始值全部都是 0 ,信号来了为 1
位图概念回顾:
位图
理论上讲,mask 和 pending 都是32 位的,因为Unix规定的标准信号是32 位
lernal:内核
这个图是以进程为单位画的示意图,而实际上这些应该是细化成线程来调度
如图,main函数执行打印十个 * 的任务,在接到 handler 这个信号的时候打印一个 !
执行过程:
**!*…
过程细解:
点此