多线程中的上下文切换

时间:2012-03-05 19:52:37

标签: operating-system

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

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

Q2:在上下文切换的情况下,同一进程的另一个线程被激活,我们保存PC,寄存器,堆栈指针和被中断线程的返回地址。这个回邮地址究竟是什么? PC足以告诉我们接下来会执行哪条指令,那么这个返回地址的用途是什么?请帮帮我:(

1 个答案:

答案 0 :(得分:3)

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

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

'如果一个线程过度使用它分配的堆栈空间怎么办?' - 如果线程过度使用其提交的堆栈,则会生成页面错误中断,如果未达到保留的堆栈限制,则会提交更多RAM来扩展堆栈。如果达到限制,则提交一个或两个页面的小“透支”,并在违规线程中引发异常。

'返回被中断线程的地址。这个回邮地址究竟是什么? PC足以告诉我们接下来会执行哪条指令,那么该返回地址的用途是什么?通常,未明确保存PC。返回地址由硬件/软件中断机制保存在堆栈中,该机制从用户应用程序代码生成OS代码的条目。因此,在切换到OS堆栈以实现中断/系统调用之前,保存堆栈指针可以有效地保存PC(并且通常还有一堆寄存器等)。