偶爾發現linux下tomcat啟動后出現多個java進程,如下:
000 S 0 4789 1 0 85 0 - 75083 schedu pts/1 00:00:03 java
040 S 0 4790 4789 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4791 4790 0 75 0 - 75083 schedu pts/1 00:00:03 java
040 S 0 4792 4790 0 75 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4793 4790 0 75 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4794 4790 0 78 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4795 4790 0 75 0 - 75083 rt_sig pts/1 00:00:02 java
040 S 0 4796 4790 0 78 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4797 4790 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4802 4790 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4803 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4804 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4805 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4806 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4807 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4808 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4809 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4810 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
大概有40多個,感覺好恐怖,在網上查了半天也沒有什么結果,只是發現了主進程子進程的關系。
和做C的同事討論后,他說發現mysql也有類似情況:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6238 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.30 mysqld
6239 mysql 18 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6240 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6241 mysql 24 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6242 mysql 24 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6243 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6245 mysql 18 0 49272 12m 2020 S 0.0 5.0 0:00.01 mysqld
后來查mysql多進程的時候有高手回答如下:
原來如此啊,linux的線程是通過進程實現的。
2.6內核32位系統上
gcc -static編譯出來的程序
會讓多線程表現成多進程的狀態,出現同名多個PID
不帶-static就表現為只有一個PID
64位系統,不管加不加-static,都只有一個PID
感覺32位和64位在線程的實現不一樣
000 S 0 4789 1 0 85 0 - 75083 schedu pts/1 00:00:03 java
040 S 0 4790 4789 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4791 4790 0 75 0 - 75083 schedu pts/1 00:00:03 java
040 S 0 4792 4790 0 75 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4793 4790 0 75 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4794 4790 0 78 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4795 4790 0 75 0 - 75083 rt_sig pts/1 00:00:02 java
040 S 0 4796 4790 0 78 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4797 4790 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4802 4790 0 75 0 - 75083 schedu pts/1 00:00:00 java
040 S 0 4803 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4804 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4805 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4806 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4807 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4808 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4809 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
040 S 0 4810 4790 0 80 0 - 75083 rt_sig pts/1 00:00:00 java
大概有40多個,感覺好恐怖,在網上查了半天也沒有什么結果,只是發現了主進程子進程的關系。
和做C的同事討論后,他說發現mysql也有類似情況:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6238 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.30 mysqld
6239 mysql 18 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6240 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6241 mysql 24 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6242 mysql 24 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6243 mysql 25 0 49272 12m 2020 S 0.0 5.0 0:00.00 mysqld
6245 mysql 18 0 49272 12m 2020 S 0.0 5.0 0:00.01 mysqld
后來查mysql多進程的時候有高手回答如下:
原來如此啊,linux的線程是通過進程實現的。
2.6內核32位系統上
gcc -static編譯出來的程序
會讓多線程表現成多進程的狀態,出現同名多個PID
不帶-static就表現為只有一個PID
64位系統,不管加不加-static,都只有一個PID
感覺32位和64位在線程的實現不一樣