Operating system 多线程中的上下文切换

Operating system 多线程中的上下文切换,operating-system,Operating System,这几天我一直在读操作系统,我越来越糊涂了 Q1:假设一个进程有多个线程。因此,在物理内存中,会为堆、代码和数据段分配内存。除此之外,每个线程都有一个单独的堆栈内存。书堆是如何排列的?我们如何确定线程所需的空间?如果线程过度使用分配给它的堆栈空间怎么办 问题2:在上下文切换的情况下,同一进程的另一个线程被激活,我们保存PC、寄存器、堆栈指针和中断线程的返回地址。这个回信地址是什么?PC足以告诉我们下一步将执行哪条指令,那么这个返回地址有什么用途呢?请帮助我:(堆栈是如何安排的?)-由“Create

这几天我一直在读操作系统,我越来越糊涂了

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


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

堆栈是如何安排的?)-由“CreateThread()”动态分配(或不管它叫什么),API,从操作系统加载程序为主线程调用,然后由主线程和其他人创建更多线程

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

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


'中断线程的返回地址。该返回地址是什么?PC足以告诉我们下一步将执行哪条指令,那么该返回地址的用途是什么?'通常,PC不会显式保存。返回地址由生成从用户应用程序代码中输入操作系统代码。因此,保存堆栈指针可以有效地保存PC(通常在切换到操作系统堆栈以实现中断/系统调用之前,还可以保存一堆寄存器等).

好的,非常感谢您的回答。请澄清一下,您的意思是,每当创建线程时,操作系统都会创建1MB的虚拟内存(例如),而实际上会在RAM中分配很少的字节?如果线程需要更多的空间,则会分配更多的RAM(最多1MB)之后会引发异常。我做对了吗?请澄清一下。OS在提交一些虚拟内存页(通常是4页,每页4K)时会保留1MB的虚拟内存(例如)。这些提交的页可用于加载/交换到RAM中。如果线程用完提交的堆栈空间,堆栈需要更多的虚拟内存,并且尚未达到1MB限制,则会提交更多的虚拟内存,将一些虚拟内存分页到RAM中,并重新启动导致页面错误的指令。