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