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

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);

A
Aはsmp_store_release(&ready, 1)、Bはsmp_load_acquire(&ready)で確認する★ 正解

BのacquireがAのreleaseした1を観測すると、公開前のdataへの書込みとBの後続読取りの順序を確立できます。

B
AもBもreadyへ通常のREAD_ONCE/WRITE_ONCEだけを使えば、別変数dataとの順序も常に保証される

READ_ONCE/WRITE_ONCEだけで、異なる場所へのアクセスの必要なCPU間順序まで一般に保証されるわけではありません。

C
Aだけにbarrier()を入れ、Bはどの順序で読んでもよいとする

barrier()はコンパイラ向けの制約であり、AとBの公開・受領の対応するCPU間順序を代替しません。

D
dataを先に読んでからreadyを確認し、読んだdataを必ずそのまま使う

公開前に読み出した古いdataを使う可能性があります。readyの観測後の読取りを適切に順序付ける必要があります。

解説

単一writerが一度だけ公開するという条件で、releaseで書き、対応するacquireで読んでからデータへ進みます。これは相互排他ロックではなく、dataを後で何度も書き換える競合まで自動で解決するものではありません。

根拠資料・確認情報

対応範囲:2026年度 応用情報技術者試験

資料確認日:2026-10-28

同じレッスンの問題

問題 1
Linuxカーネルの共有atomic_tカウンターは0で始まる。2スレッドがそれぞれ1,000回、次の処理を行う。処理完了後にカウンターを読む。整数の範囲超過や他の更新はない。常に2,000にする修正はどれか。 v = atomic_read(&counter); atomic_set(&counter, v + 1); この2行の間には他スレッドの処理が入り得る。
問題 3
PREEMPT_RTを使わないLinuxカーネルのプロセスコンテキストで、spinlock_tを保持したまま、睡眠して待つ可能性のある処理を呼んでいる。この共有状態を使うのはプロセスコンテキストだけで、hard IRQ等からの利用はない。設計の見直しとして適切なのはどれか。
問題 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