一、信号会在合适的时候被处理
先摆出一个结论:信号会在合适的时候被处理。
当然,这里说的信号默认排除了实时信号,那个是已接收到信号就立马处理信号。
上面说的合适的时候其实就是进程从内核态切换到用户态的时候。
二、何为内核态和用户态
先初步理解一下:
内核态:执行os代码时所处的状态。
进程态:执行自己写的代码时所处的状态。
这两个状态的存在并不奇怪,但是为什么这两个东西会相互切换、不应该就是两个互不关联的东西吗?进程之心任务,操作系统管理进程。
三、为什么要有内核态和用户态
以下例子默认为在32位机器上。
这是我们理解的进程虚拟地址空间 :
但我们不知道的是,这知识0~3G(32位机器2^32bit)的空间,还有1G的空间没有被描述出来,下图才是他的完整面貌:
内核区存放的都是操作系统内核的代码和数据,包括系统调用、中断处理程序、驱动程序、进程控制块等。内核空间是操作系统独有的内存空间,只能被内核访问,用户程序无法直接访问内核空间,必须通过系统调用接口间接访问。由于内核空间只能被内核访问所以内核被很好的保护起来了。
相对应的,这两个空间有两个页表,互不干扰。
讲一下这个过程是如何被运用的:
就是一个进程正常执行的时候只在0~3G的范围操作,当他需要调用系统函数的时候,进程就会被操作系统从用户态就会切换到内核态。具体在硬件上是如何切换的,cpu有一个CR3寄存器,当存放的是3时就表示该进程为用户态,存放的是0就表示该进程为内核态。
成为内核态之后,进程就会去内核空间调用内核代码执行操作,执行完操作之后,进程就要切换回用户态了,但是在此之前,系统会检查一下是否接受到了信号,如果有就先执行这个信号对应的相应操作。这也就是上文提到的合适的时候。
这时候有些同学可能就会说要转空自了:那我写代码不写系统调用,然后给他发送信号岂不是它也不知道?
要解决这个问题,我们要先知道,os的本质是什么————其实就是一个软件。每次开机被从内存中加载出来,这个软件说到底不就是一个死循环嘛。你这电脑放在那里一天两天不管他也不会自己结束,就在那里等待你的指令。
没有指令就会在每次循环的时候自己维护一下进程什么的,有些自己的任务,这其中就有一个os时钟硬件,每个一段很短的时间就会给os发送一个时钟中断,os就要执行一个中断任务——检测当前进程的时间片,这个过程就会调用一个系统函数schedule()函数(这个过程就是,一个进程侄一次只能占用cpu段很短的时间,时间到了就要被调度,切换到其他的进程),这里就会有一次内核态到用户态的切换动作。