HaFoLuoKe 发表于 2012-07-13 15:11

问个信号处理的问题

匆匆读过2本linux内核书,但是关于信号处理一直不得要领。望指教一二:

1个是信号处理和软中断的区别的问题,我理解是这样的:
软中断是全局的,而信号是针对每个进程的,每个进程在调用内核函数返回的时候就检查当前进程有没有信号,如果有就调用信号处理函数。

但是这样就会带来另一个问题:
信号应该是可以中断睡眠的,如果一个进程睡眠,那么它根本没有时间片,那么也不存在它调用内核函数只说,那么信号是如何中断睡眠的呢?
是不是内核在某个特定的时期会扫描所有进程,然后唤醒收到信号的睡眠进程,并且分配时间片,再在以后的调度中执行它呢?(当然这里的睡眠都是可中断睡眠)

如果是第二个假设,那么是不是说,中断处理程序总是会先于用户程序得到执行呢,试想内核在某个时期发现有个进程信号,不管这个信号是否睡眠,然后将来最优先处理的一定是信号处理程序,并且消耗该进程的时间片,是不是这样呢?

liuchang8877 发表于 2012-07-13 16:26

本帖最后由 liuchang8877 于 2012-07-13 16:29 编辑

我觉得 应该根据信号和 睡眠的 优先级 来判断这个这有一篇http://www.cnblogs.com/Huayuan/archive/2012/05/01/2477686.html可以参考下
还有一个对 信号 讲的 恨透彻 http://blog.csdn.net/lichaoandy/article/details/5543713    新手,说的 不好请见谅。:D

HaFoLuoKe 发表于 2012-07-13 17:39

回复 2# liuchang8877


    多谢。我也是初学者,大家一起学习呵呵。
我在提问中说了睡眠都是针对可中断睡眠。
我看了你的文章,理解是这样的,当一个信号产生的时候,Linux的内核会给目标进程设置信号位,这个时候如果进程是可中断睡眠,则唤醒进程,设置时间片等。
然后在将来某次调度的时候进程会正常执行。
在这个执行过程中,当进程从内核态向用户态转变时,就会执行中断处理程序。

liuchang8877 发表于 2012-07-13 17:49

HaFoLuoKe 发表于 2012-07-13 17:39 static/image/common/back.gif
回复 2# liuchang8877


学习了,关键是在理解 信号是进程在什么时候接到并处理。 这个时间是关键,就是你说的 内核态 到用户态的转变 这个时间。

ilogo1 发表于 2012-12-31 10:08

要研究内核,关键是两个字"细节",没像你那么讲的那么粗放,你的描述上有问题,内核是在恢复用户态下的执行前检查TIF_SIGPENDING,调用内核函数返回,离处理信号还有很多事情要做。。
发信号给进程,都要提供接收信号的进程pid,进程在睡眠中,能不能被 这个信号唤醒,取决于进程的TASK_INTERUPTBLE,TASK_UNINTERUPTBLE,对于睡眠的进程,内核会为这个进程记录这个信号的。。
其实信号也是一种特殊的中断,信号的产生,进程并不能立即响应的(当然不是用户感受级),但是中断的产生是在指令级间得到响应,通常意义上的中断并不会中断睡眠的进程。信号的响应相对来说是很lazy的,内核对待处于用户态的进程都是很lazy的啦。。。但对外设好可是亲爹啊,,给以指令级的响应。
HaFoLuoKe 发表于 2012-07-13 15:11 static/image/common/back.gif
匆匆读过2本linux内核书,但是关于信号处理一直不得要领。望指教一二:

1个是信号处理和软中断的区别的问 ...

meiyuhan 发表于 2013-01-01 11:28

哪个呦,发这么好的帖子,顶你
页: [1]
查看完整版本: 问个信号处理的问题