QNX RTOS:小核、スレッド、プロセスについて少し

QNXリアルタイムオペレーティングシステムに関する最初の小さなレビューで、 Habrの住民の間で関心があることが示されたため、一連のメモを続けることにしました。 QNX6のシステムアーキテクチャについて少し話をする価値があるように思えます。 マイクロカーネルとは何か、それが解決するタスクを定義することは価値があると思います。 物語の過程で、QNXに関連する2つの神話も暴かれます。 しかし、最初に...



POSIXについて少し



QNXの新しいバージョンがリリースされるたびに(そして1981年にQNX RTOSの最初のバージョンが登場したことに注意する必要があります)、開発者は以前の経験を活用し、開発者にとってより便利なシステムを改善しました。 これが、QNX Neutrinoがスレッド管理、リアルタイム拡張、追加のリアルタイム拡張、アプリケーション環境プロファイル(AEP)などのPOSIX 1003.1標準をサポートする理由です。



なぜこれについて話しているのですか? とても簡単です。 QNXの特徴であり、POSIXに関連する2つの点に注意したいと思います。 POSIXオペレーティングシステムはUNIXを隠すと考えられています。 もしそうなら、そのようなシステムは面倒であり、組み込みソリューションで使用することはできません。 ただし、QNXの場合、これは正しくありません。 POSIX標準では、実装ではなくインターフェイスについて説明しています。 これは、POSIXレイヤーの下に、マイクロカーネルを含むすべてのものを隠すことができることを意味します。



私が詳しく述べたい2番目の点は、おそらく明らかです。 これらはもちろん、POSIXがQNXで提供する利点です。

したがって、QNXのPOSIXにはいくつかの利点があると結論付けることができます。



真のコア



QNX RTOSは、マイクロカーネルアーキテクチャに基づいています。 停止する価値があると思います。次に進む前に、マイクロカーネルとは何かを判断します(少なくともQNXの用語では)。 小核という用語はしばらくの間非常に人気があり、小さなコアを含む多くのシステムは小核と呼ばれています。 そして、コアがさらに小さい場合、それはナノ核と呼ばれます。 これはQNXに完全に当てはまるわけではありません。 カーネルのサイズが小さいことが主な目標ではありません。 これは、オペレーティングシステムの多くの機能(たとえば、ファイルシステムサポートなどの使い慣れた機能を含む)が、カーネルからユーザーアプリケーションの領域に取り込まれるというものです。 また、マイクロカーネル自体が実行する機能はごくわずかであり、そのほとんどがタスク間相互作用を提供します。

プロセス制御でさえ、マイクロカーネルではなく、プロセス管理者によって実行されることに注意してください(ただし、マイクロカーネルと結合されて1つのモジュールになります)。 これはシステムの真のコアではありませんか?



上記にリストしたのは、QNXマイクロカーネルが行うことのすべてです。 ネットワークドライバーやディスクサポートのようなものは、通常のユーザープロセスのように実行および動作する別個のモジュールに配置されます。 (モノリシックコアをベースにしたシステムを超える)すべての利点を備えています。 そして、これらの利点は何ですか? 非常にシンプル:

神話:QNXマイクロカーネルはアセンブラーで書かれています



一部の開発者の間では、QNX Neutrinoマイクロカーネルの高いパフォーマンスとコンパクトさは、アセンブリ言語で記述された結果であると考えられています。 しかし、これはそうではありません。 マイクロカーネルはほぼ完全にCで記述されています。パフォーマンスとコンパクトさは、十分に確立されたアルゴリズムと構造を使用した結果です。



QNXのプロセスとスレッド



POSIX仕様によると、QNX RTOSはストリームをサポートしています。 さらに、QNXマイクロカーネルはスレッドのみを制御し、最小の「実行単位」と見なすことができるのはスレッドです。 QNXの各プロセスには、1つ以上のスレッドを含めることができます。 このように、プロセスはスレッドのコンテナとして見ることができます。



最も単純な場合、プロセスには1つのスレッドを含めることができます(また、含める必要があります)。 ただし、場合によっては、1つのプロセスで複数のアルゴリズムを並列実行する必要があります。 QNXから小さな例を挙げます。 ファイルシステムマネージャーは、複数のクライアント(他のプロセス)からの要求を並行して受信および処理できます。 マネージャーが1つのスレッドで作業した場合、マネージャーに連絡する2番目のクライアントは、以前に要求された操作の完了を待つ必要があります。 幸いなことに、QNXのファイルシステムマネージャーは複数のスレッドで動作するため、複数のアプリケーションを同時に並行して処理できます。



QNXのすべてのプロセスは互いに分離され、独自の仮想アドレス空間で実行されます。 メモリ管理ユニット(MMU)は、このような保護の実装を担当します。 プロセッサ内のMMUデバイスの存在は、QNXを起動するための前提条件です。 同時に、1つのプロセスのスレッドは1つのアドレス空間で動作します。



システム内のすべてのタスクが同じアドレス空間で動作するフローである場合、スキームに従って実装されたシステムがあります。 一方では、これはプロセス間通信を容易にします。 しかし一方で、スレッドのエラーはシステム全体の崩壊につながる可能性があります。 そして、この原則に基づいて構築されたシステムのデバッグと保守は、はるかに困難です。



神話:QNXマイクロカーネルはプロセス間でコンテキストをゆっくり切り替えます



スレッドはもともと、UNIXシステムで、プロセス間のコンテキスト切り替えが遅すぎるという問題の解決策として登場しました。 最も可能性が高いのは、それ以来、プロセス間のコンテキスト切り替えが非常に遅いことが一般に受け入れられているためです。 また、マイクロカーネルを使用してメッセージを送信する場合、モノリシックカーネルを使用する場合よりも多くのコンテキストスイッチが実行されるため、簡単な結論が得られます-QNXは低速です。 ただし、QNX Neutrinoアーキテクチャは、コンテキストスイッチングのパフォーマンスの問題を解決します。 また、QNXでは、プロセスとスレッド間のコンテキスト切り替えの速度に実質的に違いはありません。



ストリームの生き方



プロセスの実行中に、プロセス内のスレッドを動的に作成および削除できます。 たとえば、スレッドを作成する場合、 pthread_create()



関数は必要なリソースを割り当てて初期化し、スレッドはプロセスのアドレス空間内の指定された関数から開始します。 スレッドが終了すると、たとえばpthread_exit()



関数を使用して、リソースが解放されます。



スレッドの実行中は、準備完了(準備完了)またはブロック済み(ブロック済み)の2つの状態になります。 しかし、実際には、スレッドをブロックできるさまざまな理由があり、 pidin



(QNX固有のバージョンのps



ユーティリティ)を使用してプロセスとスレッドに関する情報を表示すると、SEND、RECEIVE、SIGWAITINFO、NANOSLEEPなどのさまざまな状態を観察できますその他。 たとえば、この状態では、USBマネージャースレッドがあります。



 # pidin -P io-usb pid tid name prio STATE Blocked 4101 1 proc/boot/io-usb 10o SIGWAITINFO 4101 2 proc/boot/io-usb 21r RECEIVE 1 4101 3 proc/boot/io-usb 10o RECEIVE 4 4101 4 proc/boot/io-usb 10r NANOSLEEP 4101 5 proc/boot/io-usb 10o RECEIVE 4
      
      





ここで、 pidはシステム内のプロセス識別子(プロセスID)、 tidはプロセス内のスレッド識別子(スレッドID)、 prioはスレッドの優先順位番号とスケジューリング規則、 STATEはスレッドステータス、 Blockedブロックの理由に依存する値です。 上記の例では、スレッド2、3、および5は受信ブロック状態です(つまり、他のスレッドからメッセージを受信する準備ができています)。



エピローグ



POSIXの利点と、QNXマイクロカーネルの役割について少し話をしようとしました。 これが面白かったと思います。 実際には、タスク間の相互作用の規律とメカニズムの計画について話すのは良いことですが、この情報がすべて混乱にならないように、別々のトピックでこれを行う方が良いと思いました。 次回はもっと面白いものになると約束します。



その他。 誰かがQNXに興味を持っているなら、私が説明したものすべて、さらにもっと多くのものをQNX Neutrinoのシステムアーキテクチャで読むことができます。 このドキュメントは、Webサイトwww.qnx.com (英語)から電子形式で入手できます。また、ロシア語の翻訳版も印刷されています。

  1. リアルタイムオペレーティングシステムQNX Neutrino 6.3。 システムアーキテクチャ。 ISBN 5-94157-827-X
  2. リアルタイムオペレーティングシステムQNX Neutrino 6.3。 ユーザーマニュアル。 ISBN 978-5-9775-0370-9



All Articles