您的位置:首页 > 运维架构 > Linux

Linux内核线程

2016-06-27 09:29 1016 查看
Linux内核线程

小狼@http://blog.csdn.net/xiaolangyangyang

一、内核线程的创建、运行及结束:

kthread_create() -> wake_up_process() -> kthread_stop()/do_exit()
kthread_run() -> kthread_stop()/do_exit()
kernel_thread() -> daemonize() -> completion() -> wake_up_process() -> kthread_stop()/do_exit()
    kthread_stop:设置线程的退出标记(线程函数内应用int kthread_should_stop(void)函数,当返回真时应退出函数),kthread_stop会一直等待至线程结束,线程结束前会发送完成结束给kthread_stop,如果直接使用do_exit直接退出线程那么kthread_stop不会收到完成信号将一直等待下去。如果线程已经退出那么kthread_stop会先设置退出标记再唤醒一下thread,唤醒线程后会判断退出标记因此设定的处理函数不会被调用。如果线程已经被唤醒并已经退出那么kthread_stop会一直等待

二、kthread_should_stop与kthread_stop之间关系
    外界调用kthread_stop()删除线程,kthread_stop首先设置结束标志should_stop,然后调用wake_for_completion(&kthread->exited)上,这个其实是新线程task_struct上的vfork_done,会在线程结束调用do_exit()时设置

三、注意事项

在调用kthread_stop函数时,线程函数不能已经运行结束,否则kthread_stop函数会一直进行等待
线程函数必须能让出CPU,以便能运行其他线程,同时线程函数也必须能重新被调度运行,可以通过schedule_timeout()实现
卸载驱动之前,需要先停止内核线程,否则可能会导致内核OOPS

四、性能测试
    可以使用top命令来查看线程(包括内核线程)的CPU利用率,命令如下:

        top -p 线程号

    可以使用下面命令来查找线程号:

        ps aux|grep 线程名

参考文献:
linux驱动学习之内核线程分析

kthread_create 简单使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息