Linux线程抢占:提高多线程运行效率的利器 (linux线程抢占)

随着现代计算机CPU的核心数量越来越多,多线程编程已成为现代程序员必备技能。然而,多线程编程的一个常见问题就是线程抢占,它能够显著影响程序的性能。在Linux环境中,线程抢占已经被纳入操作系统核心中,多线程编程者可以利用这种机制,提高程序的运行效率。

什么是线程抢占?

线程抢占是指当多个线程同时运行时,操作系统根据规则强制立即停止当前正在运行的线程,并让优先级高的线程接管CPU的时间片。因此,线程抢占是一种优先级管理机制,它允许更高优先级的线程优先处理,以确保系统得到更好的响应时间和性能。

Linux系统的线程抢占

Linux系统自2023年内核版本2.6.23之后,实现了基于时间片和实时优先级两种策略的线程抢占机制。这个机制可以让操作系统切换线程时执行更平稳,以提高多线程程序的响应度和运行效率。

Linux抢占的两种策略

在时间片策略中,线程执行的时间是有限制的,Linux允许操作系统协调线程,从而确保每个线程都有足够的时间片来执行自己的任务。

实时优先级策略允许使用程序员指定线程的优先级,以确保关键线程能够得到必要的处理时间。如果在程序执行期间,更高优先级的线程被创建或是发生特定事件,会对低优先级线程进行抢占。

利用线程抢占提高多线程运行效率

线程抢占机制在现代程序设计中发挥了重要作用。例如,在多线程服务器应用程序中,可以充分利用线程抢占机制来更好地分配工作负载。操作系统可以自动根据程序优先级分配运行时间,从而提高并发处理的效率。

此外,在高性能系统中,利用线程抢占来控制系统运行速度,从而更好地优化CPU资源,可以带来更高的性能。

线程抢占的局限性

尽管线程抢占是一个强大的工具,但并非所有编程环境都能充分利用它。例如,当程序已经使用了某些I/O操作时,线程抢占适用性会大大降低,因为在某些操作执行期间,线程无法响应操作系统的抢占任务。

此外,多线程程序的缺陷也可能与线程抢占有关。如果线程的优先级无法正确设置,程序可能会在高负荷运行期间出现死锁或其他异常情况,而线程抢占仅是一个缓解这些问题的工具之一。

作为现代计算机编程的一部分,多线程程序运行效率的提高一直是重要的挑战。利用Linux线程抢占机制,在多线程编程中实现对CPU时间的更好利用。无论是在高负载服务器还是高性能计算机环境中,都可以通过线程抢占来优化系统性能和提高并发效率。但是,线程抢占不是万能的,程序员必须谨慎处理线程的优先级,才能充分发挥线程抢占的优势。

相关问题拓展阅读:

严重关注:在嵌入试LINUX系统该使用哪个线程库

严重关注: 在嵌入试LINUX系统该使用哪个线程库?:30:02

分类: LINUX

在Redhat9.0下面, 创建一个进程。getpid();得到进程ID,然后在进程里用pthreadcreate几个线程,在线程里调用getpid, pthreadgetselfid()的到进程ID和线程ID, 发现该线程的进程ID和它所属的进程ID是一样的, 线程ID却逗罩不同。当是在小机里用gcc里的线程库,得到的结果是线程ID和进程ID是不同的,即线程山拿闹也当作进程来对待,而且多了几个其它线程在运行,若线程当作进程来对待效率是比较低的。在网上查了下linux的线程库,发现新内核中的LD用的是The Native POSIX Thread Library (NPTL), 而小机上用的是老的GCC里的线程库。

如何在Redhat9上面用老的线程库呢,在系统环境变量中加入LD_ASSUME_KERNEL=2.4.19就OK了

因为老版本内核中是不用NPTL库的, 这样LD连接程序的时候就不用NPTL, 在PC LINUX的

小机模拟器的模拟就和小机一样不用NPTL了。

那么到底是不是该把小机的线程库换成NPTL呢, 看看来自

的测试吧:

Linux 线程库性能测试与分析

杨沙洲国防科技大学计算机学院

2023 年 7 月 01 日

NPTL 成为 glibc “正选”线程库后,它的性能如何受到很多人的关注。本文就针对NPTL 与 LinuxThreads 的性能比较,以及超线程、内核可抢占等特性对线程性能的影响进行了全面评测。

一、 前言

在 Linux 2.6.x 内核中,调度性能的改进是其中最引人注目的一部分。NPTL(Native Posix Thread Library)使用内核的新特性重写敏游了 Linux 的线程库,取代历史悠久而备受争议的 LinuxThreads 成为 glibc 的首选线程库。

NPTL 的性能究竟如何?相对 LinuxThreads 又有哪些明显的改进?在对NPTL进行全面分析之前,本文针对这两种线程库,以及内核中”内核可抢占”(Preemptible)和超线程(HyperThreading)等特性进行了全面的性能评测,结果表明NPTL绝对值得广大服务器系统期待和使用。

回页首

二、 Benchmark

1. 测试平台

