[openrtm-users 00751] Re: アクティブとデアクティブ状態のリソースの差異、及び同状態のサービスポートの挙動について。

Ando Noriaki n-ando @ aist.go.jp
2009年 2月 4日 (水) 12:58:17 JST


小島様

産総研 安藤です

> いつもお世話になっております。
> 中央大学、院生の小島と申します。
>
> アクティブ状態の時、デアクティブ状態の時の差異について、2点、ご質問があります。
>
> 1.CPU時間の割り当てなどのリソースは、デアクティブとアテクィブな状態では、どの程度の差異が考えられますか?
>
> 大雑把には、実行スレッドが一つ、少なくなるというように考えているのですが、違っておりますか。
> (ざっと調べてみたところ、Aceのスレッドをミューテックスで止めているのかと思ったので・・・)
> それとも、デアクティブにすることで、もっと多くのリソースを節約することができるのでしょうか。

現在の実装では非アクティブ状態のときは、スレッドは空の関数を
実行するという実装になっています。したがって、アクティブ状態と
非アクティブ状態ではスレッドの数に違いはありません。

ただし、実行コンテキストにおいて指定される周期でスレッドを回すために、
sleepかusleepが入っておりますので、非アクティブ状態ではCPU時間を
ほとんど消費しないようにはなっております。

> もし、違っておりましたら、どのファイルを解析すればいいんかなどの指針をいただければ、幸いです。

PeriodicExecutionContext.cpp|h を見てみてください。

> 2.サービスポートは、デアクティブ状態であっても、アクティブの時と同様の働きをすることができるのは仕様ですか?

はいそうです。

> 以前、サービスポートを使って開発していた際、このようなことが起こったため気になったのでお聞きしました。
> この機能は考えようによっては、便利なのですがポリシーなどの点から適切なのでしょうか。

たとえば、仮に非アクティブ状態でサービスポートのサービスが
動かないようにしたとすると、サービスを呼ぶ側(コンシューマ)で、
オペレーションを呼んだときに、どのようにするのが妥当でしょうか?

非アクティブ状態においてサービスポートのサービスオブジェクトを、
(CORBAオブジェクトとして)deactivateすることは簡単にできます。

#onDeactivatedでManagerからPOAを取得して、CORBAオブジェクト
#に対して、PortableServer::POA::deactivate_object()
#を呼び、逆にonActivattedでCORBAオブジェクトに対して、
#PortableServer::POA::activate_object() を呼べば実現できます。

ただし、非アクティブなCORBAオブジェクトに対してオペレーションを呼ぶと、
呼び出し側(コンシューマ側)では例外が発生します。
#まぁ、これはこれで構わないとも思いますが。

また、1つのRTCに対して実行コンテキストは複数関連付けることが可能ですので、
EC0ではActiveだけど、EC1ではDeactiveということも起こりえます。
その場合、サービスポートのサービスがどのように動くのが適切でしょうか?
#これが一番問題ですね。。。

と、いろいろ複雑な問題が絡むので、現状では、
サービスポートのサービスはアクティビティとは独立、
ということにしております。

何か、いいアイディアがあればぜひ教えてください。
-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                  知能システム研究部門 タスクインテリジェンス研究グループ
                  〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                  TEL: 029-861-5981 FAX: 029-862-6631
                  n-ando @ aist.go.jp, n-ando @ ieee.org



openrtm-users メーリングリストの案内