当前位置: 技术问答>linux和unix
linux内核线程的问题?
来源: 互联网 发布时间:2016-05-05
本文导语: 学习linux的内核时我看到两句话 1,mm_struct *mm mm_struct数据结构是描述内存存储信息的数据结构,进程控制块task_struct中用mm指针指想mm_struct数据结构.也就是在进程的属性中通过mm指针来管理起对应的内存区. mm_struct *a...
学习linux的内核时我看到两句话
1,mm_struct *mm mm_struct数据结构是描述内存存储信息的数据结构,进程控制块task_struct中用mm指针指想mm_struct数据结构.也就是在进程的属性中通过mm指针来管理起对应的内存区.
mm_struct *active_active 内核线程用来指向调用它的普通进程的内存地址空间.当普通进程在运行时如果发生系统调用,程序就会从用户态转为内核态,内核态中执行的是内核线程,内核线程没有内存空间地址结构mm_struct,当他需要内存空间地址的时候就会调用用户态对应进程的用以空间地址结构mm_struct.内核线程就是就是通过active_mm指针来指向用户态进程的mm_struct结构.
2,内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下文”(借用调用它的用户进程的上下文),所以同样被进程调度程序调度,也可以睡眠——它和用户进程属性何其相似,不同之处就在于内核线程运行于内核空间,可访问内核数据,运行期间不能被抢占
我已经大致理解了kernel_thread创建的内核线程和在内核中实现的用户线程的区别
但是我对上面标红色字体的两句话不太理解,
第一句红色话不太懂,执行系统调用怎么和内核线程扯上了关系?
第二句指的内核线程又是什么,我只听说过kernel_thread创建的内核线程在执行时会借用上一个进程的mm_struct结构,这个借用调用它的用户进程的上下文是什么意思?
小弟初学linux内核,希望能得到大家的指点,先在此谢过了
1,mm_struct *mm mm_struct数据结构是描述内存存储信息的数据结构,进程控制块task_struct中用mm指针指想mm_struct数据结构.也就是在进程的属性中通过mm指针来管理起对应的内存区.
mm_struct *active_active 内核线程用来指向调用它的普通进程的内存地址空间.当普通进程在运行时如果发生系统调用,程序就会从用户态转为内核态,内核态中执行的是内核线程,内核线程没有内存空间地址结构mm_struct,当他需要内存空间地址的时候就会调用用户态对应进程的用以空间地址结构mm_struct.内核线程就是就是通过active_mm指针来指向用户态进程的mm_struct结构.
2,内核线程可以理解成在内核中运行的特殊进程,它有自己的“进程上下文”(借用调用它的用户进程的上下文),所以同样被进程调度程序调度,也可以睡眠——它和用户进程属性何其相似,不同之处就在于内核线程运行于内核空间,可访问内核数据,运行期间不能被抢占
我已经大致理解了kernel_thread创建的内核线程和在内核中实现的用户线程的区别
但是我对上面标红色字体的两句话不太理解,
第一句红色话不太懂,执行系统调用怎么和内核线程扯上了关系?
第二句指的内核线程又是什么,我只听说过kernel_thread创建的内核线程在执行时会借用上一个进程的mm_struct结构,这个借用调用它的用户进程的上下文是什么意思?
小弟初学linux内核,希望能得到大家的指点,先在此谢过了
|
当普通进程在运行时如果发生系统调用,程序就会从用户态转为内核态,内核态中执行的是内核线程,
因为系统调用时内核会创建一个针对于系统调用的内核线程,这个线程执行该系统调用相应的例程,比如说你的进程调用SYSTEM函数,你的进程将进入等待状态,内核创建内核线程,在这个内核线程中执行这个SYSTEM相对应的例程,执行完毕后,将执行结果返回用户态,你的进程恢复执行
因为系统调用时内核会创建一个针对于系统调用的内核线程,这个线程执行该系统调用相应的例程,比如说你的进程调用SYSTEM函数,你的进程将进入等待状态,内核创建内核线程,在这个内核线程中执行这个SYSTEM相对应的例程,执行完毕后,将执行结果返回用户态,你的进程恢复执行
|
当普通进程在运行时如果发生系统调用,程序就会从用户态转为内核态,内核态中执行的是内核线程,内核线程没有内存空间地址结构mm_struct,当他需要内存空间地址的时候就会调用用户态对应进程的用以空间地址结构mm_struct.内核线程就是就是通过active_mm指针来指向用户态进程的mm_struct结构.
红色部分不知道你的理解是否有误,应该这么理解:
普通进程发生系统调用确实是从用户态转入内核态,它还是普通进程,并不是什么内核线程,内核线程也确实只能在内核态中执行。普通进程在内核态运行时不管因为什么原因都有可能交出CPU使用权(主动睡眠或被抢占),接替它的进程就可以是内核线程(内核中对线程或进程实际上是等同视之的,调度也一样),这个时候就出现了这么一个active_mm的指针用来指向交出CPU使用权的普通线程的mm_struct结构,这个指针有一个非常重要的作用——延迟刷TLB,幸运的话,甚至可以不刷。这是一个性能上的优化,因为本内核线程执行完之后,原来的普通线程可以有机会不用再填充TLB。
第二段话跟这个是有关系的,把普通进程和内核线程的概念区分清楚就行了。
另外建议看英文版的书,中文翻译总让人有些担心。
红色部分不知道你的理解是否有误,应该这么理解:
普通进程发生系统调用确实是从用户态转入内核态,它还是普通进程,并不是什么内核线程,内核线程也确实只能在内核态中执行。普通进程在内核态运行时不管因为什么原因都有可能交出CPU使用权(主动睡眠或被抢占),接替它的进程就可以是内核线程(内核中对线程或进程实际上是等同视之的,调度也一样),这个时候就出现了这么一个active_mm的指针用来指向交出CPU使用权的普通线程的mm_struct结构,这个指针有一个非常重要的作用——延迟刷TLB,幸运的话,甚至可以不刷。这是一个性能上的优化,因为本内核线程执行完之后,原来的普通线程可以有机会不用再填充TLB。
第二段话跟这个是有关系的,把普通进程和内核线程的概念区分清楚就行了。
另外建议看英文版的书,中文翻译总让人有些担心。
|
红字部分是这样理解的:
1.一个用户层进程在执行系统调用时进入内核态执行用户层进程对应的内核线程。
2.如果是在内核态创建的内核线程他会借用其他的用户层的进程上下文。
1.一个用户层进程在执行系统调用时进入内核态执行用户层进程对应的内核线程。
2.如果是在内核态创建的内核线程他会借用其他的用户层的进程上下文。