スレッドはどのように異なるOSに実装されていますか?


7

私はこれに出くわしたRobert LoveによるLinuxカーネル開発を読んでいました

Linuxは、スレッドのサポートに興味深いアプローチを採用しています。これは、スレッドと通常のプロセスを区別しません。カーネルにとって、すべてのプロセスは同じです。たまたま、リソースを共有するプロセスもあります。

OS(詳細はアスパイア)とカーネルについてはあまり知りません。そのため、上記の引用は、さまざまなOS(少なくともWindows、Linux、Unixなどの一般的なOS)でのスレッド実装について疑問を投げかけました。

誰かがOSでスレッドサポートを提供するためのさまざまな手法を説明できますか?(そしてオプションでそれらを対比する)


1
stackoverflowでこの質問への回答を確認することをお勧めします。
Pedro

この質問は特にLinuxに関するもののようです。そのため、ここではトピックから外れているため、UnixおよびLinuxで使用する必要があります。OSに関する一般的な質問であると思われる場合は、編集して明確にしてください。
ラファエル

@ペドロありがとう、それは私が混乱していたものではありません。その質問(私が感じること)は、パフォーマンスやロックの問題などについての話です。スレッドが実際にどのように実装され、さまざまな可能性があるかに興味があります
Ankit

@Raphaelありがとう。私はそれをその場所に置いたでしょう(私がそれを知っている場合のみ)。それで、私の悪いことに、stackexchangeでLinuxコミュニティを検索しませんでした。移行していただけますか?
Ankit

@Raphael、問題は、私が理解しているオペレーティングシステムの問題に対するさまざまなアプローチの結果を理解することです。(ところで、私はlinux固有であることから、ここではトピック外の質問になるとは思いません。)
Kaveh

回答:


2

スレッドとプロセスは実行コンテキストです。それらは主に、他の実行コンテキストとの共有状態(メモリ、シグナルハンドラー、ファイル記述子など)の量のみが異なります(プロセスは他のプロセスとほとんど共有せず、スレッドは同じプロセス内の他のスレッドと多く共有します)。

ほとんどのOSは2つのものを分離しているため、いくつかの種類の実行コンテキストを認識しています。

一方、Linuxカーネルには1種類の実行コンテキストしかなく、他のものと共有したり、共有したりできません。プロセスが必要な場合は、ほとんど共有しないように設定し、スレッドが必要な場合は、必要なものを共有するように設定します。プロセス/スレッドの用語に適さない方法で動作するように設定できます。

Linuxのプログラミングで一般的に使用されるPOSIX APIは、プロセスとスレッドのみを認識しているため、ほとんどのプログラムは、カーネル空間とユーザー空間の間で責任が分割される方法で、それらの実装の詳細が何であるかを気にしません。古いスレッドの実装では、実装の詳細(スレッド、スレッドID、プロセスIDの混同など)がリークし、場合によっては正確なPOSIXセマンティクスが提供されませんでした(信号の配信に問題のあるIIRC)。


2
Linuxのスケジューラーの複雑さの一部が欠けていると思います。スレッドが同じプロセスに属しているかどうかはわかります。ユーザーランドのスレッドもあります。さらに、これは、概念を説明するCSの回答よりも、具体的な実装に関するSOの回答のようです。
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.