応用情報技術者カーネルとスレッドの並行制御オリジナル・公式資料照合難易度★★★★☆

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の保護区間は有限でほかの待ちはない。優先度継承の働きはどれか。

アプリで毎日学習しよう

ゲーミフィケーションで 応用情報技術者 合格を目指す。無料・課金なし。

更新: 2026/10/28