2012-03-05 111 views
1

我一直在阅读操作系统这些天,我越来越困惑..上下文切换多线程

Q1:假设我们有一个进程的多个线程。所以在物理内存中,会为堆,代码和数据段分配内存。除此之外,每个线程都会有一个单独的堆栈内存。堆栈如何安排?我们如何确定线程需要的空间?如果一个线程过度使用它分配的堆栈空间会怎么样? Q2:在上下文切换的情况下,同一进程的另一个线程被激活,我们保存PC,寄存器,堆栈指针和中断线程的返回地址。这个返回地址到底是什么? PC足以告诉我们接下来会执行哪条指令,那么这个返回地址的用途是什么?请帮助我:(

回答

3

'堆栈是如何安排的?' - 由'CreateThread()'(或任何它被称为)动态分配的API,从主线程的OS加载器调用,然后由主线程和其他线程创建更多线程

'我们如何确定线程将需要的空间' - 在具有大型虚拟内存空间的桌面systesm/OS上,编译器/连接器通常指定较大的最大尺寸,(例如1MB),这个值存储在可执行文件头中,当OS被加载时,操作系统使用这个值来保留虚拟地址空间的1MB或任何空间,OS承诺物理当主线程或其他线程启动时,RAM /分页的最小堆栈要小得多

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

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

+0

好的非常感谢你的回答。只是一个解释,你的意思是说,每当一个线程被创建时,操作系统创建一个1MB的虚拟内存(例如),而实际分配RAM中的几个字节?如果线程需要更多空间,则会分配更多RAM(最多1 MB),之后会引发异常。我说得对吗?请澄清。 – letsc 2012-03-06 15:20:01

+0

操作系统保留1MB(例如)的虚拟内存,同时提交一些虚拟内存页面(通常是4页,每页4K)。这些提交的页面可用于加载/交换到RAM中。如果线程用尽了提交的堆栈空间,需要更多的虚拟内存用于堆栈并且未达到其1MB的限制,则会提交更多的虚拟内存,其中一些被分页到RAM中,并且导致页面错误的指令被重新启动。 – 2012-03-09 23:00:31