免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2039 | 回复: 5
打印 上一主题 下一主题

[内核入门] 关于signal [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-17 16:42 |只看该作者 |倒序浏览
signal是在由内核态返回用户态的时候检测的,如果用户态的进程有signal需要处理,那么先切换到用户态执行该signal的handler,执行完以后,再切换回
内核态,之后再完成内核态到用户态的切换

我的问题是:
1)假如该进程有多个signal需要处理,是一次性处理完,还是每次仅仅处理一个?
    我看代码,感觉是一次仅仅处理一个?
2)大家知道,在由内核态返回用户态的时候,是可能会重新调度的,那么signal的处理在前还是重新schedule在前呢?  
    我感觉是先schedule,然后轮到该进程执行的时候,再处理属于该进程的signal,因为信号是异步的,linux无法保证其实时性。

请指教!谢谢

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
2 [报告]
发表于 2013-04-18 14:26 |只看该作者
本帖最后由 daniel_11 于 2013-04-18 14:27 编辑

尝试回答下:
1)是的
2)贴个arm的

  1. work_pending:
  2.         tst     r1, #_TIF_NEED_RESCHED
  3.         bne     work_resched               ====>schedule
  4.         tst     r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME
  5.         beq     no_work_pending
  6.         mov     r0, sp                          @ 'regs'
  7.         mov     r2, why                         @ 'syscall'
  8.         bl      do_notify_resume              ====>signal check
  9.         b       ret_slow_syscall                @ Check work again

  10. work_resched:
  11.         bl      schedule
复制代码

论坛徽章:
0
3 [报告]
发表于 2013-04-18 17:25 |只看该作者
谢谢楼上。
1)get_signal_to_deliver->dequeue_signal中有相关的处理,挑选出需要处理的一个信号,挑选规则我没有深究。
2)明了。调度优先

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-04-18 19:46 |只看该作者
回复 2# daniel_11
多谢分享

   

论坛徽章:
0
5 [报告]
发表于 2013-04-20 21:48 |只看该作者
本帖最后由 Morphad 于 2013-04-20 21:51 编辑
1)假如该进程有多个signal需要处理,是一次性处理完,还是每次仅仅处理一个?
    我看代码,感觉是一次仅仅处理一个?

在不重新调度的情况下,会把信号处理完:
resume_userspace->work_notifysig->do_notify_resume->do_signal(当有信号pending时)-> get_signal_to_deliver->dequeue_signal->recalc_sigpendin-> recalc_sigpending_tsk
当还有信号pending时recalc_sigpending_tsk会将TIF_SIGPENDING置位,重新再次走到resume_userspace;
循环直到pending singal处理完成

2)大家知道,在由内核态返回用户态的时候,是可能会重新调度的,那么signal的处理在前还是重新schedule在前呢?  
    我感觉是先schedule,然后轮到该进程执行的时候,再处理属于该进程的signal,因为信号是异步的,linux无法保证其实时性

  1. ENTRY(resume_userspace)
  2.         LOCKDEP_SYS_EXIT
  3.         DISABLE_INTERRUPTS(CLBR_ANY)        # make sure we don't miss an interrupt
  4.                                         # setting need_resched or sigpending
  5.                                         # between sampling and the iret
  6.         TRACE_IRQS_OFF
  7.         movl TI_flags(%ebp), %ecx
  8.         andl $_TIF_WORK_MASK, %ecx        # is there any work to be done on
  9.                                         # int/exception return?
  10.         jne work_pending
  11.         jmp restore_all
  12. END(ret_from_exception)

  13. work_pending:
  14.         testb $_TIF_NEED_RESCHED, %cl
  15.         jz work_notifysig
  16. work_resched:
  17.         call schedule
复制代码
call schedule可以看出需要调度时,会先调度的

论坛徽章:
0
6 [报告]
发表于 2013-04-23 14:31 |只看该作者
回复 5# Morphad
多谢对问题1)的更正。看楼主应该是x86的平台。

总结:
a.信号的检测处理是在返回内核态之前执行的,检测的标志就是_TIF_SIGPENDING
b.如果发生重新调度,即_TIF_NEED_RESCHED置位,则本次先调度,等下次再检测是否有机会处理信号

c.
  1>如果不发生重新调度的情况,即_TIF_NEED_RESCHED没有置位,则挑选一个合适的信号,并处理该信号,
2>检测是否还有信号需要处理,有的话,设置_TIF_SIGPENDING
  3>循环1-3步骤,直到所有信号处理完,即_TIF_SIGPENDING被clear. 当然,若再次检测_TIF_NEED_RESCHED,要重新调度,就调度去了,剩余的信号等到下次再处理。

谢谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP