捕捉信号/信号的处理步骤

一、信号会在合适的时候被处理

先摆出一个结论:信号会在合适的时候被处理

当然,这里说的信号默认排除了实时信号,那个是已接收到信号就立马处理信号。

上面说的合适的时候其实就是进程从内核态切换到用户态的时候。

二、何为内核态和用户态

先初步理解一下:

内核态:执行os代码时所处的状态。

进程态:执行自己写的代码时所处的状态。

这两个状态的存在并不奇怪,但是为什么这两个东西会相互切换、不应该就是两个互不关联的东西吗?进程之心任务,操作系统管理进程。

三、为什么要有内核态和用户态

以下例子默认为在32位机器上。

这是我们理解的进程虚拟地址空间 :

但我们不知道的是,这知识0~3G(32位机器2^32bit)的空间,还有1G的空间没有被描述出来,下图才是他的完整面貌:

 内核区存放的都是操作系统内核的代码和数据,包括系统调用、中断处理程序、驱动程序、进程控制块等。内核空间是操作系统独有的内存空间,只能被内核访问,用户程序无法直接访问内核空间,必须通过系统调用接口间接访问。由于内核空间只能被内核访问所以内核被很好的保护起来了。

相对应的,这两个空间有两个页表,互不干扰。

讲一下这个过程是如何被运用的:

就是一个进程正常执行的时候只在0~3G的范围操作,当他需要调用系统函数的时候,进程就会被操作系统从用户态就会切换到内核态。具体在硬件上是如何切换的,cpu有一个CR3寄存器,当存放的是3时就表示该进程为用户态,存放的是0就表示该进程为内核态

成为内核态之后,进程就会去内核空间调用内核代码执行操作,执行完操作之后,进程就要切换回用户态了,但是在此之前,系统会检查一下是否接受到了信号,如果有就先执行这个信号对应的相应操作。这也就是上文提到的合适的时候。

这时候有些同学可能就会说要转空自了:那我写代码不写系统调用,然后给他发送信号岂不是它也不知道?

要解决这个问题,我们要先知道,os的本质是什么————其实就是一个软件。每次开机被从内存中加载出来,这个软件说到底不就是一个死循环嘛。你这电脑放在那里一天两天不管他也不会自己结束,就在那里等待你的指令。

没有指令就会在每次循环的时候自己维护一下进程什么的,有些自己的任务,这其中就有一个os时钟硬件,每个一段很短的时间就会给os发送一个时钟中断,os就要执行一个中断任务——检测当前进程的时间片,这个过程就会调用一个系统函数schedule()函数(这个过程就是,一个进程侄一次只能占用cpu段很短的时间,时间到了就要被调度,切换到其他的进程),这里就会有一次内核态到用户态的切换动作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一周学八天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值