応用情報技術者カーネルとスレッドの並行制御オリジナル・公式資料照合難易度★★★★☆
PREEMPT_RTを使わないLinuxカーネルのプロセスコンテキストで、spinlock_tを保持したまま、睡眠して待つ可能性のある処理を呼んでいる。この共有状態を使うのはプロセスコンテキストだけで、hard IRQ等からの利用はない。設計の見直しとして適切なのはどれか。
A
spinlock保持中にschedule()を呼べば、常に安全に睡眠できる
non-PREEMPT_RTのspinlock保持中に睡眠して待つ処理を入れるのは適切ではありません。scheduleを直接呼んでも解決しません。
B
睡眠時間が1ms未満なら、spinlock保持中でも常に許されるとする
non-PREEMPT_RTのspinlock保持中に睡眠できるかは、予想時間の短さで決まりません。待つ可能性のある処理を設計から見直します。
C
PREEMPT_RTの有無にかかわらず、すべてのspinlock_tは同じ動作だと仮定する
PREEMPT_RTではspinlock_tの実装・意味が変わります。対象カーネルやコンテキストの区別が必要です。
D
spinlock保持中の睡眠をやめ、必要な共有状態の保護を確認してmutex等の睡眠可能なロックを使う設計を検討する★ 正解
本問はすべて睡眠可能なプロセスコンテキストなので、保護対象とロック順序を見直したうえでmutex等を選べます。
解説
ロックの種類は待ち方と使用コンテキストで選びます。本問はnon-PREEMPT_RTのspinlock_tに限定しています。PREEMPT_RTのspinlock_tや、常に実スピンするraw_spinlock_tと同一視しません。
根拠資料・確認情報
対応範囲: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);
問題 4
PREEMPT_RTを使わないLinuxのSMPカーネルで、同じspinlock_tをプロセスコンテキストとhard IRQハンドラーが使用する。プロセスがローカルIRQを有効にしたままspin_lockで取得すると、そのCPUで割込みが起き、ハンドラーも同じロックを待つ場合がある。適切な対策はどれか。クリティカルセクション内で睡眠はしない。
問題 5
単一CPUのプリエンプティブな固定優先度スケジューリングで、低優先度Lがmutexを保持し、高優先度Hがそのmutexを待っている。中優先度MがCPUを使い続け、Lが解放まで進めない。mutexが優先度継承をサポートし、Lの保護区間は有限でほかの待ちはない。優先度継承の働きはどれか。