[openrtm-users 01359] Re: high CPU load when deactivate python component

Ando Noriaki n-ando @ aist.go.jp
2010年 7月 7日 (水) 01:25:07 JST


安藤です

> 安藤様
>
> 清水です。
>
>> #別の実装としては、ECのactivate_component()
>> などの呼び出しから、
>> #現在アタッチされているRTCの状態がInactiveかどうかをEC
> 自体が常に補足
>> #するという方法もありますかね?
>
> 私が考えていたのは、こちらの方法で、
> 毎周期RTCの状態を調べる必要はありません。

そうなんですが、こちらは同じ状態を2か所で持つのでいやだなと。。。

> RTCの状態遷移図によると、
> 以下のようになっています。
>
> ・INACTIVE -> ACTIVEの状態遷移は、
> activate_component()をトリガーとして発生する。
>
> ・ACTIVE -> INACTIVEの状態遷移は、
> deactivate_component()をトリガーとして発生する。
>
> ・ERROR -> INACTIVEの状態遷移は、
> reset_component()をトリガーとして発生する。
>
> これより、ECをstart/stopするタイミングは、
> 上記のメソッドが呼ばれた時だけになると思います。
> したがって、上記メソッドの内部で
> RTCの状態をチェックしECをstart/stopすれば、
> 最小限の負荷で、RTCの状態とECのstart/stopを
> 連動させることができると考えたわけです。

> また、少々手間ですが、RTCの状態とECのstart/stopを
> 連動させるかどうかをconfで指定できると
> ベストかと思います。

これは全部のRTCがInactiveになったらECが自動でstopped
状態になるということですか?ECのstopped/runningはInactive/Active/Error
状態とは独立なので、RTCの仕様的にもちょっと混乱を招きそうです。

とりあえず、こちらの案も含めて検討してみます。

