pps
という名前の特別なマネージャーが担当します。
PPSサービスは非常に信頼性が高く、便利で使いやすいことが判明したため、 Smart Energy 、QNX Car、さらにはBlackBerry PlayBookタブレットなどの新しいソリューションや製品で使用されています 。
このノートでは、PPSを実際に理解し、テクノロジーの機能について説明します。最後に、PPSはタスク間相互作用のメカニズムの中で真のコスモポリタンであり、多くのプログラミング言語が「箱から出して」サポートすることを示します。
PPSとは何ですか?
PPSを使用すると、多くのコンポーネントで構成されるシステムの構築を簡素化できます。 将来、これらのコンポーネントは、システム全体を再加工したり、他のコンポーネントを変更したりすることなく、変更、補足、および削除することができます。 さまざまな技術とプログラミング言語を使用してアプリケーションを開発しているさまざまな開発チームは、お互いの知識がなくても相互作用するコンポーネントを開発できます。
タスク間相互作用の他の方法に対するPSSの主な利点:
- 弱いバインディング -相互作用するコンポーネントのセットを簡単に変更できます。
- 柔軟性の向上 -従来の1対1のスキームだけでなく、1対多および多対1の相互作用を構築できます。
- 再起動間のデータの保存 -現在のデータの保存について心配する必要はありません
pps
オブジェクトに配置するだけで、pps
マネージャーがすべてを行います。 - 言語の独立性 -多くの言語とプラットフォームはすでにPPSをサポートしており、必要に応じてこのサポートを追加できます。 異なるプログラミング言語で実装されたコンポーネントは、簡単に相互作用できます。
おそらく、システムが現在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つあります。
- ブロック読み取りモードでオブジェクトを開きます。
- QNX
io_notify()
通知メカニズムまたはPOSIXベースのselect()
関数を使用します。
select()
関数を使用することが望ましいのは、 複数のオブジェクトのプロパティを変更できます。
サブスクリプションモード
2つのサブスクリプションモードがあります。
- オブジェクトを変更するときに、サブスクライバーがオブジェクトのすべてのプロパティを読み取る場合はfull 。 そして
- 最後の読み取り以降に変更されたオブジェクトのプロパティのみが読み取られる場合の「デルタ」 。
図 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個別に考慮されるサーバーモードに注意する価値があります。
2オペレーティングシステムが再起動すると、デルタモードで蓄積された変更は失われます。