、大学は混乱し、無意味な時間であるオペレーティングシステムの教科書を使用して主張。
まず、何をここで説明されていることは、完全にシステム固有のものです。いくつかのオペレーティングシステムでは、同期システムコールはすべてのスレッドをブロックします。これは、すべてのオペレーティングシステムでは当てはまりません。
第2に、ユーザースレッドは貧弱な人のやり方です。オペレーティングシステムがサポートされていなかったため、あなたの昔のユーザスレッドが発生しました。ユーザスレッドをカーネルスレッドよりも「効率的」なものにするようなものもあります(理論的には、ライブラリはカーネルよりも速くスレッドを切り替えることができます)が、これは実際のBSです。ユーザスレッドは完全に時代遅れであり、開発者にスレッドを使用させるシステムはOBSOLETEです。 VMSのような古いシステムでさえ、カーネルスレッドを持っています。
近代的なOSのコースでは、「ユーザー・スレッドは、」サイドバーや歴史的な脚注でなければなりません。本質的には
、あなたの本は何も存在しない議論をしようとしています。これは、第二次世界大戦後のアメリカ軍の査定で、シャーマンタンクとパンサーを比較したものです。実際には、シャーマンは時代遅れで、パンサーでも同じクラスでさえもないときに、2つの音を同等にするように、シャーマンが快適な座席を動かすようなことを話します。
1.これらはユーザ空間スレッドなので、カーネルはどのようにして「スレッド切り替え」を行うことができますか? 2. "カーネルにこれをやらせる"ことは、 "ここ"はどういう意味ですか?
システムコールを呼び出すときにスレッドがプロセスをブロックすることが示唆されています。これが発生すると、オペレーティングシステムはコンテキストスイッチを行います。この場合、オペレーティングシステムは、とにかく別のプロセスに「スレッド切り替え」を行っています。彼らがあなたに導こうとしている[正しい]結論は、このスイッチがユーザのスレッドを取り除くことがオーバーヘッドの削減を主張しているということです。
私は、以下のような行動が考えられました。1.「選択」コールが行われ、次のシステムコールがブロッキングコールであることが検出されました。 2.ユーザ空間スレッドスケジューラはスレッドの切り替えを行い、スレッドを実行する。
システムコールをブロックすることによって完全にブロックされていないユーザースレッドの実装の場合を考えてみましょう。
- ライブラリはスレッド切り替え用のタイマを設定します。
- スレッドが実行を開始または再開します。
- スレッドはブロックシステムサービス(例えば、select)を行います。
- オペレーティングシステムは、システムサービスの処理の一部としてプロセスを切り替えます。
- タイマーがオフになります。
- プロセスは再び電流になり、OSはライブラリ内のタイマーハンドラを呼び出します。
- ライブラリは実行する別のスレッドをスケジュールします。
あなたが直面している問題は、ブロッキングシステムサービスが、通常、コンテキストスイッチを開始する処理コードの一部として持つことです。システムはスレッドについて知らないので(そうでなければカーネルスレッドを使用する)、そのようなブロッキングサービスを呼び出すスレッドはコードを通過します。
プロセスに実行可能なスレッドが含まれていても、オペレーティングシステムはプロセス内のライブラリによって管理されているため、その知識が分かっているため実行されません。
あなたが読んでいる本から引用されたこの記事のどの部分、そしてこの本は何歳ですか?それは時代遅れのようです。 – user2357112
第2.2.4章第2章の最後の段落です。私は第3版を使用しています –