用户级线程如何在堆栈级别工作?



使用KLT,每个线程都有自己的堆栈,对吗?这些细节是维护在一个不同的PCB为每个块和不同的页表,对吗?这将如何应用于用户级线程呢?是否所有的线程在ULT有不同的堆栈?如果有,它是如何实现的?

编辑:我发现这个问题在十多年前就有人问过了。不幸的是,这个问题也没有得到充分的回答。

在Linux内核中,当中断处理程序的下半部分未完成并被另一个线程抢占时,您将看到内核线程。例如,发生中断时,中断处理程序的上半部分在禁用中断的情况下运行,然后将下半部分添加到线程队列中(实际上,它比这更复杂)。这将创建内核线程。内核线程被赋予了高优先级,所以它们运行得很快,因为很可能有一个用户线程正在等待它们的完成。

内核线程有自己的堆栈,在中断处理程序的上半部分创建它们时创建堆栈(当内核线程被创建时,它的堆栈也被创建)。据我所知,每个核心都有一个中断堆栈来服务中断。内核线程有自己的task_struct,但是没有地址空间。最有可能的是,它们基本上是驱动程序的服务功能,它应该代表由用户模式线程查询的设备做一些工作。例如,假设线程A进行系统调用以从磁盘读取数据。用于该磁盘的驱动程序将写入硬盘控制器的一些寄存器,以从磁盘启动DMA操作。当操作完成时,控制器触发一个中断。在上半部分执行期间,中断堆栈被使用,进一步的中断被禁用。上半部分创建一个新的内核线程,该线程被添加到具有高优先级的就绪线程队列中。最终,内核线程运行(带有自己的task_struct和堆栈)并结束。当它完成时,它将把执行此操作的用户模式线程放回到就绪队列中。

对于Linux内核,用户线程都有两个堆栈:一个用于用户模式操作,另一个用于内核模式操作(在系统调用期间)。每个用户模式堆栈是给定一个固定大小(虚拟内存)。既然你似乎有一些误解,你可以阅读我的一些回答来获得更多细节:

状态进程

分页到底是什么?OSDEV

理解操作系统如何存储/检索IO设备输入

最新更新