応用情報技術者カーネルとスレッドの並行制御オリジナル・公式資料照合難易度★★★★★
PREEMPT_RTを使わないLinuxのSMPカーネルで、同じspinlock_tをプロセスコンテキストとhard IRQハンドラーが使用する。プロセスがローカルIRQを有効にしたままspin_lockで取得すると、そのCPUで割込みが起き、ハンドラーも同じロックを待つ場合がある。適切な対策はどれか。クリティカルセクション内で睡眠はしない。
A
プロセス側はIRQを有効のままにし、割込み側のスピン待ち回数だけを増やす
割込み処理が戻らないと中断されたプロセスはロックを解放できないため、待ち続けてもこの循環は解消しません。
B
プロセス側でspin_lock_irqsave/spin_unlock_irqrestoreを対応させ、同一CPUの割込み再入を防ぎつつ他CPUとの排他も保つ★ 正解
元のIRQ状態を保存してローカル割込みを抑え、スピンロックで他CPUとも排他します。解除時は元のIRQ状態へ戻します。
C
ローカルIRQを無効にするだけにして、全CPU間の共有ロックを削除する
IRQ無効化はそのCPUに対する制御で、別CPUの並行アクセスを止めません。SMPの共有状態には排他も必要です。
D
割込みハンドラー内でmutex_lockへ置き換え、睡眠してロック解放を待つ
hard IRQコンテキストで睡眠可能なmutexを取得して待つ設計にはできません。
解説
同一CPUで、ロック保持者を割り込んだ処理が同じロックを待つとデッドロックします。ローカルIRQ制御とCPU間排他の役割を分け、元のIRQ状態を復元する対応を使います。
根拠資料・確認情報
対応範囲:2026年度 応用情報技術者試験
資料確認日:2026-10-28
同じレッスンの問題
問題 1
Linuxカーネルの共有atomic_tカウンターは0で始まる。2スレッドがそれぞれ1,000回、次の処理を行う。処理完了後にカウンターを読む。整数の範囲超過や他の更新はない。常に2,000にする修正はどれか。
v = atomic_read(&counter);
atomic_set(&counter, v + 1);
この2行の間には他スレッドの処理が入り得る。
問題 2
LinuxのSMPカーネルで、CPU Aがデータを作ってCPU Bへ一度だけ公開する。dataとreadyは0で初期化済み、readyは整列した整数でAだけが0から1へ一度変更し、公開後dataは変更しない。Bはready=1を観測した後にdataを読む。弱いメモリ順序のCPUも対象に、data=42を公開する組合せはどれか。
A: WRITE_ONCE(data, 42); 【公開操作】
B: 【確認操作】でready=1を確認後、READ_ONCE(data);
問題 3
PREEMPT_RTを使わないLinuxカーネルのプロセスコンテキストで、spinlock_tを保持したまま、睡眠して待つ可能性のある処理を呼んでいる。この共有状態を使うのはプロセスコンテキストだけで、hard IRQ等からの利用はない。設計の見直しとして適切なのはどれか。
問題 5
単一CPUのプリエンプティブな固定優先度スケジューリングで、低優先度Lがmutexを保持し、高優先度Hがそのmutexを待っている。中優先度MがCPUを使い続け、Lが解放まで進めない。mutexが優先度継承をサポートし、Lの保護区間は有限でほかの待ちはない。優先度継承の働きはどれか。