linux内核进程/用户进程的几个疑问和自己的理解,欢迎指点
刚进入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的关系,那么两者矛盾。