質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

1462閲覧

組み込みLinuxにおけるマルチタスク(マルチプロセス)プログラミングの方法について

ibojiro

総合スコア17

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2018/10/22 06:37

編集2018/10/23 07:31

たとえば、大分はしおっていますが以下のようにforkのみを使ったプログラムの場合(こういうやり方がいいのかどうかはわかりませんが。。。)

1。表示処理dsp_main()、
2。シリアル受信処理rxserial_tsk()
3。メイン内のGPIO監視処理gpio_chk()
の3つの処理がマルチプロセス(並列)に動いていると考えてもよろしいでしょうか?
こういうやり方が不適切な場合は、どのようにすべきかご教示いただけると助かります。
※インデントがうまくいかないのはご容赦ください。

main()
{
/・・略・・/

  //子プロセス1作成
switch(pid=fork())
{
case 0:
dspmain(); // 表示処理
break;
case -1:
perror("fork");
break;
}

//子プロセス2作成
switch(pid=fork())
{
case 0:
rxserial_tsk((void *)&fd);// シリアル受信処理
break;

   case -1:     perror("fork");      break; } whlie(1) {

      gpio_chk(); // 親の処理・・・GPIO 監視
}
}

以上よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

作るものの規模と、要件と、どのようなデータ連携を行うかによるケースバイケースですが、
画面と受信と何かと…という感じからして、
「画面制御プロセスはそのまま稼働している横で、受信プロセスだけ再起動」
とかいう要件が出てきそうなので、
私なら、各々のプロセスを個別に立ち上げても良いような作りにし、共有メモリで連携すると思います。
(わざわざメインプロセスからfork()&exec()せず、起動シェルを作って個別に起動する)
共有メモリを使うまでもない程度の連携なら、ファイル等でも良いです。

但し、再起動は「丸ごと」の方が都合が良くて全てを1人で組む程度の小規模ならば、マルチスレッドにします。

処理をいくつものプロセスに分割して、並列に動作させたい場合

計算処理や、ちょっとした下請けの処理や、並列処理が終わったのを待って別のことをしたい場合は
スレッドの方が良いです。
他にも、同じ処理で並列数を大量に立てる時も、スレッドの方が良いです。

一方、バックグラウンドでずっと稼働し続ける系の処理や、
何かあっても中断したくない処理(受信処理とか)は別プロセスを立ててやらせた方が
良い場合が多いと思います。

投稿2018/10/23 08:57

taka-saan

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ibojiro

2018/10/23 22:59

回答ありがとうございます。参考にさせていただきます。
guest

0

一般的にいうマルチタスク

元のプロセスとデータ連携の必要があるでしょうか?
もし、ある場合は、パイプ等でデータのやり取りが必要となりますが、考慮されていますか?

また、組込みLinuxとの事ですが、一般のLinixとほぼ同じ場合、あるいは改造されて種々の制限がある場合がありますが、その辺は確認されていますか? 一般のLinuxとほぼ同じ場合は、一般のLinixの制限、そのままですが、用途によっては異なる場合もあります。まず、確認を。

質問の感じからすると、 Chironianさんの書かれたように、スレッドの方がよさそうですが、どうでしょうか。 (と言うものの、スレッドの詳細は忘れた)

投稿2018/10/22 12:04

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ibojiro

2018/10/23 01:24

回答ありがとうございます。調べてみるとプロセスに分割した場合、プロセスごとに独立したメモリ空間を持つと書いてあったので不具合を生じにくくてよいかなと思いました。 処理をいくつものプロセスに分割して、並列に動作させたい場合、Linuxのセオリーはどんなやり方なのかということが、しらべてもピンとこなかったのでこちらに質問させていただきました。
guest

0

こんにちは。

子プロセスでは、シリアル通信があったり、画面制御があったり、別々の処理を個個に行いたいのですが、そういった場合でもforkを使って子プロセスを作っていくやり方で問題ないでしょうか?

可能か不可能かという意味では可能です。fork()→exec()の流れです。
適切か不適切かという意味ではケースバイケースですが、それら複数のタスクが密接に連携して動作し、メモリ空間を共有した方が好ましい場合は、不適切です。そのような時はスレッドを使った方が効率は上がります。

投稿2018/10/22 08:03

編集2018/10/22 13:19
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ibojiro

2018/10/23 01:29

回答ありがとうございます。 exec()について調べてみると、子プロセスで現在の処理を停止し新しいプログラムに置き換えて起動させるといったようなことが書かれていますが、たとえば、いくつもの子プロセスを作成し、そのなかで違う処理を行う関数を並列に動作させたい場合でもfork-execの方式を使って行うのでしょうか?。 処理をいくつものプロセスに分割して、並列に動作させたい場合、Linuxのセオリーはどんなやり方なのかということが、しらべてもピンとこなかったのでこちらに質問させていただきました。
Chironian

2018/10/23 08:10

> いくつもの子プロセスを作成し、そのなかで違う処理を行う関数を並列に動作させたい場合でもfork-execの方式を使って行うのでしょうか?。 その通りです。同じページの上の方に書かれていますが、shellでパイプを使う場合、各プロセスはfork-execで起動されるそうですよ。つまり、普通に使います。 なお、回答でも書いたように、マルチタスクする方法は主にマルチプロセスとマルチスレッドの2種類があります。どちらを使うのが好ましいかはケースバイケースです。
guest

0

xargsで使用プロセスの上限数を指定しながらやったほうがいいと思います

投稿2018/10/22 07:57

yambejp

総合スコア114771

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ibojiro

2018/10/23 01:30

回答ありがとうございます。xargsというキーワードを初めて知りました。このキーワードを頼りに調べてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問