マルチスレッドプログラミングをする上で、
今回はスレッドが最大で
いくつ作成できるか検証してみます。
まずは実際に確認してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define COUNT 50000 void *thread_func(void *arg){ return (void*)0; } int main(void){ pthread_t thread[COUNT]; int i; printf("[+]Counting...\n"); for(i=0; i<COUNT; i++){ if(pthread_create(&(thread[i]), NULL, thread_func, (void *)&i)!=0){ printf("[-]Error\n"); i++; break; } //pthread_join(thread[i], NULL); } printf("[+]Max number of Thread is %d\n", i); return 0; } |
上のコードを動かしてみると、
このようになってしまいます。

スレッドは32752個作成した時点で
それ以上作れなくなってしまいます。
これはreturnでスレッド処理が戻っても
そのスレッド情報は残ったままだからです。
コード中のコメントアウトしてある
pthread_join()の箇所を追加してあげると、
スレッド情報が完全削除されます。
今回の場合であれば上限に達することなく、
指定したスレッド数だけ
作成出来るようになります。
実は、OS側で作成出来る
最大スレッド数が決められています。
作成できる最大スレッド数は、
物理面と論理的ファクタが関係してきます。
まずはOSによる論理的ファクタです。
これを確認するには、
以下のコマンドを打ちます。
$cat /proc/sys/kernel/threads-max
$cat /proc/sys/kernel/pid_max
$cat /proc/sys/vm/max_max_count

threads-maxは1プロセスが作成できる
最大スレッド数を意味します。
※なぜかこれ値を超えて
作成できてしまいました。
なぜだろうか。
色々調べましたが結局分かりませんでした。
pid_maxはシステム全体で
作成できる数を意味します。
メモリマップは1スレッドに2つ以上
使用するので、現実はこれの
半分以下が作成できることになります。
以上の3つを変更してあげれば
作成可能な最大スレッド数も増えます。
/etc/sysctl.conf に以下の3行を設定します。
kernel.threads-max = 数値
kernel.pid_max = 数値
vm.max_map_count = 数値
上述したようにメモリマップ値は
2倍以上の値をセットしましょう。
/etc/sysctl.confに追加出来たら、
sysctl -p を打ち込みます。
こうすることでシステムを
オフにしても設定が保持されます。

この状態でもう一度コードを
実行してみましょう。
上限突破しているはずです。
以下のようになりました。

50000まで設定したはずですが、
実際に作成出来た数は49987でした。
ほぼ一緒ということでOKでしょう。
次に物理的な制約面のお話です。
スレッドを作成すると、
スタック領域に確保されます。
つまりスタック領域の最大領域を
超えてスレッドは作成できません。
ユーザが使用できる
スタックサイズは以下で確認できます。

ulimit -a で確認できます。
私の環境であれば、
スタック領域は約8MBでした。
単純な話、この領域内であれば、
スレッドを作成出来ることになります。
もう少し詳しく話すと、
環境によってはswap領域を
作成している場合があります。
swap領域はメモリが足りなくなった際に、
ストレージの一部をメモリとして
使うことが出来る領域のことです。
したがって実際はswap領域も関係してきます。
以上です。
最後まで読んでいただきありがとうございました。