非抢占式Pthreads?

3

有没有一种方法可以在不使用调度程序的情况下使用pthread,以便只有当线程显式地放弃或者被 mutex/cond 阻塞时才发生上下文切换?如果没有,是否有一种方法可以最小化调度开销,从而尽可能减少强制上下文切换的次数?

该问题涉及 POSIX 线程在 Linux gcc/g++ 实现。


2
减少上下文切换和进程/线程迁移通常是CPU调度程序的目标之一。您是否面临特定问题? - Mat
具体问题在于我正在开发的应用程序中,有一组线程明确地进行了yield操作,而执行任何其他上下文切换都是非常冗余的。 - Little Bobby Tables
2
你是否测量过任何上下文切换对你的应用程序吞吐量有害? - Mat
1
有些人可能会说sched_yield()是一种多余的上下文切换。如果一个线程正在做有用的工作,为什么要打扰它去让出CPU?如果它没有有用的工作要做,它应该被阻塞在某个地方,等待更有用的工作。 - Martin James
2个回答

5
你可以使用Pth(也称为 GNU Portable Threads),一个非抢占式线程库。使用--enable-pthread进行配置将创建一个用于pthreads的插件替代品。我在我的Mac上构建并测试了这个库,对于简单的pthreads程序来说它工作得很好。
从README中可以看到:
Pth是一个基于POSIX/ANSI-C的库,可在Unix平台上为多个执行线程(即“多线程”)提供非抢占式基于优先级的调度,用于事件驱动的应用程序。所有线程在服务器应用程序的同一地址空间中运行,但每个线程都有自己的程序计数器、运行时堆栈、信号掩码和errno变量。 线程调度本身以合作方式完成,即通过优先级和基于事件的非抢占式调度程序来管理线程。意图是这样可以比使用抢占式调度实现更好的可移植性和运行时性能。事件设施允许线程等待各种类型的事件发生,包括文件描述符上挂起的I/O、异步信号、经过的定时器、消息端口上挂起的I/O、线程和进程终止,甚至是定制的回调函数。 此外,Pth还提供了一个可选的POSIX.1c线程模拟API(“Pthreads”),可用于向现有的多线程应用程序提供向后兼容性。

0

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

如果您真的遇到了过多上下文切换的问题,最好先调整 Linux 调度程序,这不是本主题讨论的范围。pthread_setschedprio 和 pthread_setschedparam 可以设置一些提示,但仅限于设置优先级,而这些优先级的解释是实现定义的,即由 Linux 调度程序决定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接