首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

进程或线程切换时栈中的内容如何保存的

2013-11-20 
进程或线程切换时栈中的内容怎么保存的?小弟近来疑惑,线程调度时,栈中的内容是怎么保存和恢复的。线程或进

进程或线程切换时栈中的内容怎么保存的?
小弟近来疑惑,线程调度时,栈中的内容是怎么保存和恢复的。

线程或进程切换时,我知道各种寄存器的值会保存到和线程相关的一个数据结构中。当然也保存了堆栈指针的值。但是每个线程都有一个栈。栈中的内容也是先保存再恢复的吗?如果我在栈中开辟了一个比较大的局部数组。那保存和恢复,且不是效率很低?

还是每个线程都有一个栈,它们的栈在不同的地址。所以今次切换时不需要特别保存栈中的内容,只需要保护该线程的栈不被别人访问就是了?
那就和下面这个图一样是吗?
进程或线程切换时栈中的内容如何保存的


同理进程切换时,他堆中申请的内存怎么处理呢?

那是不是所有的线程都有自己的栈空间,而一个进程内的所以进程共享堆空间呢?每个进程都有自己的堆空间?还是所有的进程共享一个堆空间?
[解决办法]
切换堆栈,只要改变寄存器就可以了,不需要操心这么多。
X86 32 Bists
SS  --> 选择子--->段描述表-->(段限,段基址)
CR3 --->页目录,页表 
ESP--> 
EBP-->   

大概只要处理好这些,堆栈就可以顺利切换了

而线程切换时,会切换线程环境--有的翻译为上下文(thread context)
这个操作,就切换了包含以上寄存器,在内的,所有寄存器。


[解决办法]
只要堆栈切换回来了,变量就可以访问了,有何问题。
变量访问,依赖的是段,页,和ESP,EBP 这些寄存器。
当段,页,寄存器切换回来以后,就可以继续访问变量了。 
 


 
[解决办法]
堆栈中的变量是通过ESP,EBP这两个寄存器访问的。
[解决办法]
这其实和参数传递有点相似,只需要传递地址就够了。
ESP,EBP 正式 堆栈指针寄存器。
变量通过ESP,EBP 两个指针 加偏移量访问。

[解决办法]

引用:
Quote: 引用:

堆栈中的变量是通过ESP,EBP这两个寄存器访问的。

那就是说栈中的变量还是在那里,每个线程都有自己的栈空间,它们互不冲突。所以变量线程切换时栈中的变量不需要动?

对呀!

热点排行