免费注册 查看新帖 |

Chinaunix

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

SIGKILL信号是如何中止内核线程的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-28 01:41 |只看该作者 |倒序浏览
信号的传递(处理)总是在从中断或异常返回到用户的前夕:
resume_userspace()->work_pending->do_notify_resume()->do_signal()
内核线程根本就不会进入resume_userspace()也就不会有信号的传递,那发往内核线程的SIGKILL是如果终止内核线程的??

论坛徽章:
0
2 [报告]
发表于 2008-10-28 17:11 |只看该作者
怎么终止内核线程的?signal -SIGKILL 内核线程号吗?还是用signal函数的?
signal是内核中的函数?

论坛徽章:
0
3 [报告]
发表于 2008-10-28 17:24 |只看该作者
在中断或异常返回到用户的前夕。

这个时候会调用 resume_userspace

这个不就是答案吗?

论坛徽章:
0
4 [报告]
发表于 2008-10-28 18:10 |只看该作者
原帖由 xpl 于 2008-10-28 17:24 发表
在中断或异常返回到用户的前夕。

这个时候会调用 resume_userspace

这个不就是答案吗?


内核线程没有用户态,不会调用resume_userspace(),也就不会执行do_signal()函数

论坛徽章:
0
5 [报告]
发表于 2008-10-28 19:24 |只看该作者
原帖由 mars007 于 2008-10-28 18:10 发表


内核线程没有用户态,不会调用resume_userspace(),也就不会执行do_signal()函数


kernel thread应该不是通过signal机制来结束的吧
比如ksoftirqd/n这个kernel thread执行的函数就是ksoftirqd(),是一个循环
205         while (!kthread_should_stop()) {
                //do something
216         }
其他的也是这样的
而kthread_should_stop()的定义如下
47 int kthread_should_stop(void)
48 {
49         return (kthread_stop_info.k == current);
50 }
其中kthread_stop_info是一个全局变量,那么应该是要kill一个kernel thread的时候,将kthread_stop_info.k设置为kernel thread的process descriptor就行了
------------------------------------------------------
为什么要这么实现?
个人认为kernel thread本身就不应该在exception或者interrupt返回时处理signal,因为此时kernel thread本身就在kernel mode中可能请求了kernel中的各种lock,interrupt/exception随时可能发生,如果返回是导致kernel thread结束,此时lock还没有释放,肯定是不行的。而while()循环保证所有lock都释放之后,才判断是否应该要终止kernel thread。
普通的process返回到user mode时肯定已经释放了lock,此时终止是安全的。

论坛徽章:
0
6 [报告]
发表于 2008-10-28 19:29 |只看该作者

回复 #4 mars007 的帖子

省得麻烦就不叫线程、进程了,统统叫进程。

内核里进程间要切换的,切换后进程会扫描,看是否收到信号。印象中的,待确认,linux内核源码情景分析中有关于信号的讨论的。

论坛徽章:
0
7 [报告]
发表于 2008-10-28 20:20 |只看该作者

回复 #5 Kasulle 的帖子

Kasulle兄扯远了

比如在shell中ps -el | grep klogd找到内核线程klogd的PID,然后kill -9 PID 是可以杀死klogd的,我只想知道内核是如何杀死klogd的??

论坛徽章:
0
8 [报告]
发表于 2008-10-28 20:35 |只看该作者

回复 #7 mars007 的帖子

我在6楼的答复对于进程间切换时处理信号不是很准确。而对于Kasulle 兄关于锁的疑惑也想尝试解答一下,有不准确的地方大家一起讨论。:wink:

首先对于信号的检测与相应总是发生在核内的,在两种情况时:
1、从核内返回到核外前夕;
2、睡眠进程被唤醒的时候;

对于核外信号的使用才signal,核内投敌信号的接口是 force_sig。信号无论核内核外都是存在的。

在核内,某进程检测收到KILL信号后直接将自己的状态置为STOP。
这时它还会通知父进程为自己收尸。父进程得到通知后来释放子进程占用的各种资源,相信这个时候也把子进程申请得到的锁给释放了。

论坛徽章:
0
9 [报告]
发表于 2008-10-28 21:10 |只看该作者
在核内,某进程检测收到KILL信号后直接将自己的状态置为STOP。


内核哪部分代码做了这个操作,望samon_fu兄指出

论坛徽章:
0
10 [报告]
发表于 2008-10-29 08:54 |只看该作者
原帖由 mars007 于 2008-10-28 20:20 发表
Kasulle兄扯远了

比如在shell中ps -el | grep klogd找到内核线程klogd的PID,然后kill -9 PID 是可以杀死klogd的,我只想知道内核是如何杀死klogd的??


klogd本来就是一个用户deamon,何来的内核线程???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP