【问题标题】:Kernel threads in posixposix中的内核线程
【发布时间】:2011-11-03 20:01:20
【问题描述】:

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

【问题讨论】:

    标签: c++ c multithreading posix multicore


    【解决方案1】:

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

    也许您对 CPU 亲和性感兴趣,以及像 pthread_attr_setaffinity_np 这样的不可移植函数

    【讨论】:

    • 是的,这只是我正在考虑的事情。如果一个人想要尽可能多的并发性并且一个人正在运行一个运行该特定进程的专用系统,那么该进程可以更好地知道如何在内核级线程之间划分用户级线程,我认为亲和力是我想要的然后想手动设置
    • @Silverrocker 请记住,这通常不是那么简单。系统/操作系统也需要一些处理,例如还有其他守护进程正在运行。或者内核进行网络处理、文件系统处理等。如果您已将其中一个线程固定到内核,并且该线程被阻塞,例如I/O 或互斥体/信号量,该核心处于空闲状态,而它本可以运行另一个线程,该线程以某种方式被其核心抢占。在大多数情况下,操作系统非常擅长调度线程和进程以最大限度地提高并发性。
    • 谢谢!你指出了一些我没有想到的好东西。
    【解决方案2】:

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

    一般而言,对于多线程,您不希望线程数等于内核数,除非您专门进行 CPU 密集型处理,否则您希望线程数 > 内核数。当等待网络或磁盘 IO 时(即当你在一个 accept(2)、recv(2) 或 read(2) 中等待时)你的线程不被认为是可运行的。如果 N 个线程 > N 个内核,则操作系统可能会在等待该 IO 时安排您的另一个线程来完成工作。

    【讨论】:

    • 啊,好吧,我正在考虑这样一种情况,即我正在运行的线程的进程将受到 CPU 的限制,可能会到处都有一些(磁盘)IO,但主要是 CPU 上的计算密集。
    【解决方案3】:

    您提到的是实现线程的一种可能模型。但是给定的 POSIX 线程实现可能根本不遵循这样的分层模型。由于有人已经提到过 linux,它没有它,从调度程序的角度来看,所有线程都是平等的,那里。如果您不指定额外的内容,它们会争夺相同的资源。

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

    因此,总而言之,POSIX 下对此没有一般规则,您必须查看特定操作系统的文档或提出更具体的问题。

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2015-10-06
      • 2015-12-03
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      相关资源
      最近更新 更多