在Linux上,相同进程的线程之间的上下文切换成本

有没有关于Linux上相同进程的线程之间的上下文切换的成本有什么好的经验数据(x86和x86_64,主要是感兴趣的)?我正在谈论一个线程在用户空间中执行的最后一条指令之前的周期数或纳秒,然后自动或非自愿地进入睡眠状态,以及在同一个cpu /核心唤醒之后同一进程的不同线程执行的第一条指令。

我写了一个快速测试程序,它不断地在分配给同一个cpu / core的2个线程中执行rdtsc,将结果存储在一个volatile变量中,并与其姊妹线程相应的volatile变量进行比较。它第一次检测到姐妹线程的值的变化,它打印出差异,然后回到循环。我以Atom D510 cpu的方式获得最低/中位数约8900/9600个周期。这个程序是否合理,数字看起来可信吗?

我的目标是估计在现代系统中,线程每连接服务器模型是否可以竞争,甚至优于选择型复用。这在理论上似乎是合理的,因为从fd X到fd Y执行IO的转换只涉及一个线程中的睡眠,而在另一个线程中唤醒,而不是多个系统调用,而是依赖于上下文切换的开销。

(免责声明:这不是问题的直接回答,只是一些建议,我希望会有所帮助)。

首先,你所获得的数字肯定听起来像是在球场内。但是请注意,实施同一个ISA的不同CPU模式之间的中断/陷阱延迟会有很大变化。如果您的线程使用浮点或向量操作,这也是一个不同的故事,因为如果没有内核避免保存/恢复浮点或向量单元状态。

您应该能够通过使用内核跟踪基础结构获得更准确的数字 – 特别是perf sched旨在测量和分析调度器延迟。

如果您的目标是建立线程每连接服务器,那么您可能不应该测量不必要的上下文切换延迟 – 通常在这样的服务器中,大多数上下文切换将是自愿的,因为read()中的线程阻塞等待为网络提供更多数据。因此,更好的测试台可能涉及测量从read()中的一个线程阻塞到从其唤醒的另一个线程的延迟。

请注意,在一个写入复杂的多路复用服务器的负载较重的情况下,从fd X到fd Y的转换通常涉及相同的单一系统调用(服务器迭代从单个epoll()返回的活动文件描述符列表)。一个线程也应该具有比多个线程更少的缓存占用空间,只需要只有一个堆栈。我怀疑解决问题的唯一方法(对于“定居点”的一些定义)可能会有一个基准射击…

http://stackoverflow.com/questions/5958941/cost-of-context-switch-between-threads-of-same-process-on-linux

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在Linux上,相同进程的线程之间的上下文切换成本