2011-11-17 85 views
0

有相当巨大的承诺,混帐到NPTL/glibc的:NPTL:什么是MULTIPLE_THREADS_OFFSET以及它是如何设置

http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee

由乌利齐·德雷珀和的Jakub耶利内克@ 2007

我感兴趣the change to lll_lock/lll_unlock

在SMP代码,lll_unlock被修改,以

+# define __lll_unlock_asm "cmpl $0, %%gs:%P3\n\t"       \ 
+       "je 0f\n\t"           \ 
+       "lock\n"           \ 
+       "0:\tsubl $1,%0\n\t" 

其中$0 futex地址零和%P3是MULTIPLE_THREADS_OFFSET常量。

那么,什么是储存在$gs:MULTIPLE_THREADS_OFFSET(又名$gs:(offsetof (tcbhead_t, multiple_threads))?怎么这个值在程序的生命周期被改变?

+0

setate by allocate_stack,nptl/allocatestack.c:['374/*这至少是第二个线程。 */ 375 pd-> header.multiple_threads = 1;'](http://fxr.watson.org/fxr/source/nptl/allocatestack.c?v=GLIBC27#L374) – osgx

回答

1

这跳跃的地方多线程代码在单线程使用的情况下优化如果你在一个单线程的进程中使用这个代码,那么subl指令的'lock'前缀就不需要了,因为原子是不需要的,因此可以在运行时被删除。指令原子地产生一个run-在CPU级别的时间开销

所以,简短的回答是,multiple_threads字段是一个布尔值,告诉我们是否实际上在一个多ti线程运行时环境。

+0

在这种情况下,CPU开销是微不足道。 FWIW,两个insns - 比较和分支 - 会导致更多的CPU开销。 'lock' insn的问题在于,它声明了内存总线上的'LOCK#'信号并且有效地阻止了所有其他处理器并访问内存。现在,这是一个与机器的尺度的开销:) – chill

+0

寒冷,是否有集成内存控制器和QPI(或HT)的Core i7(或现代Athlon)上的LOCK#?丹,这个标志是如何设置或改变的? – osgx

+0

chill,http://software.intel.com/zh-cn/blogs/2010/02/22/hardware-support-for-locks/ - >“原子操作在一段时间内不使用全系统锁。现代CPU使用称为高速缓存锁定的技术,它没有任何系统级的影响,并且具有100%的可扩展性。“ – osgx

相关问题