現在、PC系OSのWindowsや、RTOSのiTronなどのOSに依存せずに
プロセス(タスク)間通信の実現について検討しています。
OSに依存しないプロセス(タスク)間通信のC/C++言語による実現方法
についてご教示願います。
または、プロセス間通信のノウハウについて記述したURLについてご教示
願います。
そもそもプロセスとかタスクとかいった概念が OS に密接に関連してるので、
OS なしでプロセスだタスクだ考えるのがヘンと思う。
> そもそもプロセスとかタスクとかいった概念が OS に密接に
> 関連してるので、OS なしでプロセスだタスクだ考えるのがヘンと思う。
同意。
ちまたに溢れる OS 非依存を謳う代物は、各OS毎に専用の「通訳」を
用意しているから、本人は一見依存しないように見えるだけ
(それでも「誤訳」などは発生している)ですから、同じようなものを
全部用意するか、どこかから入手するかが現実解?
完全な非依存など大抵は夢物語です。
「OSに非依存」を実現する唯一の方法は、OSなど使わずにモニタを
自作するくらいしかないと思います。
(但し、今度はハードウェアに依存します)
回答いただきありがとうございます。
やっぱり、#ifdef _WIN32のようにするしか方法がないようですね!
tetrapodさん、「OSなしでプロセスだタスクだ考えるのがヘン」で
あるならば、マルチプロセス(タスク)を実現の際に最低限知っておくべき
ことについてご教示願います。
特に、組み込み系OSであるiTronまたはLinuxについてご教示願います。
特に、組み込み系ではマルチプロセス(タスク)が前提となっており、
Windowsアプリのようにマルチプロセスを意識せずに開発ツールで簡単に
実現できないため。
VC++から少し話しがそれましたが、よろしくお願いします。
P.S.
管理人さんへ
このBBSのおかげで、開発に役立っています。
要望ですが、OS(特に組み込み系)についてのBBSを立てていただけませんか
最低限なら、コンテキストスイッチの基本概念と排他制御。
そしてiTRON なら、優先度(プライオリティ)に対する理解。
割り込み制御あたり。
> 特に、組み込み系ではマルチプロセス(タスク)が前提となっており、
iTRON にはプロセスに直接相当する概念がない(こともある)と思います。
# iTRON4.0/PXなどは一応メモリ保護機能がありますが...
iTRON のいうタスクは、Windows や Linux でいえば、むしろスレッドに
近いものです。
また、iTRON でも、(意味があるかは別として)タスクを一つしか
起こさなければシングルタスクで動作します。
Windows のプロセスはデフォルトでは単一のスレッドしか起動しないため、
それをあまり意識する必要がないだけです。
マルチスレッドで"問題なく"スレッド間通信するプログラムがかければ、
iTRON のタスク制御をりかいするのもそう難しくないでしょう。
(戸惑うとしたらプライオリティに関する部分くらいでしょうか)
排他制御の一部ではありますが、「アトミックな動作」とかも要理解かと。
1ビットのセット (ビットフィールド構造体を使って) flags.hogeflag=1;
なんてのはアトミックな動作にならない典型例で、
これをつかってスレッド間メッセージを送ろうとか排他制御しようとかすると
バグってしまいます。
割り込み禁止にするとか Interlocked を取るとかそういう手続きが必要。
掲示板ですが、管理人様の負担増加を考えると既にあるところを利用されたほうが。
http://www.wince.ne.jp/bbs/
http://www.ouk.co.jp/ogawa/index.html
http://www.atmarkit.co.jp/bbs/phpBB/
http://www.kumikomi.net/bbs/
> 排他制御の一部ではありますが、「アトミックな動作」とかも要理解かと。
確かに排他制御の前提ですね。
(まずこれがわからないと、どこのメモリアクセスを排他すればいいのかの判断がつかない)
> 割り込み禁止にするとか Interlocked を取るとかそういう手続きが必要。
割り込み禁止や切り替え禁止は iTRON だと dis_int / dis_dsp あたりですが、
極力こいつらは使わないのが RTOS のお約束です。(使うと応答性能が落ちるため)
優先度を適切に切り替えながらうまく回すのがコツですが、Windows などのような
単一優先度でのマルチスレッドになれていると、最初はちょっと戸惑うかもしれません。
マルチスレッドでの開発経験自体がないなら一度 Windows や Linux あたりで
やってみることをお勧めしますし、マルチスレッド自体の知識と経験はあるのであれば、
iTRON のマルチタスクとしての肝は「優先度」関係に尽きると思います。
(メモリ保護がないのも恐いかもしれませんが、これはまともに動けば問題ないはずですし...)
余談モード
H8/300H なんかには bset.b #nn, @er0 なんて命令があるので
flags.hogeflag=1; はアトミックに実行できる
ため例が悪かったかも。
mov.l #flags, er1
bset.b #4, @er1 ; bit set hogeflag atomically
SH2 にも TAS って命令があるので 8bit 型の bit7 に限りアトミックにセット可能。
# スレッド間、というかタスク間のセマフォに使ってます (bset/tas)
2bit 以上のビットフィールドにしときゃよかったかな。
そんなものをセマフォに使うことは無いっすけどね。
ツイート | ![]() |