疑問1.
python や go のスレッドはユーザレベルの、完全にユーザ空間で完了するものだと思います。(プロセスコンティションスコープであり、内部でcloneは使用しない。)
pthreadは内部でcloneを呼ぶそうなので、これはカーネルスレッドからすべて生成する、カーネルレベルスレッディング用のライブラリ(システムコンティションスコープ)と考えてもよいのでしょうか?
つまり、プロセス2の状態は、1つ目ののスレッドからpthread_create()か、独自にclone()した状態
疑問2.
ユーザスレッド ---- LWP ---- カーネルスレッド
という構図ができると思うのですが、例えば図のプロセス1の場合、結局その実体は"いくつ""どこに""何というものとして"できるのでしょうか?
自分は、カーネルスレッド毎に実体ができると考えています。なので、プロセス1では合計1つの実体ができると考えます。
そしてその実体は、task_structだと考えます。(ユーザスレッドはその実体を共有する。)
なのでプロセス2では、合計2つのtask_structが生成されると思います。
今後スレッドをメインにプログラミングしていく際に、このあたりの理解から使用言語を絞りたいと考えております。
--追記
python threading は、試してみたところ、
aa 9992 9962 9992 0 3 11:48 pts/0 00:00:00 python3 thre.py aa 9992 9962 9993 0 3 11:48 pts/0 00:00:00 python3 thre.py aa 9992 9962 9994 0 3 11:48 pts/0 00:00:00 python3 thre.py
のように各スレッド(mainとmianから派生したスレッド*2)にLWP番号が振られていましたので、カーネルレベルのスレッディングだということがわかりました。
機能的にはpthreadと同等という感じでしょうか。
--追記3
pthreadライブラリには大きく3種類ほどあり、
1:1モデルを採用するLinux threads, NPTL(native posix thread library),
M:Nモデルを採用するNGPT(next generation posix thread)
という具合に分かれているようです。
つまり、本記事で自分が考えているpthreadは、NPTLのことです。
M:Nモデルは、複数のユーザスレッドを複数のLWP上で実行する、goroutineとNPTLを足したようなもののようですが、
これは理解が難しそうなので、とりあえずおいておきます...
PPIDが2のカーネルスレッドを、"カーネルデーモン"という呼び方ができるようなので、
LWPのことをカーネルスレッドとも呼べるので、その使い分けとして使うのもありだと思った。
あるスレッドについて、ユーザモードで実行中の場合、それをユーザスレッドと呼び、
カーネルモードで実行中の場合、それをLWP(またはカーネルスレッド)と呼ぶよう。
とにかくそのスレッドの実体は1つのtask_structであり、また、当然カーネルデーモンとは違い、個別のアドレス空間を持つ。
カーネルからはLWPをプロセスと見るし、
ユーザからはスレッドの集合をプロセスと見る場合が多い。
--追記4
goroutine thread model
引用元
https://osmh.dev/posts/goroutines-under-the-hood
--追記5
goroutine 現在の理解

回答2件
あなたの回答
tips
プレビュー