MRI 1.9 が開始されると、2 つのネイティブ スレッドが生成されます。1 つのスレッドは VM 用で、もう 1 つはシグナルの処理に使用されます。Rubinis は、JVM と同様にこの戦略を使用します。パイプを使用して、他のプロセスからの情報を伝達できます。
FileUtils
モジュールに関しては、cd
、pwd
、mkdir
、rm
、ln
、cp
、mv
およびメソッドはすべてchmod
、サブモジュールの内部 API を使用して OS ネイティブ ユーティリティにある程度アウトソーシングされ、2 番目のスレッドは an からのシグナルを待つために残されます。外プロセス。これらのメソッドは完全にスレッドセーフであるため、インタープリターをロックする必要はなく、メソッドが互いにブロックすることはありません。chown
touch
StreamUtils
編集:
MRI 1.8.7 は非常にスマートで、スレッドが何らかの外部イベント (ブラウザーが HTTP 要求を送信するなど) を待機している場合、スレッドをスリープ状態にして、データが検出されると起動できることを認識しています。- Evan Phoenix 氏、Engine Yard in Ruby、Concurrency、および You
FileUtils の実装の基本的な実装は、ソースを見ることから 1.8.7 の意味をあまり変更していません。1.8.7 はまた、スリーピー タイマー スレッドを使用して IO 応答を待ちます。1.9 での主な違いは、グリーン スレッドではなくネイティブ スレッドを使用することです。また、スレッドのソース コードはより洗練されています。
スレッドセーフとは、プロセス間で共有されるものがないため、グローバル インタープリターをロックする理由がないことを意味します。Ruby が特定のタスクを実行するときに「ブロック」するという誤解があります。スレッドがブロックする必要があるとき、つまり CPU を使用せずに待機する必要があるときはいつでも、Ruby は単純に別のスレッドをスケジュールします。ただし、CPU の 20% を使用して応答を待機しているラック サーバーなどの特定の状況では、インタープリターのロックを解除し、待機中に並行スレッドが他の要求を処理できるようにすることが適切な場合があります。これらのスレッドは、ある意味で並行して動作しています。GIL はrb_thread_blocking_region
API でロック解除されます。これは、このテーマに関する良い投稿です。