zoukankan      html  css  js  c++  java
  • Linux内核线程的思考与总结

    1、内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也参与内核抢占。

         这个进程的特别之处有两点,第一、该进程没有前台。第二、永远在内核态中运行。

    2、创建内核线程有两种方法,一种是 kthread_create() ,一种是 kernel_thread() ,两种有什么区别?使用场景分别是什么?

         http://www.cnblogs.com/sky-heaven/p/5395864.html

    3、内核线程既然也是进程,那么新创建出来的内核线程,用户是谁?所属哪个组?

      

    4、内核线程的父进程PPID,有的为0,有的为2,绝大部分是2,是什么含义?

      

      解答:仔细观察得知,既然PPID是2,那么进程ID为2的内核线程是谁?从上图可以看到,它是kthreadd线程,该线程启动后,在这个线程的运行期间,

      会去启动其他内核线程,代码如下:

      文件:kthread.c (kernel) 

      内容:

        

      源码解析:可以看出,kthread_create_list是需要创建内核线程的列表,一定有一个函数供其他模块调用,往这个列表中增加内容。

      那么,kthreadd本身在哪里启动的呢?见下面的rest_init函数实现。

       

        

    5、既然每个内核线程都是一个进程,进程的地址空间是互相隔离的,为何说所有的内核线程共享同一个地址空间?

       同样的问题,在Linux用户态编程中,线程也是通过进程控制块的方式管理的,他们如何实现共享地址空间的呢?

       (待补充)

    6、kernel_thread()的关键是调用在内核中实现的 do_fork(),核心本质上还是一个进程。

  • 相关阅读:
    Hibernate HQL查询:
    Struts2里如何取得request,session,application
    Hibernate 报错org.hibernate.PropertyAccessException: IllegalArgumentException(已解决)
    PHP 读取文件的几种方法
    PHP 关于文件操作的简单介绍
    VB 中ListView 某一列的颜色添加不上去的解决方法
    SQL Server 版本号汇总
    C# 单元测试
    Web Api单元测试写法
    git bash 出现vim的时候怎么退出
  • 原文地址:https://www.cnblogs.com/zhouhaibing/p/7898758.html
Copyright © 2011-2022 走看看