> ご検討の程、よろしくお願いいたします。
>
> 清水
>
> --- Ando Noriaki <n-ando @ aist.go.jp> wrote:
>
>> みなさま
>>
>> 安藤です
>>
>> ほぼ栗原さんからの返答で言い尽くされていると思いますが
> 少し補足を。
>>
>> ECとRTCの関係ですが、PeriodicExecutionContext::svc()
>> がまさに
>> その部分になるかと思います。
>>
>>     do
>>       {
>>         m_worker.mutex_.unlock();
>>         while (!m_worker.running_)
>>           {
>>             m_worker.cond_.wait(); //
>> stopped状態のときここで待つ
>>           }
>>         if (m_worker.running_)
>>           {
>>             std::for_each(m_comps.begin(),
>> m_comps.end(),
>> invoke_worker()); // すべてのRTCのアクションを実行
>>           }
>>         m_worker.mutex_.unlock();
>>         if (!m_nowait) { coil::sleep(m_period); }
>>       } while (m_svc);
>>
>>
>> invoke_worker()
>> の中身ですが、コンポーネントの現在の状態の
>> アクション (on_何とか)
>> を実行するものだと思ってください。
>> なお、Inactive
>> 状態は、on_何とかに相当する関数がないので
>> ダミーの空の関数が実行されていると思ってください。
>>
>> do-while の for_each
>> の部分を書き下すと、コンポーネントがそれぞれ以下の状態
> にある場合
>>
>> RTC0: inactive
>> RTC1: active
>> RTC2: active
>> RTC3: error
>>
>> do-while の for_each 内
>>  RTC0. dummy();
>>  RTC1: on_execute();
>>  RTC2: on_execute'(;
>>  RTC3: on_error();
>>
>> ということになります。したがって、RTC0がinactive状態で
> すが、
>> ループを止めるわけにはいきません。
>>
>> 清水さんがおっしゃるように、すべてのRTCがinactiveの場
> 合は
>> ループを止めてもいいのですが、そうなると、
>> #以下適当なコードですが、
>>
>>     do
>>       {
>>         m_worker.mutex_.lock();
>>         while (!m_worker.running_)
>>           {
>>             m_worker.cond_.wait(); //
>> ECのstopped状態のときにここで止まってる
>>           }
>>         if (m_worker.running_) //
>> ECがrunning状態のとき
>>           {
>>             m_inactivewait.mutex_.lock();
>>             inactivecomps =
>> for_each(m_comps.begin(), m_comps.end(),
>> Inactivecomps()); // (1) Inactiveかどうか調べる
>>             while (inactivecomps.num() ==
>> m_comps.size()) {
>> m_inactivewait.cond_.wait(); } // (2)
>> 全部inactiveならwait
>>             std::for_each(m_comps.begin(),
>> m_comps.end(),
>> invoke_worker()); // (3) 各RTCのアクションを実行
>>             m_inactivewait.mutex_.unlock();
>>           }
>>         m_worker.mutex_.unlock();
>>         if (!m_nowait) { coil::sleep(m_period); }
>>       } while (m_svc);
>>
>>
>> という感じで、毎周期すべてのコンポーネントを調べる必要
> があります。
>> #別の実装としては、ECのactivate_component()
>> などの呼び出しから、
>> #現在アタッチされているRTCの状態がInactiveかどうかをEC
> 自体が常に補足
>> #するという方法もありますかね?
>>
>> この部分は、リアルタイム実行される可能性もあるので、こ
> れを
>> 取り込むかどうかは (1) の for_each
>> がどのくらいの時間がかかるかにもよると思います。
>> あと、ロックが追加されている部分と、ECのもうひとつの状
> 態遷移(stopped<->running)
>> との兼ね合いについてもよく考える必要があります。(デッ
> ドロックが起こらないかどうかなど)
>>
>> というわけですので、今後の検討課題とさせてください。
>>
>>
>>
>>
>> 2010年7月6日19:15 kurihara shinji
>> <shinji.kurihara @ aist.go.jp>:
>> > 松坂様
>> >
>> > 栗原です。
>> >
>> >
>> 以下は、一つのExecutionContextに対して複数のRTCが登録
> された場合についてです。
>> >
>> >> ・ExecutionContextは直列リストの構造をしている。
>> >
>>
> ExecutionContextは、add_component(rtobj)にて登録されたRTC
> をリストで管理してお
>> >
>> り、whileループの中では、リストに登録されているRTCのア
> クティビティ処理を呼び出し
>> > ます。(正確には、StateMachineから呼ばれます。)
>> >
>> >>
>> ・ただし、あくまで分散コンポーネントモデルなので中央で
> コンテキストを管理している
>> >>
>> サービスがあるわけではなく、各コンポーネント同士がバケ
> ツリレーのような形で
>> >> 実行タイミングを通知しあっている。
>> >
>> RTCのリストに登録してある順番でRTCのon_execute()などを
> 呼びますので、たとえば、
>> >
>> 3つのRTC(A,B,C)が登録されていて、3つのRTCがACTIVE状
> 態であれば、Aのon_execute
>> >
>> ()が戻ってきて、Bのon_execute(),Cのon_execute()のよう
> になります。
>> >
>> よって、各コンポーネント同士が実行タイミングを通知しあ
> っているのではなく、
>> >
>> あるRTCのアクティビティ処理が終了次第、次のRTCのアクテ
> ィビティ処理の実行をECが
>> > 行うといった仕様になっております。
>> >
>> >
>> > 以上、宜しくお願い致します。
>> >
>> >
>> > On Tue, 6 Jul 2010 17:44:54 +0900
>> > Yosuke Matsusaka <yosuke.matsusaka @ aist.go.jp>
>> wrote:
>> >
>> >> 栗原さん
>> >>
>> >> 松坂です。
>> >>
>> >> 2010/7/6 kurihara shinji
>> <shinji.kurihara @ aist.go.jp>:
>> >> >
>> RTMでは、一つのExecutionContextで複数のRTCを駆動する事
> が可能となっております。
>> >> >
>> 仮に、非アクティブ状態でループを回さないようにした場合
> 、一つのECに複数のRTC
>> >> > が関連付けられてる状況において、一つの RTC
>> が非アクティブ状態の時に、他のアク
>> >> >
>> ティブ状態のRTCまでも駆動関数(on_execute)が実行されな
> いといった事になってしまい
>> >> > ます。
>> >> >
>> >> >
>> 上記のような理由もあり、ExecutionContextのループは、RTC
> の状態に関わらずループ
>> >> > する仕様となっております。
>> >>
>> >> なるほど、理解しました。
>> >>
>> 金広さん、清水さんの議論を読んで、何となく私の理解がず
> れている予感がしていたのですが、
>> >> これでクリアになりました。
>> >>
>> >> ・ExecutionContextは直列リストの構造をしている。
>> >>
>> ・ただし、あくまで分散コンポーネントモデルなので中央で
> コンテキストを管理している
>> >>
>> サービスがあるわけではなく、各コンポーネント同士がバケ
> ツリレーのような形で
>> >> 実行タイミングを通知しあっている。
>> >>
>> >> というわけですね。
>> >>
>> 改良しようとしてもなかなか難しいところですね、、、。
>> >>
>> >> --
>> >> Yosuke Matsusaka, Ph.D
>> <yosuke.matsusaka @ aist.go.jp>
>> >>   Interaction Modeling Group /
>> >>   National Institute of Advanced Industrial
>> Science and Technology (AIST)
>> >>   Tel: 029-862-6726  Web:
>> http://staff.aist.go.jp/yosuke.matsusaka/
>> >>
>> >
>> >
>> > --
>> > ----------
>> > 栗原 眞二 <shinji.kurihara @ aist.go.jp>
>> >
>> > 独立行政法人産業技術総合研究所
>> >  知能システム研究部門 統合知能研究グループ
>> >  〒305-8568
>> >  茨城県つくば市梅園1-1-1 中央第2
>> >
>> >  TEL: 029-861-5956
>> >
>> >
>>
>>
>>
>> --
>> 安藤慶昭@独立行政法人産業技術総合研究所
>> 知能システム研究部門
>>     統合知能研究グループ 主任研究員, 博士(工学)
>>     〒305-8568 つくば市梅園1-1-1 中央第2
>>     e-mail: n-ando @ aist.go.jp, web:
>> http://staff.aist.go.jp/n-ando
>>     OpenRTM-aist: http://www.openrtm.org
>>
>>
>
>



-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒305-8568 つくば市梅園1-1-1 中央第2
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org

Noriaki Ando, Ph.D.
    Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
    AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org



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