割り込み禁止と排他制御の基本。セマフォ、ミューテックス、スピンロック解説

ソフトウェア開発

こんにちは!現役組み込みソフトウェアエンジニアのです。

今回は、新人エンジニアが現場で必ずぶつかる「割り込み」や「排他制御」の基本について解説します。特に、これから本格的にマルチタスクやマルチコアCPUの開発に関わる方には、必ず理解しておきたい内容です。文章はできるだけわかりやすく、例え話も交えて説明していきますので、ぜひ最後までお付き合いください!



組み込みソフトウェア開発の基本、割り込みとは?

組み込みソフトウェアにおいて「割り込み(Interrupt)」は、処理の流れを途中で中断し、緊急の処理を優先的に行うための仕組みです。

例えるなら、あなたがテレビを見ているときに、電話がかかってきて、一旦テレビを止めて電話に出るようなイメージです。

組み込み開発では、通信やセンサーからのデータ受信、ボタンの押下、タイマーイベントなど、即時に対応すべき事象に対して割り込み処理が使われます。CPUは通常の処理を行っていますが、割り込み信号を受け取ると、現在の処理を一時停止し、割り込みハンドラと呼ばれる特別な関数を実行します。

セマフォ(Semaphore)

カウンターを利用することで共有リソースへのアクセスを制限する排他制御する比較的簡単な方法です。特定の条件を満たすまで他のスレッドやプロセスにリソースを与えないようにします。セマフォは、バイナリーセマフォとカウンティングセマフォの2種類があります。バイナリーセマフォは、0または1の値を持ち、リソースの状態を表します。カウンティングセマフォは、整数のカウンターを持ち、リソースの使用可能な数を表します。共有リソースに対応する1つの変数を用意して置き、共有リソースにアクセスするプロセスがその変数をインクリメント(加算)することで自分が占有していることを明示することで他のプロセスが対象の共有リソースにアクセスすることを未然に防止する仕組みです。
セマフォの場合は、

ミューテックス(Mutex)

Mutual Exclusion(相互排除)の略で、Mut-ex。単一のスレッドまたはプロセスしかリソースにアクセスできないようにする排他制御方式です。つまり、リソースにアクセスするスレッドまたはプロセスが、そのリソースのミューテックスをロックすることが必要です。セマフォと同じ仕組みをマイコンによって実現しているものであったり、セマフォの上限値を1としているものであったりがミューテックスと言われています。

割り込み禁止

割り込み禁止とは、その名の通り「割り込み」を禁止することです。
この説明のためにはまず割り込みについて知る必要があります。

スピンロック

スピンロックは、複数のプロセスやスレッドが同時に共有リソースにアクセスする際に、そのリソースにアクセスできるようになるまで待つ排他制御方式です。スピンロックでは、共有リソースにアクセスしようとするプロセスやスレッドが、対象の共有リソースのロック解除まで何度も繰り返しアクセス処理を行います。スピンロックは、ロックを取得するのにかかるコストが比較的低く、処理速度が速いという利点があります。しかし、同時に複数のプロセスやスレッドが1つの共有リソースを取り合ってスピンロックをしてしまうと、CPUリソースを無駄に消費してしまうため、適切なリソースを共有するプロセス・スレッドの数を限定したり、スピン待ち回数の上限を設定するなどの追加の工夫が望ましいです。

を行う方法共有リソース往々にしてスピンロックは割り込み禁止と併用されます。

排他制御の注意点

データ整合性の担保

排他制御の最大の目的は、複数のプロセスから同時に共有リソースにアクセスが発生することで、書き込み側と読み取り側で、設計的に意図しない不整合の発生を防ぐことです。

パフォーマンス

一方で、ないがしろにできないのがパフォーマンス、つまり処理速度です。排他制御とは詰まるところ、他の処理を待たせることでもあります。そのため、排他制御の時間が長くなるほど、全体のパフォーマンスが低下します。より良いパフォーマンスを得るためには、待たせる時間を最小化する必要があります。データの整合性を大事にするあまり、排他処理を多用するとシステム全体のパフォーマンスを低下させる危険性があるため、多様は厳禁です。
一般的に、組み込みソフトウェア開発界隈では、排他制御1回当たりの時間が長くなるよりも、排他制御が実行される回数が多い方がパフォーマンスへの影響は小さいと言われています。そのため、データの整合性を保つために本当に必要最低限の区間で排他制御かけるように設計することが重要と言えます。

デッドロック

最も懸念すべきはデッドロックです。つまり、排他制御の結果としてアクセス待ちの状態から、プロセス全体が動けなくなることです。

コメント

タイトルとURLをコピーしました