进行本测试的硬件平台为浪潮NF420R服务器,4个Hyperthreading-enabled Intel Xeon 2.2G处理器,4G内存。Linux选择了Slackware 9.0发行版,所使用的内核源码来自

www.kernel.org

2. 针对测试:LMBench

lmbench是一个用于评价系统综合性能的多平台开源benchmark,但其中没有对线程的支持。其中有两个测试进程性能的benchmark:lat_proc用于评测进程创建和终止的性能,lat_ctx用于评测进程切换的开销。lmbench拥有良好的benchmark结构,只需要修改具体的Target程序(如lat_proc.c和lat_ctx.c),就可以借用lmbench的计时、统计系统得到我们关心的线程库性能的数据。

基于lat_proc和lat_ctx的算法,本文实现了lat_thread和lat_thread_ctx两个benchmark。在lat_thread中,lat_proc被改造成使用线程,用pthread_create()替代了fork(),用pthread_join()替代wait();在lat_thread_ctx中,沿用lat_ctx的评测算法(见lat_ctx手册页),将创建进程的过程改写为创建线程,仍然使用管道进行通信和同步。

lat_thread null

null参数表示线程不进行任何实际操作,创建后即刻返回。

lat_thread_ctx -s #threads

size参数与lat_ctx定义相同,可表示线程的大小(实际编程时为分配K数据;#threads参数为线程数,即参与令牌传递的线程总数,相当于程序负载情况。

3. 综合测试:Volanomark

volanomark是一个纯java的benchmark,专门用于测试系统调度器和线程环境的综合性能,它建立一个模拟Client/Server方式的Java聊天室,通过获取每秒平均发送的消息数来评测宿主机综合性能(数值越大性能越好)。Volanomark测试与Java虚拟机平台相关,本文使用Sun Java SDK 1.4.2作为测试用Java平台,Volanomark版本2.5.0.9。

回页首

三、 测试结果

测试计划中将内核分为2.4.26、2.6.6/支持内核抢占和2.6.6/不支持内核抢占三类;通过配置内核以及NF420R的BIOS实现三类P规模:单处理机(UP)、4CPU的P(P4)和打开超线程支持的虚拟8CPU P(P8*)。内核配置和P规模的每一种组合都针对LinuxThreads和NPTL使用lat_thread、lat_thread_ctx和volanomark获取一组数据。由于NPTL无法在2.4.x内核上使用,该项数据空缺。

回页首

四、 结果分析

1. LinuxThreads vs NPTL:线程创建/销毁开销

使用2.6.6/preemptible内核配置下UP和P4的测试数据获得下图:

图1

在线程创建/销毁开销方面,NPTL的改进相当明显(降低约600%)。实际上,NPTL不再像LinuxThreads那样需要使用用户级的管理线程来维护线程的创建和销毁,因此,很容易理解它在这方面的开销能够大幅度降低。

同时,由图可见,单CPU下创建线程总是比多CPU下迅速。

2. LinuxThreads vs NPTL:线程切换开销

同样使用2.6.6/preemptible内核配置下UP和P4的数据:

图2

随着lat_thread_ctx的参与线程增多,不管是哪个线程库,单处理机条件下的线程切换开销都陡峭上升,而P条件下则上升比较平缓。在这方面,LinuxThreads和NPTL表现基本相同。

3. 内核影响

图3

图4

图5

图6

从上面四张图中我们可以得出两点结论:

“内核可抢占”是Linux对实时应用提供更好支持的有力保障,但对线程性能影响很小,甚至有一点损失,毕竟抢占锁的开销不可忽略;

升级内核并不会对LinuxThreads线程库性能带来多少变化,因此,对于服务器系统而言,不能指望仅仅编译使用新内核就能提高性能。

图7

图8

从图3、图4我们已经知道,打开超线程支持对线程创建/销毁性能几乎没有影响,而这两张图表也进一步说明,超线程技术对于线程切换开销也没有明显的影响。超线程技术是CPU内部的优化技术,和真正的双CPU完全不同。大量研究表明,如果没有内核与用户应用相结合的专门优化措施,超线程并不会带来很大的性能变化。除非是高负载综合服务器系统(例如繁忙的数据库系统),购买超线支持的CPU并不能带来多少好处。

4. 综合性能

图9

图9

前面几节分析让我们了解了线程库性能改进的细节,通过volanomark测试,我们可以近似得到在综合应用环境下,特别是网络服务需求中线程库以及内核对系统整体性能的影响程度。

图9综合了不同内核、不同处理机数条件下,两种线程库的volanomark结果。从图中可以观察到以下三点:

NPTL能极大提高P环境下服务器系统的整体性能(超过65%),相对而言,对单处理机系统影响较小(10%左右);

2.6内核的抢占特性对系统性能影响很小(不超过±1%),某些情况下甚至有所下降;

超线程技术在LinuxThreads中的影响是负面的,在NPTL中是正面的,但影响幅度都很小(5%-6%)。

关于linux线程抢占的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Linux线程抢占:提高多线程运行效率的利器 (linux线程抢占)