进程或线程切换时栈中的内容怎么保存的?
小弟近来疑惑,线程调度时,栈中的内容是怎么保存和恢复的。
线程或进程切换时,我知道各种寄存器的值会保存到和线程相关的一个数据结构中。当然也保存了堆栈指针的值。但是每个线程都有一个栈。栈中的内容也是先保存再恢复的吗?如果我在栈中开辟了一个比较大的局部数组。那保存和恢复,且不是效率很低?
还是每个线程都有一个栈,它们的栈在不同的地址。所以今次切换时不需要特别保存栈中的内容,只需要保护该线程的栈不被别人访问就是了?
那就和下面这个图一样是吗?
同理进程切换时,他堆中申请的内存怎么处理呢?
那是不是所有的线程都有自己的栈空间,而一个进程内的所以进程共享堆空间呢?每个进程都有自己的堆空间?还是所有的进程共享一个堆空间?
[解决办法]
切换堆栈,只要改变寄存器就可以了,不需要操心这么多。
X86 32 Bists
SS --> 选择子--->段描述表-->(段限,段基址)
CR3 --->页目录,页表
ESP-->
EBP-->
大概只要处理好这些,堆栈就可以顺利切换了
而线程切换时,会切换线程环境--有的翻译为上下文(thread context)
这个操作,就切换了包含以上寄存器,在内的,所有寄存器。
[解决办法]
只要堆栈切换回来了,变量就可以访问了,有何问题。
变量访问,依赖的是段,页,和ESP,EBP 这些寄存器。
当段,页,寄存器切换回来以后,就可以继续访问变量了。
[解决办法]
堆栈中的变量是通过ESP,EBP这两个寄存器访问的。
[解决办法]
这其实和参数传递有点相似,只需要传递地址就够了。
ESP,EBP 正式 堆栈指针寄存器。
变量通过ESP,EBP 两个指针 加偏移量访问。
[解决办法]