2017-01-26 4 views
-1

私は、「Modern Operating System」という本から、ユーザー空間のスレッドに関するセクションを読んでいます。ユーザーレベルのスレッドに対して最も壊滅的な議論をします。

また、ユーザレベルのスレッドとは異なり、おそらくプログラマは、スレッドが頻繁にブロックするアプリケーション(たとえば、マルチスレッドWebサーバーなど)でスレッドを正確に実行する必要があります。これらのスレッドは常にシステムコールを行っています。システムコールを実行するためにカーネルにトラップが発生すると、は、古いものがブロックされた場合にカーネルがスレッドを切り替えることはほとんどなくなり、カーネルがこれを行うと、常に選択システムコールを行う必要がなくなります読み込みシステムコールが安全かどうかをチェックします。本質的に完全にCPUにバインドされ、ほとんどブロックされないアプリケーションの場合、スレッドを持つ点は何でしょうか?誰も真に最初のn個の素数を計算することを提案したり、スレッドを使ってチェスをしたりすることは、そうすることによって得られるものはないからです。

私は大胆なテキストについては特に混乱しています。 1.これらはユーザ空間のスレッドなので、カーネルはどのようにして "スレッドを切り替える"ことができますか? 2. "カーネルでこれを行う"とは、 "ここ"はどういう意味ですか?私は行動が似ていると思った

:呼び出しが行われている「選択」し、次のシステムコールを見つける 1.ブロック1です。 2.ユーザ空間スレッドスケジューラはスレッドの切り替えを行い、スレッドを実行します。何らかの理由で

+1

あなたが読んでいる本から引用されたこの記事のどの部分、そしてこの本は何歳ですか?それは時代遅れのようです。 – user2357112

+0

第2.2.4章第2章の最後の段落です。私は第3版を使用しています –

答えて

0

、大学は混乱し、無意味な時間であるオペレーティングシステムの教科書を使用して主張。

まず、何をここで説明されていることは、完全にシステム固有のものです。いくつかのオペレーティングシステムでは、同期システムコールはすべてのスレッドをブロックします。これは、すべてのオペレーティングシステムでは当てはまりません。

第2に、ユーザースレッドは貧弱な人のやり方です。オペレーティングシステムがサポートされていなかったため、あなたの昔のユーザスレッドが発生しました。ユーザスレッドをカーネルスレッドよりも「効率的」なものにするようなものもあります(理論的には、ライブラリはカーネルよりも速くスレッドを切り替えることができます)が、これは実際のBSです。ユーザスレッドは完全に時代遅れであり、開発者にスレッドを使用させるシステムはOBSOLETEです。 VMSのような古いシステムでさえ、カーネルスレッドを持っています。

近代的なOSのコースでは、「ユーザー・スレッドは、」サイドバーや歴史的な脚注でなければなりません。本質的には

、あなたの本は何も存在しない議論をしようとしています。これは、第二次世界大戦後のアメリカ軍の査定で、シャーマンタンクとパンサーを比較したものです。実際には、シャーマンは時代遅れで、パンサーでも同じクラスでさえもないときに、2つの音を同等にするように、シャーマンが快適な座席を動かすようなことを話します。

1.これらはユーザ空間スレッドなので、カーネルはどのようにして「スレッド切り替え」を行うことができますか? 2. "カーネルにこれをやらせる"ことは、 "ここ"はどういう意味ですか?

システムコールを呼び出すときにスレッドがプロセスをブロックすることが示唆されています。これが発生すると、オペレーティングシステムはコンテキストスイッチを行います。この場合、オペレーティングシステムは、とにかく別のプロセスに「スレッド切り替え」を行っています。彼らがあなたに導こうとしている[正しい]結論は、このスイッチがユーザのスレッドを取り除くことがオーバーヘッドの削減を主張しているということです。

私は、以下のような行動が考えられました。1.「選択」コールが行われ、次のシステムコールがブロッキングコールであることが検出されました。 2.ユーザ空間スレッドスケジューラはスレッドの切り替えを行い、スレッドを実行する。

システムコールをブロックすることによって完全にブロックされていないユーザースレッドの実装の場合を考えてみましょう。

  1. ライブラリはスレッド切り替え用のタイマを設定します。
  2. スレッドが実行を開始または再開します。
  3. スレッドはブロックシステムサービス(例えば、select)を行います。
  4. オペレーティングシステムは、システムサービスの処理の一部としてプロセスを切り替えます。
  5. タイマーがオフになります。
  6. プロセスは再び電流になり、OSはライブラリ内のタイマーハンドラを呼び出します。
  7. ライブラリは実行する別のスレッドをスケジュールします。

あなたが直面している問題は、ブロッキングシステムサービスが、通常、コンテキストスイッチを開始する処理コードの一部として持つことです。システムはスレッドについて知らないので(そうでなければカーネルスレッドを使用する)、そのようなブロッキングサービスを呼び出すスレッドはコードを通過します。

プロセスに実行可能なスレッドが含まれていても、オペレーティングシステムはプロセス内のライブラリによって管理されているため、その知識が分かっているため実行されません。

関連する問題