posix内核线程
Kernel threads in posix
据我所知,内核为计算机中的每个内核都有内核线程,来自用户空间的线程被调度到这些内核线程上(操作系统决定应用程序中的哪个线程连接到哪个内核线程)。假设我想在一台有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下没有通用的规则,你必须查找特定操作系统的文档或询问更具体的问题。
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 有没有办法获取线程使用的内核?
- 查询时间/周期是针对所有内核/线程的序列化请求还是并行请求?
- 在具有许多内核的计算机上,使用 Boost ASIO 只能使用 1 个线程
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- 是否可以在跨内核线程迁移后强制重新加载 thread_local 变量?
- 异步是否总是在C++中使用另一个线程/内核/进程
- 线程发散较少的内核
- CUDA内核无缘无故地使用20K 线程崩溃
- 只有一个线程执行 CUDA 内核
- 当运行的线程数超过内核数时,CUDA性能会得到提高
- 有没有办法使用提升线程库设置与处理器内核的线程亲和力
- 如何在其他内核上运行每个线程
- 用C++在两个不同的内核中制作两个线程
- CUDA 如何欺骗内核认为它在另一个线程中?
- 固定到内核的 FIFO 线程上的 std::p romise::set_value 不会唤醒 std::future
- JNI 中的 Java 线程C++仅使用一个内核的环境.Arm 处理器和 Ubuntu
- OpenMPI 上的线程应用程序仅在节点上使用 1 个内核
- std::线程在用户或内核空间中进行管理
- Qt线程在内核上的共享似乎并不均等