としです。
> コバヤシ@Linux暦1年 と申します。
こんにちわ。
> "プロセスA,B,C"という3つのプログラムがありまして、
> 各々のプロセスはとある状態になると、
> 共通の処理である"プロセスD"へ処理要求を出し、
> 要求を受けたプロセスDが処理を始める、ということをしています。
>
> 現状ではプロセスA,B,CとDの間ではメッセージの送受信にて
> やりとりしていますが、これでは処理の同期は一応とれますが、
> メッセージの送受信において、常にメッセージの監視を行っているので、
> CPUに負荷がかかっています(微々たるものかもしれませんが)。
「常にメッセージの監視を行なっているので」と言う部分ですが、監視を行
なっているのは、"プロセスD" の事ですよね?。
であれば、例えばプロセス間通信にメッセージキューや、ソケットを使って
いるなら、msgrcv() か read() か recv() を呼んでいる(と思しき)
"プロセスD" は、受信データが無ければ、データが来るまで待ち状態になり
ますから、CPU 負荷はかからないはず...と思います。
ただ、もしかすると、"プロセスD" では、メッセージの受信だけでなく、何
か、他の処理も並行して行なう必要があるのでしょうか?
もし、そうであるとすると、データが来るまで待ち状態が続くと困りますの
で、受信タイムアウト的な実装を行なう手法があるかと思います。
受信タイムアウトの実装は、いくつか方法がありますが、
(1) msgrcv() / read() / recv() の直前に、alarm(TIME-OUT) を呼び出し、
指定した秒数後にアラームシグナルを発生させ、msgrcv() / read() /
recv() で errnoが EINTR を返すかチェックする。
→SIGALRM(アラームシグナル)に対するシグナルハンドラを作る必要
あり。
(2) メッセージの送受信にソケットを使っているなら、select() あるいは
poll() システムコールを使って、タイムアウトまで待つ。
んでも、"プロセスD" 側は、単純にデータが来るのを待つ(だけが仕事)なら
ば、受信タイムアウト処理も特に必要ではないと思いますし、IPC_NOWAIT
とか、O_NONBLOCK とかを指定していなければ、データが来るまで
"プロセスD" はカーネルにより待たされます(CPU 資源は消費しません)。
#各関数やキーワードは、man か google で探すと出てくると思います。
外していたらすみませんです。
ではこれにて。
Follow-Ups:
- [linux-users:99657] Re: プロセス間通信(シグナル)SEKINE Tatsuo
- [linux-users:99662] Re: [linux-users:99655] Re: プロセス間通信(シグナル)Isamu Kobayashi
- [linux-users:99653] プロセス間通信(シグナル)Isamu Kobayashi
- Prev by Subject: [linux-users:99654] Re: Not gnuplot
- Next by Subject: [linux-users:99656] Re: [linux-users:99653] プロセス間通信(シグナル)
- Previous by thread: [linux-users:99653] プロセス間通信(シグナル)
- Next by thread: [linux-users:99657] Re: プロセス間通信(シグナル)
- Indexes:[Main][Thread]