- PR -

C言語で2つのプログラムを交互に動かす

投稿者投稿内容
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2005-01-03 21:54
みなさん様々な方法を教えていただきありがとうございます。
返信が遅くなって申し訳ございません。

各々の方法をためさせていただきます。
分からないことがあったら又質問させていただくことが
あるかもしれませんがその際は、よろしくお願いいたします。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-01-04 13:56
例によって説明不足だったので整理しておきます。

まず、毎回 fork() して exec するというのは重い処理になるのであまり
おすすめできません。Linux の fork(2) は copy-on-write で軽いとはいえ
やはりコストは存在するし、新しく exec したプロセスが準備を終えて
ユーザが書いたCのコードを実行しはじめるまでには結構な時間がかかります。

スレッドにするというのは「アリ」だと思います。ただし、Linux の
pthread は1:1モデルで実装されているので、この場合のメリットは
「pthread ライブラリが提供する機能を利用できる」という点になります。
スケジューリングに関してベストを得ようとすると「ユーザランドスレッド
として実装する」ということになるかと思います。そこまでする必要が
あるのか、という話にもなりますが。

あと、スリープについて。
前回、「スリープ」とか「sleep」とか書いていたのは必ずしも sleep(3) を
意図していたわけではありません。
説明をはしょりすぎでした、すみません。
「test2 からのシグナルを待つように仕込んでおいてからスリープする」
というところは pause(2) で寝ます。

それから、「親プロセスは1秒ずつsleepするループに入る」と書いた
ところはどうやって寝るか、ということですが...
マニュアルから察するに、sleep(3) も usleep(3) も、alarm(2) もしくは
それと同等の機能を用いて実装されているようですので、予定した
時刻と実際に起床する時刻とのずれの大きさについてはどちらも同じで
あろうかと思います。ソースコードを確認したわけではありませんが。
時刻にずれが生じる要素は
1. 予定した時刻に達してからシグナルが生起されてプロセスが「実行可能」
  となって再スケジューリングが行われるまでの時間
2. 実行可能となってから実際に走行するまでの時間
3. プロセス切り替えの所要時間
あたりでしょう。sleep(3) でも usleep(3) でも、あるいは nanosleep(2)
でも(ふつうに使っていれば)、どれでも同じと思います。

自分で書くときには sleep(3) も usleep(3) もよく使っています。
マニュアルでは usleep(3) はやめとけ、ということになってますが
可搬性を意図するときには select(2) で寝るようにしたりもします。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2005-01-04 13:59 ]

スキルアップ/キャリアアップ(JOB@IT)