google的: 进程切换比线程切换开销大是因为进程切换时要切页表,而且往往伴随着页调度,因为进程的数据段代码段要换出去,以便把将要执行的进程的内容换进来。本来进程的内容就是线程的超集。而且线程只需要保存线程的上下文(相关寄存器状态和栈的信息)就好了,动作很小
在unix中:
在上面所说的开销中,切换进程上下文开销很小几乎可忽略,而建立映射的开销是很大的。所以我认为线程与进程调度的开销差距主要在于是否需要建立映射。
2楼 @youyongsong 请问您说的建立映射指的是什么映射?
另外,我认为一对多模型应该不用陷入内核是因为这种方法相当于编程语言自己实现的线程功能,这种情况下OS以进程作为最小调度单位,当时间片分给一个进程时,进程利用自己的代码来模拟线程,从而对内核是透明的,内核只看得到一个进程,所以这种方式不用陷入内核态
4楼 @Harrd 刚才自己对你说的三种模型有些误解,刚刚查了一下才明白,谢谢。
对于32位系统每个进程都需要有一个4G的虚拟内存,该虚拟内存映射到物理内存的相应地址上。如果你要切换到的进程还没有建立虚拟内存,那么就需要建立一个4G的虚拟内存并映射到物理内存的相应位置。
5楼 @youyongsong 额 这个东西应该是在第一次创建进程就弄好了,也就是我们所说的页表。最多只是页表中的页可能在磁盘上,需要进行换页。换页的开销确实比较大,毕竟涉及磁盘调度,但这点跟我的问题没啥关系。。
6楼 @Harrd 你问题中一对一时所说的情况不就是我第一条回复中的第4种情况吗,此时的线程切换等同于进程切换,开销是相当的。
切换的开销主要就是看是否需要中断进入内核和是否需要重新建立映射(建立页表)。
其中:
个人观点,有错请提出,谢谢。
8楼 @Harrd 页表的建立不仅是在创建时才进行的,当资源占用内存过多或当前进程需要占用很大内存导致剩余内存无法支持现有操作时,原有的映射就会被撤销(即进程的的部分页表被撤销)以获取空闲内存来支持现有操作,这样重新切换回被撤销映射的进程时就又需要重新建立映射(建立页表)。