前提・実現したいこと
スレッド作成によって取得されたメモリ(スタック領域?)がどのタイミングで解放されるか、ご教示いただきたいです。
当初以下の①のパターンを想定しておりましたが、実機確認すると➁のパターンのように見えております。
①スレッド終了後、その他のプログラムからも使用できるメモリとして解放される(PTHREAD_CREATE_JOINABLEの場合は、pthread_join()実行後)
➁スレッド終了後、プロセス内で再利用できるメモリとして解放される。プロセスが使用するメモリ領域として確保しているため、その他のプログラムから使用できない。プロセス終了後、スレッドで取得した領域含め解放される。
ググってみましたが、スレッドのメモリ解放とは、プロセス内での再利用可能メモリを指すのか、その他のプログラムからも使用できるメモリとして解放されることを指すのかわかりませんでした。
発生している問題・エラーメッセージ
スレッドを6つ同時に作成し終了する、その後2つ同時にスレッドを作成し終了するプラグラムで検証した結果が以下となります。
スレッドが終了するとメモリが再利用可能になるため、スレッド解放後にメモリ使用率が下がることを期待しましたが、スレッドが終了してもメモリの解放が行われませんでした。
タイミング :VSZ :RSS メインキック :2516 :620 6スレッド作成:117360:620 6スレッド解放:166504:1124:ここでメモリが解放され、RSS,VSZが下がると思っていた 2スレッド作成:166504:1124:値の増加なし 前の6スレッドで取得したメモリをプロセス内で再利用? 2スレッド解放:166504:1124 終了 :166504:1124:最後までスレッドで取得したメモリをプロセスとして解放せず終了
該当のソースコード
clang
1#include <stdio.h> 2#include <unistd.h> 3#include <pthread.h> 4 5//スレッド 6void *func_null(void *arg){ 7 char test[102400]; 8 printf("new thread created : %ld \n", pthread_self()); 9 sleep(5); 10 printf("thread exit\n"); 11 pthread_exit(): 12} 13 14 15int main() 16{ 17 pthread_t th_cli1; 18 pthread_t th_cli2; 19 pthread_t th_cli3; 20 pthread_t th_cli4; 21 pthread_t th_cli5; 22 pthread_t th_cli6; 23 pthread_t th_cli7; 24 pthread_t th_cli8; 25 26 pthread_attr_t th_cli_attr; 27 int status; 28 29 // スレッド属性 30 pthread_attr_init(&th_cli_attr); 31 pthread_attr_setstacksize(&th_cli_attr, 204800); 32 pthread_attr_setdetachstate(&th_cli_attr,PTHREAD_CREATE_DETACHED); 33 sleep(10); 34 35 //スレッドを6個作成 36 status = pthread_create(&th_cli1,&th_cli_attr,func_null,NULL); 37 status = pthread_create(&th_cli2,&th_cli_attr,func_null,NULL); 38 status = pthread_create(&th_cli3,&th_cli_attr,func_null,NULL); 39 status = pthread_create(&th_cli4,&th_cli_attr,func_null,NULL); 40 status = pthread_create(&th_cli5,&th_cli_attr,func_null,NULL); 41 status = pthread_create(&th_cli6,&th_cli_attr,func_null,NULL); 42 43 printf("6 thread finished\n"); 44 sleep(15); 45 46 //スレッドを2個作成 47 status = pthread_create(&th_cli7,&th_cli_attr,func_null,NULL); 48 status = pthread_create(&th_cli8,&th_cli_attr,func_null,NULL); 49 50 sleep(10); 51 printf("th_cli1 : %ld\n", th_cli1); 52 printf("th_cli2 : %ld\n", th_cli2); 53 printf("th_cli3 : %ld\n", th_cli3); 54 printf("th_cli4 : %ld\n", th_cli4); 55 printf("th_cli5 : %ld\n", th_cli5); 56 printf("th_cli6 : %ld\n", th_cli6); 57 printf("th_cli7 : %ld\n", th_cli7); 58 printf("th_cli8 : %ld\n", th_cli8); 59 printf("exit\n"); 60 sleep(10); 61 return(0); 62}
試したこと
PTHREAD_CREATE_DETACHEDだけでなくPTHREAD_CREATE_JOINABLEでも試してみましたが、概ね同じような値が確認できました。
補足情報(FW/ツールのバージョンなど)
Ubuntu 20.04.3 LTS(VMware Workstation 15上で動かしています)
CPUは8コアで設定しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/24 09:58