posix内核线程

Kernel threads in posix

本文关键字:线程 内核 posix      更新时间:2023-10-16

据我所知,内核为计算机中的每个内核都有内核线程,来自用户空间的线程被调度到这些内核线程上(操作系统决定应用程序中的哪个线程连接到哪个内核线程)。假设我想在一台有X个核的计算机上创建一个使用X个核的应用程序。如果我使用常规的pthread,我认为操作系统可能会决定将我创建的所有线程调度到单个内核上。如何确保每个线程都与内核线程是一对一的?

您应该基本上信任您正在使用的内核(特别是,因为可能有另一个繁重的进程正在运行;内核调度器将在一定时间内选择要运行的任务)。

也许您对CPU亲和性感兴趣,使用pthread_attr_setaffinity_np等不可移植函数

你的理解有点不对。Linux上的'kernelthreads'基本上是与其他进程和线程一起调度的内核任务。当内核的调度程序运行时,调度算法决定在可运行线程池中,哪个进程/线程将被安排在给定的CPU核心上下一个运行。正如@Basile Starynkevitch所提到的,您可以告诉内核将应用程序中的各个线程固定到特定的核心,这意味着操作系统的调度程序将只考虑在该核心上运行它,以及其他未固定到特定核心的线程。

一般来说,对于多线程,你不希望你的线程数等于你的内核数,除非你只做cpu绑定的处理,你希望线程数>内核数。当等待网络或磁盘IO时(即,当你等待accept(2), recv(2)或read(2)时),你的线程不被认为是可运行的。如果N个线程> N个内核,操作系统可能会在等待IO时调度一个不同的线程来工作。

您提到的是实现线程的一种可能模型。但是,给定的POSIX线程实现可能根本不遵循这种分层模型。因为有人已经提到了linux,它没有,从调度程序的角度来看,所有线程都是相等的。如果你不指定一些额外的东西,它们会竞争相同的资源。

我上一次看到这样的分层模型是在一台装有IRIX操作系统的机器上,那是很久以前的事了。

所以总的来说,在POSIX下没有通用的规则,你必须查找特定操作系统的文档或询问更具体的问题。