多线程中的上下文切换



这些天我一直在读操作系统,我越来越困惑了。。

Q1:假设一个进程有多个线程。因此,在物理内存中,将为堆、代码和数据段分配内存。除此之外,每个线程都有一个单独的堆栈内存。堆栈是如何排列的?我们如何确定线程需要的空间?如果线程过度使用了分配给它的堆栈空间,该怎么办?

Q2:在上下文切换的情况下,同一进程的另一个线程被激活,我们保存被中断线程的PC、寄存器、堆栈指针和返回地址。这个寄回地址到底是什么?PC足以告诉我们下一步将执行哪个指令,那么这个返回地址有什么用呢?请帮助我:(

'堆栈是如何排列的?'-由"CreateThread()"(或其调用的任何名称)、API动态分配,从主线程的OS加载器调用,随后由主线程和其他线程创建更多线程。

"我们如何确定线程需要的空间?"-在具有大虚拟内存空间的桌面系统/OS上,编译器/链接器通常为主线程的堆栈指定一个大的最大大小(例如1MB)。该值存储在可执行文件头中,OS在加载可执行文件时使用该值来保留1MB或其他虚拟地址空间。当主线程或其他线程启动时,操作系统会提交到物理RAM/分页一个小得多的最小堆栈。

"如果线程过度使用了分配给它的堆栈空间,该怎么办?"-如果线程过度使用其提交的堆栈,则会生成页面故障中断,如果未达到保留堆栈限制,则会提交更多RAM来扩展堆栈。如果达到限制,则提交一两页的小"透支",并在有问题的线程中引发异常。

'返回中断线程的地址。这个寄回地址到底是什么?PC足以告诉我们下一步将执行哪条指令,那么这个返回地址有什么用呢?"通常,电脑不会被明确保存。返回地址由硬件/软件中断机制保存在堆栈上,该机制从用户应用程序代码生成OS代码的条目。因此,在切换到操作系统堆栈以实现中断/系统调用之前,保存堆栈指针有效地保存了PC(通常还有一堆寄存器等)。

最新更新