Linux驱动(三)——内核线程

 

 

Linux驱动(三)——内核线程

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

 

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

  1. kthread_create() -> wake_up_process() -> kthread_stop()/do_exit()
  2. kthread_run() -> kthread_stop()/do_exit()
  3. 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()时设置
三、注意事项
  1. 在调用kthread_stop函数时,线程函数不能已经运行结束,否则kthread_stop函数会一直进行等待
  2. 线程函数必须能让出CPU,以便能运行其他线程,同时线程函数也必须能重新被调度运行,可以通过schedule_timeout()实现
  3. 卸载驱动之前,需要先停止内核线程,否则可能会导致内核OOPS
四、性能测试
    可以使用top命令来查看线程(包括内核线程)的CPU利用率,命令如下:
        top -p 线程号
    可以使用下面命令来查找线程号:
        ps aux|grep 线程名
 

参考文献:

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值