2008年8月6日 星期三

Linux系統的thread總數限制

在libc6-dev (2.7-10) (from debian lenny repository)並沒有針對每一個user process predefined 最大thread 數目 (在/usr/include/bits/local_lim.h 中的 #undef PTHREAD_THREADS_MAX一行得知)

在Linux系統中theard 機制是採取 process-thread一對一的模型 即"each thread is actually a separate process in the kernel"

thread的總數受制於實體記憶體容量的限制 (kernel/fork.c):

void __init fork_init(unsigned long mempages){

.....
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);
.....

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

......
}

其中max_threads即是最大thread數,也是每一個使用者的程式所能fork的最大子行程數
(可以透過"cat cat /proc/sys/kernel/threads-max " 或 "/sbin/sysctl kernel.threads-max"得知)

max_threads/2為每一個使用者(除root外)所能執行的最大行程數(可以透過"ulimit -u"得知)

參考資料:

http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/index.html

http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html

http://topic.csdn.net/u/20070213/10/c9cde32c-b8a9-471f-9615-f2cfcab717f7.html

http://ubuntuforums.org/showthread.php?t=695845

沒有留言: