QNX RTOS:PPS-疎結合インターワーキング

QNXリアルタイムオペレーティングシステムに関するノートサイクルのもう1つの続き。 今日は、インタータスクについて再度説明したいと思いますが、1つの特定のメカニズム-永続的パブリッシュ/サブスクライブ(PPS、堅牢なパブリッシング/サブスクリプションサービス)についてのみ説明します。 これは、バージョン6.5.0でのみ登場したQNX Neutrinoの新しいタイプの対話であることにすぐに注意します。 PPSテクノロジーはマイクロカーネルに実装されていません。このメカニズムの操作は、 ppsという名前の特別なマネージャーが担当します。

PPSサービスは非常に信頼性が高く、便利で使いやすいことが判明したため、 Smart Energy 、QNX Car、さらにはBlackBerry PlayBookタブレットなどの新しいソリューションや製品で使用されています

このノートでは、PPSを実際に理解し、テクノロジーの機能について説明します。最後に、PPSはタスク間相互作用のメカニズムの中で真のコスモポリタンであり、多くのプログラミング言語が「箱から出して」サポートすることを示します。

PPSとは何ですか?


PPSを使用すると、多くのコンポーネントで構成されるシステムの構築を簡素化できます。 将来、これらのコンポーネントは、システム全体を再加工したり、他のコンポーネントを変更したりすることなく、変更、補足、および削除することができます。 さまざまな技術とプログラミング言語を使用してアプリケーションを開発しているさまざまな開発チームは、お互いの知識がなくても相互作用するコンポーネントを開発できます。

タスク間相互作用の他の方法に対するPSSの主な利点:


おそらく、システムが現在3つまたは4つのコンポーネントで構成されており、将来的に変更および拡張できる場合は、PPSを適用することが適切なステップになります。

PPSとは何ですか?


PPSは非常に簡単です。 これらは、プロパティとオブジェクトが表示されるファイルです。 彼らは現れさえしませんが、すぐそこに住んでいます。 1つのファイルに保存されるオブジェクトは1つだけです。 POSIXアクセス属性で許可されていれば、どのプロセスでもそのようなファイルを読み書きできます。 次のように、ほぼすべての言語でプログラムからPPSを操作できます。 オブジェクトにアクセスするには、通常の関数read()write()などが使用されます。 おそらく十分な退屈さ、そしておそらくそれは実用的な演習を開始する時間です。

まず、 ppsマネージャーを起動する必要があります。

 # pps 

もちろん、マネージャーにはコマンドライン引数がありますが、基本的なものはありません。 リファレンスガイドの説明は誰でも読むことができます。 後続のすべての演習を実行するとき、 ppsマネージャーが既に実行されていると想定します。 次に、 figureなどのオブジェクトを作成してみましょう。

 # touch /fs/pps/figure 

以上です。 これで、オブジェクトを読み取ることができます。

 # cat /fs/pps/figure @figure 

そのため、オブジェクトの名前を確認できます。 オブジェクトにはまだプロパティがありません。 たとえば、 formを追加できます。

 # echo "form::square" >> /fs/pps/figure # cat /fs/pps/figure @figure form::square 

colorなどの別のプロパティを追加できます。

 # echo "color::red" >> /fs/pps/figure # cat /fs/pps/figure @figure color::red form::square 

次のコマンドはオブジェクトを削除し、1つのプロパティで再作成することに注意してください。

 # echo "color::green" > /fs/pps/figure # cat /fs/pps/figure @figure color::green 

>と>>の違いを知っていることを願っています。 オブジェクトの任意のプロパティまたは複数のプロパティは、いつでも変更または追加できます。

 # echo "color::blue\nform::circle" >> /fs/pps/figure # cat /fs/pps/figure @figure color::blue form::circle 

オブジェクトのプロパティはすべて削除できます。

 # echo "-color" >> /fs/pps/figure # cat /fs/pps/figure @figure form::circle 

オブジェクト自体が不要になった場合は、削除できます。

 # rm /fs/pps/figure # cat /fs/pps/figure /fs/pps/figure: No such file or directory 

Habréの読者は、例の意味を理解し、好きな言語で書き直すのに十分な読み書きができる人だと思います。

そして今、私には、PPS-Persistent Publish / Subscribeという名前の意味を説明する時が来たようです。

永続的(持続可能)


保管中のPPSサービスは、データをRAMに保管します。 しかし同時に、PPSは、不揮発性ストレージのリブート間でデータが保存されることを保証します。 通常、データはディスクまたはフラッシュメモリ上のファイルシステムに保存されます。 必要に応じて、開発者は非標準メディア上のデータのストレージを整理できます。

起動時に、 ppsマネージャーは不揮発性ストレージからデータを復元します。 -lオプションを使用して、さまざまなデータ回復モードを指定できます。


出版


これについてはすでに十分に知っています1 。 書き込み用にファイルを開き、オブジェクトの属性を書き込み、削除するだけです。

 sprintf( ppsobj, "-color\n" ); // Delete the "color" attribute write( ppsobj-fd, ppsobj, strlen( ppsobj ) ); 

おそらく、いくつかのプロセスが同じオブジェクトを同時に開いて属性を記述および変更できることに注意する価値があります。 これは、異なるプロセスが異なる属性を担当する場合に役立ちます。

購読する


サブスクリプションについてはすでに知っていますが、すべてではありません。 PPSがそれほど単純で些細なものだとは思わないでしょう。 はい、間違いなくどこかにうろついている犬がいます。 そして、彼女はサブスクリプションで正確にうなずきました。 読み取りのブロックやデルタモードなど、サブスクリプションには微妙な点があります。 これらの機能のいくつかを検討してください。

ブロック読み取り

デフォルトでは、PPSオブジェクトファイルからの読み取りは非ブロッキングです。 これは、他のファイルシステムの一般的な動作です。 これは、標準ユーティリティが通常どおりに動作するように特に行われます。 オブジェクトの変更をタイムリーに取得する最も簡単な方法(常に成功するとは限りません)は、読み取りをブロックすることです。 ブロック読み取りモードでPPSオブジェクトを開くには、修飾子?Waitでファイルを開くだけです

大胆な実験を行ってみましょう。1つのコンソールでオブジェクトのプロパティを変更し、もう1つのコンソールでこれらの変更を監視します。 これを行うには、2つのコンソールが必要です。 Photonグラフィカル環境が実行されている場合、すべてが簡単です。 作業がテキストコンソールで行われる場合、それらの切り替えはCtrl + Alt + nのキーの組み合わせによって実行されます(ここで、nはLinuxのようにファンクションキーF1、F2ではなく、数字1、2などのキーです)。 そして、オブジェクトを作成します:

 # echo "color::green" >> /fs/pps/figure 

2番目のコンソールで、ブロック読み取りモードで開きます。

 # cat /fs/pps/figure?wait @figure color::green 

catユーティリティは終了しませんが、読み取りによってブロックされることに注意してください。 最初のコンソールで、いくつかのコマンドを入力します。

 # echo color::red >> /fs/pps/figure # echo color::white >> /fs/pps/figure 

2番目のコンソールでは、出力が継続します。

 @figure color::red @figure color::white 

これは、2つのコンソールが目の前にある場合、Photonで特に明確に行われます。 通常のCtrl + Cでcat終了できます。

読み取りモードはその場で切り替えることができます。 次のCコードはこの機能を示しています。

 flags = fcntl( fd, F_GETFL ); flags |= O_NONBLOCK; fcntl( fd, F_SETFL, flags ); 

新しいデータ通知

PPSから新しいデータをタイムリーに受信する方法は2つあります。


select()関数を使用することが望ましいのは、 複数のオブジェクトのプロパティを変更できます。

サブスクリプションモード

2つのサブスクリプションモードがあります。


画像
1.フルおよび「デルタ」PPSサブスクリプションモード。

フルモードでは、オブジェクトの読み取り時に常に存在するすべてのプロパティとともに、オブジェクト全体が常に読み取られることに注意してください。 これは、読み取りの間に同じプロパティが数回変更された場合、最後の変更が読み取られることを意味します。

反対に、「デルタ」モードでは、サブスクライバーはオブジェクトのプロパティに対するすべての変更を受け取ります。 何もスキップされません2 。 オブジェクトを「デルタ」モードで開くには、オブジェクトの名前の後に?デルタ修飾子を指定する必要があります。

次の例は、デルタモードでのオブジェクトの読み取りを示しています。 最初のコンソールで、オブジェクトを作成します。

 # echo "color::red\nform::square" >> /fs/pps/figure 

2番目のコンソールで、「デルタ」モードでサブスクライブします。

 # cat /fs/pps/figure?delta,wait @figure color::red form::square 

色を変更:

 # echo "color::green" >> /fs/pps/figure 

変更を観察します。

 @figure color::green 

フォームを変更します。

 # echo "form::circle" >> /fs/pps/figure 

変更を観察します。

 @figure form::circle 

2つのプロパティを一度に変更します。

 # echo "color::red\nform::square" >> /fs/pps/figure 

そして、1つの変更を取得します。

 @figure color::red form::square 

サーバーモード


PPSオブジェクトにはサーバーがあります。 このようなプロセスは、出版社の間で主要なことです。 彼はクリティカルサブスクライバーとも呼ばれます。 サーバーモードでオブジェクトを開くには、 ?サーバー修飾子を指定する必要があります。 残りの加入者は顧客のようになります。

クライアントのいずれかがオブジェクトのプロパティを変更すると、サーバーのみがオブジェクトの通知と変更を受け取ります。 クライアント識別子(番号)もオブジェクト識別子に追加されます。次に例を示します。

 @figure.1234 

新しいクライアントがオブジェクトをサブスクライブすると、サーバーはプラス記号(+)付きの通知を受け取ります。

 +@figure.1234 

クライアントがマイナス記号(-)のみでオブジェクトの購読を解除した場合も、同様の通知が届きます。 サーバーがクライアントのみに応答する場合、クライアント識別子を使用してオブジェクトを書き込む必要があります。そうしないと、すべてのクライアントが通知を受け取ります。 図 図2は、サーバーとPPSクライアントの相互作用を示しています。

画像
2. PPSサーバーモード。

コマンドラインユーティリティのみを使用してサーバー操作の例を示すことは難しいため、興味がある場合は、たとえばCで自分で開発することをお勧めします。

さまざまなプログラミング言語でのPPSサポート


QNXの主要なプログラミング言語はCです。しかし、他の言語とプラットフォームもサポートされています。 PPSをサポートしますか? はい、そうです。 Adobe Flashなどの戦略的プラットフォームには、PPSを操作するための拡張機能とクラスがあります。 しかし、他の言語はどうですか?

この記事で説明したすべての内容からわかるように、PPSを介したやり取りを行うには、ファイルを開いたり、ファイルを読み書きしたりする必要があります。 快適な作業のために、 select()関数を実装する必要があります。 それがおそらくすべての要件です。 そして、これらの要件は、たとえばPythonによって満たされています。 信じられない? はい、簡単なことはありません。次のコマンドを使用して、2つのPPSオブジェクトを大胆に作成しましょう。

 # echo "form::triangle\ncolor::green" >> /fs/pps/figure # echo verb::runs >> /fs/pps/action 

別のコンソールで、次のPythonスクリプトを実行します。

 #!/usr/qnx650/host/qnx6/x86/usr/bin/python import select action = { "verb" : "stop" } figure = { "form" : "circle", "color" : "black" } sentence = { "action" : action, "figure" : figure } f1 = open('/fs/pps/figure?delta', 'r') f2 = open('/fs/pps/action?delta', 'r') while 1: r, w, e = select.select( [f1, f2], [], [] ) for f in r: d = f.read().split() for a in d[1:]: k, v = a.split( "::" ) sentence[ d[0][1:] ][k] = v print figure["color"], figure["form"], action["verb"] 

最初のコンソールでは、 figureおよびactionオブジェクトのさまざまな属性を変更しようとします。2番目では、出力の変化を観察します。 自分で遊んでみてください、次のようなものを取得する必要があります。

 green triangle runs green circle runs blue circle runs white square runs white square stops 

Pythonスクリプトは非常にシンプルで、PPSで動作するさまざまなプログラミング言語の可能性を示すためだけに役立ちます。 いわゆるばかからの保護はありません。 しかし、プログラムがどれほど単純であるかに注目してください。 すごい、プロセスが相互にやり取りするために特別なことをする必要はありません。 個人的には、PPSテクノロジーが本当に好きでした。

追加資料


  1. PPSテクノロジー
  2. 持続可能なQNXパブリッシュ/サブスクライブサービス
  3. QNX Persistent Publish / Subscribe開発者ガイド


1個別に考慮されるサーバーモードに注意する価値があります。

2オペレーティングシステムが再起動すると、デルタモードで蓄積された変更は失われます。

Source: https://habr.com/ru/post/J129196/


All Articles