同じリソースにアクセスする 2 つのプロセスを同期するにはどうすればよいですか?
-
11-09-2019 - |
質問
同じ物理メモリ(GPIOデータアドレス)にアクセスする2つのプロセスがあります。では、これらのアプリ間で同期するにはどうすればよいでしょうか?ミューテックスやセマフォなどのロック機構があるとのことですが、どの方法が一番速いのでしょうか?
お手伝いありがとうございます、
-nm
解決
ミューテックスとセマフォは一般に、同じアドレス空間内の同時実行ソリューションとみなされます。つまり、同じプログラムの異なる部分が、これらの機構の 1 つを使用してリソースへのアクセスをロックすることになります。
個別のプロセスを扱う場合、Linux でこれを行う標準的な方法は、 /var/lock
, 、 のように /var/lock/myapp.lock
, 、 そして PID の後に改行を入れます. 。その後、他のプロセスがその存在をチェックし、巧妙であれば PID をチェックして、それがまだ生きているかどうかも確認します。
この領域にリアルタイムでアクセスする必要がある場合は、ファイルシステムをスキップすると、プロセスは IPC 経由で通信する必要があります (LET_ME_KNOW_WHEN_DONE
, OKAY_IM_DONE
, 、アイデアはわかります)、または、より良いのは、GPIO メモリの読み取りと書き込みを唯一の目的とするプロセスを作成し、他のプログラムが GPIO メモリと通信することです。 それ IPC 経由 (おそらく最良のアプローチ)。
他のヒント
mutexは相互排除を意味する - セマフォは、リソースが使用中であるかどうかを決定するために使用されるだけで可変です。 Windowsでは、共有リソースを保護するために作成することができますミューテックスオブジェクトがあります。
問題は、あなたはどのような言語を使っているのですか?どのようなOS(Iは、Linuxを想定しています)。ほとんどの言語は、マルチスレッドと相互排他のためのサポートを提供し、あなたは組み込みの構文を使用する必要があります。
例えば、Linux上でCを使用して、あなたは
にしたいかもしれませんなどがsemaphore.h
とsem_waitなど、sem_initのコールを調べています。