linux内核进程/用户进程的几个疑问和自己的理解,欢迎指点

martingod 2012-02-29 04:15:47
刚进入linux开发不是很久,以前做vx比较多点,最近项目中对于多线程和多进程的争论比较多,因此google了一些linux下的进程线程的东西,有点自己的理解,不知道是否正确,希望各位指点下。

以下是一点个人的理解:
linux内核中定义了kernel thread(有人叫内核进程也有人叫内核线程,弄得我很晕),这个是内核进行调度的基本单位,高层开发创建的线程和进程都是用户态的,其中用户态线程和kernel thread存在映射的关系。从我google到的资料来看,似乎早期的linux版本中,用户态线程与kernel thread是N对1的关系,也就是在用户态又做了一个二次调度,所以早期如果同一个进程下的一个用户态线程阻塞了,其他的线程都会得不到调度。后来linux重写了其用户态线程库以及内核代码,现在主流应该是1对1的关系,当然可能还取决于内核版本和用户态线程库的版本。

个人的疑问:
1、kernel thread到底是线程还是进程的形式?如果是线程形式,那么不同的kernel thread应该地址空间是共享的,就像同一个用户进程下的不同线程可以直接访问其全局变量。
2、如果是进程的形式,那么不同的kernel thread的地址空间是隔绝的,不允许直接访问。但是同一个用户进程下的不同用户线程的地址空间又是可以直接访问的,那么如果用户态线程和kernel thread是1对1的关系,那么两者矛盾。


...全文
790 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wotaiha99 2013-09-27
  • 打赏
  • 举报
回复
linux系统32位内核虚拟地址空间共有4G,高地址1G是内核空间,剩下3个G才是用户空间,当我们进行系统调用时,我进入到内空间这时内核会为该进程分配一个内核线程。由于多个进程高1G 的虚拟内存映射的,物理地址空间是相同(及内核空间)。所以说多个任务,看到内核是同一个内核,内核线程用的还是进程的虚拟地址空间。所以说他是线程,只不过所有用户进程用高1G空间,映射的物理地址是同一块,所以内核才能为多个进程服务。
scdxmoe 2012-09-07
  • 打赏
  • 举报
回复
有点复杂 ,学习一下
imtransfer 2012-06-06
  • 打赏
  • 举报
回复
我也不理解 来看看
martingod 2012-03-06
  • 打赏
  • 举报
回复
各位的答复很受用,疑惑解决。看样子要想有深刻理解,还是需要去耐心读下内核源码。
wen_kernel 2012-03-02
  • 打赏
  • 举报
回复
对,你对kernel space 和 user space没有理解。
32位系统,0 to 3GB地址属于usper space, 3GB to 4GB属于kernel space,有一个例外:硬件平台支持PAE(物理地址扩展)。

用户态的进程当执行系统调用时,会进入到kernel space里。记住,kernel thread永远在kernel space里运行。

轻量级的进程只是一个术语,仅此而已。是相对于普通的(重量级)进程而言。创建普通的里程需要的系统开销比轻量级的进程更大。不用太在意这些表面的术语。

有些知识需要系统化的去学习、理解。
martingod 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wenxy1 的回复:]

只有Linux kernel thread(内核线程)这个术语。
[/Quote]
为何还有轻量级进程的说法,很容易让人感觉混乱。。。。。。
lvyinghong 2012-03-01
  • 打赏
  • 举报
回复
表示和原有的进程共享用户空间内存的。
lvyinghong 2012-03-01
  • 打赏
  • 举报
回复
一个 进程运行时,有两种执行环境,用户部分和内核部分。也许这就是你说的用户进程和内核进程一一对应的关系。 其实应该是一个进程,内核执行时,看到的tast sttruc是一样的,只是说他在不同的地方执行而已。

我一开始还以为你是说在内核代码里面用kernel_thread 函数自己在内核建一个线程! 看代码,这个内核kernel_thread调用 do-fork()是有CLONE_VM标志的,表示和原有的共享用户空间内存的。

一旦用户程序进入内核之后,内核里面应该很少访问用户空间的虚拟内存了。你可以认为不管什么进程,来到内核态之后,所有的内核空间执行的代码,看到的都是相同的一个内核内存地址范围的。所有的代码都在同一个环境里面运行。
Wenxy1 2012-03-01
  • 打赏
  • 举报
回复
只有Linux kernel thread(内核线程)这个术语。
bjtea 2012-03-01
  • 打赏
  • 举报
回复
linux下的内核进程称为轻量级进程,每个进程下仅对应一个用户线程;
用户级同一进程下的多个线程,被一一映射到具有相同ID的多个内核进程下。由于具有相同的ID,所以,这些进程可以共享文件和内存等资源。也就是说,LINUX中,ID相同的进程间调度切换时,不需要切换上下文。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