【问题标题】:Non-preemptive Pthreads?非抢占式 Pthreads?
【发布时间】:2011-11-23 15:42:41
【问题描述】:

有没有办法在没有调度程序的情况下使用 pthread,因此只有当线程显式让步或在互斥锁/条件上被阻塞时才会发生上下文切换?如果没有,有没有办法最小化调度开销,从而尽可能少地发生强制上下文切换?

问题指的是 POSIX 线程的 Linux gcc/g++ 实现。

【问题讨论】:

  • 最小化上下文切换和进程/线程迁移通常是 CPU 调度程序的目标之一。您是否面临特定问题?
  • 具体问题是,在我正在开发的应用程序中,有一组线程显式让步,执行任何其他上下文切换确实是多余的。
  • 您是否测量过发生的任何上下文切换都会损害您应用的吞吐量?
  • 有些人可能会说 sched_yield() 是一个冗余的上下文切换。如果一个线程正在做有用的工作,为什么还要费心让步呢?如果它没有有用的工作要做,它应该被阻止,等待更多有用的工作。

标签: linux multithreading pthreads


【解决方案1】:

如果您有一个在普通用户空间运行的进程,上下文切换自然会作为系统操作的一部分发生 - 总会有另一个进程需要 CPU 时间。线程之间的抢先式上下文切换已经被操作系统很好地优化了,并且有时肯定是必要的。

如果你真的碰巧有过多的上下文切换问题,你最好先调整 Linux 调度程序,这在此处是题外话。 pthread_setschedprio 和 pthread_setschedparam 可以设置一些提示,但仅限于设置优先级,这些优先级的解释是实现定义的,即由 Linux 调度器决定。

【讨论】:

    【解决方案2】:

    您可以使用非抢占式线程库 Pth (a.k.a. GNU Portable Threads)。使用--enable-pthread 对其进行配置将创建一个插件替代pthreads。我刚刚在我的 Mac 上构建并测试了它,它适用于一个简单的 pthreads 程序。

    来自自述文件:

    Pth 是一个非常可移植的基于 POSIX/ANSI-C 的库,用于 Unix 平台 它为多个提供基于优先级的非抢占式调度 事件驱动中的执行线程(又名“多线程”) 应用程序。所有线程都运行在服务器的同一个地址空间 应用程序,但每个线程都有自己单独的程序计数器, 运行时堆栈、信号掩码和 errno 变量。

    线程调度本身是以协作的方式完成的,即 线程由基于优先级和事件的非抢占式管理 调度器。目的是,这样可以更好地实现 可移植性和运行时性能优于抢占式调度。 事件设施允许线程等到各种类型的 事件发生,包括文件描述符上的未决 I/O、异步 信号、经过的计时器、消息端口上的待处理 I/O、线程和 进程终止,甚至自定义回调函数。

    另外,Pth 为 POSIX.1c 提供了一个可选的仿真 API 线程(`Pthreads'),可用于向后兼容 现有的多线程应用程序。

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多