2011-09-23 71 views
2

有没有一种方法可以在没有调度程序的情况下使用pthreads,所以只有在线程明确产生或在mutex/cond上阻塞时才会发生上下文切换?如果没有,是否有办法将调度开销降至最低,以便强制上下文切换尽可能少发生?非抢先式线程?

这个问题涉及POSIX线程的Linux gcc/g ++实现。

+2

最小化上下文切换和进程/线程迁移通常是CPU调度程序的目标之一。你是否面临特定的问题? – Mat

+0

具体问题是,在我正在开发的应用程序中,有一组线程显式地产生,而执行任何其他上下文切换实际上是多余的。 –

+2

您是否测量过无论发生什么上下文切换都会对应用程序的吞吐量造成不利影响? – Mat

回答

4

您可以使用Pth(又名。GNU Portable Threads),一个非抢占线程库。使用--enable-pthread进行配置将为pthreads创建插件替换。我只是在我的Mac上构建并测试了它,它对于简单的pthreads程序来说工作正常。

自述:

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

线程调度本身是以合作的方式完成的,即线程由基于优先级和事件的非抢先调度器管理。其意图是,通过这种方式,与抢先式调度相比,可以实现更好的可移植性和运行时性能。 事件工具允许线程等待,直到发生各种类型的事件,包括文件描述符上的未决I/O,异步 信号,已用定时器,消息端口上的未决I/O,线程和进程终止,甚至自定义回调函数。

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

0

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

如果您真的碰巧遇到了过度的上下文切换问题,那么您最好先调整Linux调度程序,这在这里是无关紧要的。 pthread_setschedprio和pthread_setschedparam可以设置一些提示,但仅限于设置优先级,这些优先级的解释是实现定义的,即直到Linux调度程序。