Apr 25

pthread的一点杂碎 不指定

felix021 @ 2013-4-25 17:16 [随想] 评论(0) , 引用(0) , 阅读(8358) | Via 本站原创 | |
1. 虽然都用 -lpthread 来链接到 libpthread.so ,但是实际上 pthread 是POSIX规范规定的接口,不是某一个库的名字。不同的类Unix系统在底层对pthread的实现不一样。

2. 在Linux的实现里,每个pthread线程都对应一个LWP(light weight process);而LWP是由内核线程支持的,由内核统一调度,所以每个pthread线程都有对应task_struct,以及对应的tid(不是pthread_self()返回的那货,而是类似于pid),所以效率就不会太高(因为切换什么的都要回到内核里,而syscall的效率……),而且对应地,还要消耗内核线程的栈空间等资源,所以效率不会很高。

3. man gettid可以看到这个syscall是在 sys/types.h 里,但是实际上在我的ubuntu 12.04, kernel 3.2.0上面没有,需要这样:
#include <sys/syscall.h>
#define gettid() syscall(__NR_gettid)

不加上的话,结果就是 error: ‘gettid’ was not declared in this scope

4. 每个线程都有单独的cpu_affinity,通过 pthread_setaffinity_np, pthread_getaffinity_np 来读写。

5. Linux下,在 /proc/[PID]/task 下面包含了进程的所有线程的相关信息,每个线程一个目录,目录名就是线程的ID;每个线程的相关信息与进程类似,:
引用
felix021@xxx:/proc/8660$ ls task/
8660  8662  8663  8664

felix021@xxx:/proc/8660:/proc/8660$ ls task/8662
attr  cmdline  cwd      exe  fdinfo  limits    maps  mounts  oom_score  schedstat  stat  status
auxv  cpuset  environ  fd  io      loginuid  mem  oom_adj  root      smaps      statm  wchan


5. 每个线程可以被调度到不同CPU上面,类似于进程的/proc/PID/stat文件,线程当前运行的CPU ID保存在对应目录内的stat文件中第39个字段:
引用
felix021@xxx/proc/8660$ for i in /proc/8660/task/*; do LWP=`basename $i`; PSR=`awk '{print $39}' $i/stat`; echo $LWP, $PSR; done
8660, 1
8662, 1
8663, 15
8664, 14


6. 可以用ps的 L 和 F 参数列出所有的LWP:
引用

felix021@xxx:~/code$ ps -FL
UID        PID  PPID  LWP  C NLWP    SZ  RSS PSR STIME TTY          TIME CMD
fengmin  7792  7791  7792  0    1 16561  1676  0 16:02 pts/3    00:00:00 -bash
fengmin  8660  7792  8660  0    4 11111  1004  1 17:04 pts/3    00:00:00 ./ttt
fengmin  8660  7792  8662 99    4 11111  1004  1 17:04 pts/3    00:05:05 ./ttt
fengmin  8660  7792  8663 99    4 11111  1004  15 17:04 pts/3    00:05:05 ./ttt
fengmin  8660  7792  8664 99    4 11111  1004  14 17:04 pts/3    00:05:05 ./ttt
fengmin  8692  7792  8692  0    1 16411  996  2 17:09 pts/3    00:00:00 ps -FL

其中LWP列就是LWP的id,PSR是processor,也就是CPU ID。

p.s. 另外有个GNU PTH,这个是 n:1 的,纯用户空间完成调度的线程库,POSIX兼容。

转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: http://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]