応用情報技術者試験 合格教科書|2026年度(令和8年度)対応
第 6 章|科目 A 例年 2〜5 問(直近 10 年 19 回で 76 問、1 回平均 4.0 問)

ソフトウェア ― OS・ミドルウェア・ファイルシステム・開発ツール・OSS

タスクスケジューリング・仮想記憶・ページ置換えを動く図で理解し、OS の計算問題を落とさない

この章で学ぶこと

科目 A では直近 10 年(19 回)で 76 問、1 回平均 4.0 問(2〜5 問)出題されています。仮想記憶管理(20 問)と多重プログラミング・スケジューリング(23 問)の 2 テーマだけで 43 問を占めるので、この 2 つの計算を確実に取って 3 問確保が目標です。

OS の役割・構成と種類

OS(Operating System)は、ハードウェアを直接操作して CPU・主記憶・入出力装置をアプリケーションに公平かつ効率よく割り当てるソフトウェアです。ソフトウェアの体系では、OS・言語プロセッサ(コンパイラやインタプリタ)・サービスプログラム(ユーティリティ)をまとめてシステムソフトウェア(基本ソフトウェア)と呼び、その上に OS とアプリケーションの中間に位置するミドルウェア、さらに応用ソフトウェアが載ります。図 6-1 で階層の位置関係を押さえてください。

利用者 応用ソフトウェア(業務アプリ・ブラウザ) 言語プロセッサ ユーティリティ コマンド API 直接システムコール システムコール シェル ミドルウェア DBMS・TP モニタ・Web サーバ・MQ カーネルを呼出し システムコール(SVC) OS ― カーネル(特権モードで動く中核) タスク管理・記憶管理・入出力管理・ファイル管理・ネットワーク制御 命令・割込み ハードウェア(CPU・主記憶・入出力装置)
図 6-1 ソフトウェアの階層と、カーネルを呼び出す 3 つの経路。利用者のコマンドはシェルが解釈してカーネルへ渡し、応用ソフトウェアは API でミドルウェアを使う経路と、ミドルウェアを介さず自分でシステムコール(SVC 割込み)を出す経路の両方を使えます。言語プロセッサやユーティリティも同じくシステムコールでカーネルを利用します。カーネル・シェル・言語プロセッサ・ユーティリティを合わせてシステムソフトウェアと呼びます。

カーネルとシェル、特権モード

カーネルは OS の中核で、CPU のカーネルモード(スーパーバイザーモード・特権モード)で動作し、入出力命令や割込み制御などの特権命令を実行できます。アプリケーションはユーザーモード(非特権モード)で動くため、ハードウェアに触れる処理はシステムコール(SVC 割込み)でカーネルに依頼します。この分離があるからこそ、1 つのアプリの暴走が OS 全体を巻き込みにくくなります。カーネルの構成には、すべての機能を 1 つの大きなカーネルに詰め込むモノリシックカーネル(Linux が代表)と、最小限の機能だけをカーネルに残し、ファイルシステムやデバイスドライバをユーザーモードのサーバプロセスとして動かすマイクロカーネルがあります。マイクロカーネルは信頼性・移植性に優れる一方、プロセス間通信が増えて性能面では不利です。

シェルは利用者のコマンドを解釈してプログラムを起動するコマンドインタプリタです。UNIX 系の sh(Bourne shell、BShell)・csh(CShell)・bash、Windows の cmd.exe や PowerShell が代表例で、シェル自身はカーネルではなく、カーネルの機能を呼び出す利用者インタフェースにあたります。

電源投入時には、ROM やファームウェア(BIOS / UEFI)の小さなプログラムが補助記憶からブートローダを読み込み、ブートローダがカーネルを主記憶に展開して制御を渡します。この段階的な起動をブートストラップと呼びます。ネットワーク経由で起動イメージを取得するネットワークブート、1 台に複数の OS を入れて起動時に選ぶマルチブート、組込み機器でフラッシュメモリからカーネルを読み込むフラッシュブートローダも用語として押さえておきます。

OS の機能一覧

シラバスは OS の機能を次のように分けています。頻出は太字の 3 つで、本章でも厚く扱います。

機能内容本章の節
ジョブ管理ジョブ(利用者から見た仕事の単位)とジョブステップの投入・実行・終了を制御。ジョブスケジューラーとマスタスケジューラー本節
タスク(プロセス)管理CPU をタスクに割り当てる。状態遷移・ディスパッチ・スケジューリング・同期と排他制御タスク管理/スケジューリング/排他制御
記憶管理実記憶の区画割当てと、仮想記憶管理(ページング・置換え)実記憶管理/仮想記憶
入出力管理デバイスドライバ・割込み・DMA・スプーリング・バッファリング入出力管理とファイルシステム
データ管理装置に依存しないインタフェースでファイル(レコード)へのアクセスを提供。スペース管理・カタログ管理・ファイル保護入出力管理とファイルシステム
運用管理・ユーザー管理システムの始動・終了、ユーザーアカウントと権限、ディスククオータ、モニタリング本節の用語表
障害管理障害の検出・診断・記録・再構成・リスタート本節の用語表
ネットワーク制御・セキュリティ制御プロトコル制御(TCP/IP)と、アクセス制御・監査などの OS 内セキュリティ機能本節の用語表(詳細は第 10・11 章)

ジョブ管理

ジョブは利用者がコンピュータに依頼する仕事の単位で、コンパイル→リンク→実行のように複数のジョブステップから成ります。汎用機のジョブスケジューラーは、ジョブを読み込むリーダ、実行を開始するイニシエータ、終了処理を行うターミネータ、出力をプリンタなどに書き出すライタで構成され、マスタスケジューラーがオペレーターとの交信(メッセージ表示・指示受付)を担当します。夜間に大量のデータをまとめて処理するバッチ処理、対話処理の裏で走るバックグラウンドジョブ、UNIX で時刻指定の自動実行を行う cron は、いずれも省力化・自動運転を進めるシステム管理のためのジョブ管理機能です。ジョブを同時にいくつ走らせるか(ジョブ多重度)と一時ファイル容量の計算は、スケジューリングの節で扱います。

OS の種類

種類特徴例・関連用語
汎用機用 OSバッチ処理と大規模トランザクションに強い。ジョブ管理・スプーリングの概念が生まれた領域メインフレーム OS
PC 用 OSGUI・マルチメディア・幅広い周辺機器への対応Windows、macOS
UNIX・オープン OSマルチユーザー・マルチタスクを前提とした設計。POSIX 準拠で互換性を確保UNIX、Linux、FreeBSD。OSE(Open Systems Environment)
モバイル端末用 OSタッチ操作・省電力・アプリ配信の仕組みを備えるAndroid、iOS
リアルタイム OS処理の応答時間に上限(デッドライン)を保証する。プリエンプティブな優先度スケジューリングと高速な割込み応答μITRON、FreeRTOS
組込み OS家電・車載機器など資源の少ない機器向け。小さなフットプリント、フラッシュブートローダ組込み Linux、μITRON
セキュア OS強制アクセス制御と最小特権で、管理者権限を奪われても被害を局所化するSELinux を有効化した Linux
クラウドコンピューティング用 OS多数の VM(Virtual Machine:仮想マシン)やコンテナを管理する仮想化基盤を含むハイパーバイザ、OpenStack
ネットワーク OSLAN / WAN の通信プロトコル制御(TCP/IP、OSI 基本参照モデル)を提供する機能群ファイル共有・プリンタ共有

運用管理・ユーザー管理・セキュリティ制御・障害管理の用語

以下は直近 10 年で本中分類として出題されていない小分類です。用語の所在だけ確認しておけば十分で、アクセス制御や認証の中身は第 10 章(セキュリティ)で扱います。

小分類用語
運用の管理プロファイル(利用者ごとの環境設定)、ユーザーアカウント、システム利用権、ファイルアクセス権、ディスククオータ(利用者ごとのディスク使用量上限)、セション
ユーザー管理スーパーユーザー(UNIX の root、Windows の Administrator)、ゲスト、管理者権限、ユーザーアカウント制御(UAC)、アカウントを一元管理するディレクトリサービス(LDAP、Active Directory)
セキュリティ制御外部セキュリティ(物理・人的)と内部セキュリティ(OS の制御)、多重レベルセキュリティ、BLP(Bell-LaPadula)モデル(上位機密の読出し禁止・下位への書込み禁止で機密性を守る)、ロギング機能・オーディット(監査)機能、アカウンタビリティ、信頼プロセス、隔離・完全性・認証・検証可能性
障害管理タイマー監視・CPU 監視装置による検出、ハードウェア障害/ソフトウェア障害の記録、再構成(動的装置再構成・自動 CPU 再構成)、多重化(入出力パスの多重化・補助記憶装置の二重化・ライブラリの二重化・ディスクの二重書き)、システムの多重化(デュアルシステム・デュプレックスシステム・ホットスタンバイシステム。第 5 章)、障害回復ルーチン
サービスプログラムユーティリティプログラム:整列(ソート)プログラム、併合(マージ)プログラム、フォーマッティング、アーカイバ、データ編集、ファイルコピー、バックアップ

タスク管理 ― プロセス・スレッド・状態遷移・割込み

タスク(プロセス)は、OS が CPU を割り当てる仕事の単位です。利用者から見た仕事の単位がジョブ、ジョブを構成する各段階がジョブステップで、そのジョブステップを OS の側から見たものがタスクにあたります。CPU が 1 個でも、あるタスクが入出力を待っている間に別のタスクへ CPU を渡せば装置の遊びが減ります。この考え方が多重(マルチ)プログラミングで、タスク管理はその実現部分です。

スレッド(軽量プロセス)は、プロセスが持つメモリ空間やファイル記述子を共有したまま、実行の流れだけを分けたものです。生成と切替えのコストがプロセスより小さい一方、同じ変数を複数スレッドが同時に触るため、どのスレッドから同時に呼ばれても正しく動くスレッドセーフな作りが必要になります。

タスクの 3 状態と遷移の契機

タスクは実行可能状態(CPU さえ空けばすぐ動ける)・実行状態(CPU を割り当てられて動いている)・待ち状態(入出力の完了などの事象を待っていて、CPU を渡されても動けない)の 3 状態を行き来します。CPU が 1 個なら実行状態のタスクは常に 1 つだけで、CPU を複数積むマルチ CPU構成なら CPU の数だけ実行状態のタスクが並びます。図 6-2 の矢印が、どの契機でどちらへ動くかの全体像です。

休止状態 生成 実行可能状態 ディスパッチ プリエンプション 実行状態 入出力要求 待ち状態 入出力完了 終了 消滅 CPU を割り当てられるのは実行状態のタスクだけ
図 6-2 タスクの状態遷移。待ち状態から実行状態へ直接戻る矢印が無いことに注目してください。入出力が終わったタスクはいったん実行可能状態に並び直し、ディスパッチャに選ばれて初めて実行状態になります。
遷移契機覚えどころ
休止 → 実行可能タスクの生成(ジョブステップの開始)生成直後は CPU をまだ持たない
実行可能 → 実行ディスパッチ(ディスパッチャが CPU を割り当てる)「誰を次に走らせるか」を決めるのがスケジューラ、実際に CPU を渡すのがディスパッチャ
実行 → 実行可能プリエンプション(タイムクウォンタムの満了、より優先度の高いタスクの出現)まだ動ける状態なので「待ち」ではない
実行 → 待ち入出力要求などの SVC(スーパーバイザーコール)割込み自分から CPU を手放す
待ち → 実行可能入出力終了割込み(待っていた事象の完了)実行状態へは直接戻らない
実行 → 消滅タスクの終了資源を解放して消える
出題実績 「プリエンプションで実行中のタスクが遷移する状態」は直近 10 年で 3 回出題され(平成 29 年秋 問 16、令和 3 年春 問 17、令和 7 年春 問 14)、正解はいずれも実行可能状態でした。誤答肢は「待ち状態」「休止状態」です。

ディスパッチャと割込み

実行可能状態のタスクから次に走らせるものを選ぶのがスケジューラ、選ばれたタスクに実際に CPU を引き渡す(レジスタの内容を入れ替える)のがディスパッチャです。この切替えをコンテキストスイッチと呼び、切替えが多いほどオーバヘッドが増えます。

状態遷移の引き金はほとんどが割込みです。割込みは発生源で 2 つに分かれます。

分類種類例
内部割込み(実行中のプログラムが原因)プログラム割込み、SVC 割込みゼロ除算、桁あふれ、ページフォールト、入出力を OS に依頼するシステムコール
外部割込み(プログラム以外が原因)入出力割込み、機械チェック割込み、タイマ割込み、コンソール割込み入出力の完了、電源異常・メモリの検査エラー、タイムクウォンタムの満了、オペレーターの介入

プログラムの性質

複数のタスクが同じプログラムを同時に使えるかどうかは、プログラムの書き方で決まります。試験ではこの 4 つの区別が問われます。

ソースプログラム(原始プログラム)を翻訳したものが目的プログラム、それを結合したものがロードモジュールという形態の区別も、同じ小分類から出ます(詳しくはミドルウェア・開発ツールの節)。

スケジューリング方式とガントチャート計算

スケジューリングは、実行可能状態に並んだタスクのどれに CPU を渡すかを決める規則です。中分類 5 の中でも「多重プログラミングとスケジューリング」は直近 10 年で 23 問と最多で、そのうち 11 問がガントチャート(時間軸)を書けば解ける計算問題です。方式ごとの並べ方を覚えるより、同じジョブ表を 3 通りに解き比べるのが最短経路です。

方式横取り並べ方と性質
FCFS(First Come First Served、到着順)ノンプリエンプティブ到着した順に実行。単純だが、先頭に長いジョブが来ると後続が長く待つ
SJF / SPT(処理時間順・最短時間順)ノンプリエンプティブ処理時間の短い順。同時に待ち行列にあるジョブについて平均ターンアラウンドタイムを最小にできる反面、長いタスクが CPU を待ち続ける(リソーススタベーション=飢餓)
ラウンドロビンプリエンプティブタイムクウォンタム(タイムスライス)ごとに順番に巡回。応答時間が平準化されるので TSS(時分割)向き
優先度順(静的優先度方式/動的優先度方式)両方あり優先度の高い順。静的は固定、動的は待ち時間に応じて優先度を上げる(エージング)ことで飢餓を防ぐ
多重待ち行列(フィードバック待ち行列)方式プリエンプティブタイムクウォンタムを使い切ったタスクを下位の待ち行列へ移す。入出力主体の対話型タスクが自然に優遇される
イベントドリブン方式―事象(割込み)の発生を契機に対応するタスクを起動する。リアルタイム OS で使われる

図 6-3 は、到着時刻と処理時間を設定した同じ 3 つのジョブを、FCFS・SPT・ラウンドロビンで解いたガントチャートです。同じ入力でも完了順と平均が変わることを目で確認してください。

到着 A:0 B:1 C:2 / 処理 A:6 B:3 C:2 FCFS 到着順 A B C 平均 7.7 SPT 処理時間順 A C B 平均 7.3 RR 量子 2 A B C A B A 平均 7.7 0 2 4 6 8 10 秒 SPT は平均 TAT が最小、RR は短い C の応答が最速
図 6-3 同じジョブ表を 3 方式で解いたガントチャート。C の完了時刻は FCFS が 11 秒、SPT が 8 秒、ラウンドロビンが 6 秒です。ラウンドロビンでは到着したタスクが待ち行列の最後尾に入り、タイムクウォンタムを使い切ったタスクはさらにその後ろに回ります。
ジョブ到着/処理FCFS の TATSPT の TATRR の TAT
A0 / 66 − 0 = 66 − 0 = 611 − 0 = 11
B1 / 39 − 1 = 811 − 1 = 109 − 1 = 8
C2 / 211 − 2 = 98 − 2 = 66 − 2 = 4
平均―23 ÷ 3 ≒ 7.722 ÷ 3 ≒ 7.323 ÷ 3 ≒ 7.7

計算の型: ターンアラウンドタイム(TAT)

TAT = 完了時刻 − 到着時刻 / 待ち時間 = TAT − 処理時間

  1. 方式に従って処理順を決める(到着順は到着時刻順、処理時間順はその時点で到着済みのジョブのうち処理時間が最短のもの、ラウンドロビンは量子ごとの巡回)
  2. 時間軸に沿ってガントチャートを書き、各ジョブの完了時刻を読む
  3. 完了時刻から到着時刻を引く(引き忘れが最頻出の誤答)
  4. 平均を問われたら全ジョブの TAT を足して件数で割る

図 6-3 の例を処理時間順で解くと、A が 0〜6 秒、次は到着済みの B(3 秒)と C(2 秒)のうち短い C が 6〜8 秒、最後に B が 8〜11 秒。B の TAT は 11 − 1 = 10 秒です。

出題実績 処理時間順(SPT)の TAT は平成 31 年春 問 16 と令和 7 年秋 問 15 で、到着順の TAT は平成 29 年秋 問 15 と令和 3 年春 問 16 で、いずれも同じ論点が再出題されました。ラウンドロビンは直近 10 年で 3 回で、内訳は計算が 2 回(平成 28 年秋 問 19、平成 30 年秋 問 16)、適した用途を問う知識が 1 回(平成 29 年秋 問 18)です。

多重度と処理時間の計算

もう 1 つの計算の型が多重度です。同時に走らせるタスク(ジョブ)の数を増やすと、あるタスクが入出力をしている間に別のタスクが CPU を使えるため、全体の所要時間が短くなります。CPU は 1 個しかない点、入出力と CPU 処理は重ねられる点の 2 つを押さえて時間軸を描きます。

計算の型: 多重度を上げたときの短縮時間

1 件が「CPU 2 秒 → 入出力 4 秒」で構成される処理を 4 件実行します。CPU は 1 個、入出力装置は十分にあり、待ちは CPU の取り合いだけで起こるものとします。多重度 1(1 件ずつ順番に)と多重度 2(常に 2 件までシステム内に置く)で、全件終了までの時間はどれだけ違うでしょうか。

  1. 多重度 1: 1 件が 2 + 4 = 6 秒。順番に 4 件なので 6 × 4 = 24 秒
  2. 多重度 2 は時間軸で追う。0〜2 秒に 1 件目が CPU、2〜4 秒に 2 件目が CPU(1 件目は入出力中)
  3. 1 件目は 6 秒で終了し 3 件目が入る(6〜8 秒に CPU)。2 件目は 8 秒で終了し 4 件目が入る(8〜10 秒に CPU)
  4. 3 件目は 12 秒、4 件目は 14 秒に終了。全件終了は 14 秒
  5. 差は 24 − 14 = 10 秒。CPU が遊んでいた時間を別の件で埋めた分だけ縮む

この手順を時間帯の表に落とすと、CPU と入出力の重なり方が一目で分かります(数値は秒)。多重度 1 では 1 件目が入出力をしている 2〜6 秒に CPU が完全に遊んでいるのに対し、多重度 2 ではその空きに 2 件目の CPU 処理(2〜4 秒)が入っています。先行する件の入出力時間に後続の件の CPU 処理を差し込めた分だけ全体が縮む、というのがこの型の骨格です。試験では条件(CPU 時間・入出力時間・件数・多重度)を変えて同じ構造が繰り返し出ます。

件多重度 1 の CPU多重度 1 の入出力多重度 1 の終了多重度 2 の CPU多重度 2 の入出力多重度 2 の終了
1 件目0〜22〜660〜22〜66
2 件目6〜88〜12122〜44〜88
3 件目12〜1414〜18186〜88〜1212
4 件目18〜2020〜24248〜1010〜1414

ジョブ管理側の頻出計算がジョブ多重度と一時ファイル容量です。実行中だけ一時ファイルを使うジョブが複数あるとき、必要な容量は同時に存在し得る一時ファイルの合計の最大値で決まります。例えば一時ファイルが 100M バイト・150M バイト・200M バイトの 3 ジョブを多重度 2 で実行するなら、どの 2 つが重なってもよいので最大の 2 つを足した 350M バイトを用意します。多重度を 3 に上げれば 450M バイト必要です。

出題実績 タスク多重度は令和 4 年春 問 19 と令和 6 年春 問 18 の 2 回で、いずれも多重度 1 と 2 で 4 件の処理が終わるまでの時間差を求める計算(正解は 7 秒)でした。ジョブ多重度と一時ファイル容量も令和元年秋 問 17 と令和 4 年春 問 16 の 2 回で、多重度 2 のときに必要な容量の最小値を問い、正解はどちらも 200M バイトです。合わせて 4 問すべてが計算問題で、時間帯の表を書けるかどうかがそのまま得点になります。
ここがひっかけ 多重度を上げれば必ず速くなるわけではありません。同時実行数を増やすほど主記憶が不足してページ置換えが増え、かえって処理能力が落ちます(スラッシング)。この関係は仮想記憶の節でもう一度出てきます。

排他制御とデッドロック

複数のタスクが 1 つの資源(共有メモリ、ファイル、1 本のシリアルバスにつながったセンサなど)を同時に使うと、読み書きが混ざって結果が壊れます。そこで「一度に 1 つのタスクしか入れない区間」を作るのが排他制御で、その区間をクリティカルセクションと呼びます。

手段仕組み使いどころ
セマフォ利用できる資源の個数を表すカウンタ。獲得時の P 操作で 1 減らし、0 未満になった場合はタスクを待ち行列へ。解放時の V 操作で 1 増やし、待っているタスクを 1 つ起こす共有資源の管理全般。カウンタの初期値を n にすれば「同時 n 個まで」も表せる
ミューテックス初期値 1 のセマフォ(二値セマフォ)。ロックをかけたタスクだけが解除できる1 個しかない資源の相互排除
イベントフラグ/メッセージ通信「処理が終わった」という事象や、データそのものをタスク間で受け渡す排他ではなく同期やデータ受渡し。排他制御を問う設問では誤答肢になる
割込み禁止クリティカルセクションの間だけ割込みを受け付けないごく短い区間に限る。長く使うと応答性が落ちる
出題実績 セマフォは直近 10 年で 3 回(平成 30 年春 問 18、令和 4 年春 問 17、令和 7 年秋 問 16)。うち 2 回は「1 本のバスにつないだ 2 個のセンサの読出しが重ならないようにする OS の機能」という組込み寄りの設定で、誤答肢は割込み・タイマ・メッセージキューでした。

デッドロックと獲得順序

デッドロックは、複数のタスクが互いに相手の持つ資源の解放を待ち、どちらも永久に進めなくなる状態です。発生には「相互排除」「保持と待ち」「横取り不可」「循環待ち」の 4 条件がすべて必要で、対策はこのどれかを崩すことに帰着します。試験で問われるのはほぼ循環待ちを崩す方法、すなわちすべてのタスクで資源の獲得順序をそろえることです(図 6-4)。

獲得順序をそろえる(安全) タスク1 ① 資源 X ② 資源 Y タスク2 ① 資源 X ② 資源 Y X を取れた側だけが先へ進む 順序が逆(デッドロック) タスク1 ① 資源 X ② 資源 Y タスク2 ① 資源 Y ② 資源 X 互いに相手の資源を待って停止する
図 6-4 資源獲得順序とデッドロック。右では、タスク 1 が X を持ったまま Y を待ち、タスク 2 が Y を持ったまま X を待つ循環ができます(網掛けの箱が、相手に押さえられていて取れない資源です)。左のように順序をそろえれば、先に X を取れた側が Y も取れるので循環が生まれません。
出題実績 「2 つの資源を排他的に使う 2 つのタスクでデッドロックを防ぐ方法」は平成 31 年春 問 18・令和 4 年秋 問 16・令和 7 年秋 問 18 の 3 回とも正解が「資源の獲得順序を両タスクで同じにする」でした。誤答肢は優先度の変更・獲得順序を逆にする・タイムアウトによる打切りです。

読解問題として、複数プロセスの資源占有順序表を示し「プロセス A と同時に実行するとデッドロックが起こり得る組合せはどれか」を問う形式も 2 回出ています(令和 2 年 10 月 問 17、令和 6 年春 問 17)。解き方は単純で、A と資源の獲得順序が逆転しているプロセスをすべて拾うだけです。順序が A と同じプロセスは、いくら同時に走っても循環を作れません。

なお、タイムアウトやロールバックはデッドロックの検出と回復の手段であって、発生させない防止・回避とは別物です。銀行家アルゴリズムのように、資源を割り当てても安全状態が保てるときだけ割り当てる方式が回避にあたります。

実記憶管理 ― 区画・フィット方式・ガーベジコレクション

実記憶管理は、主記憶(実アドレス空間)をプログラムにどう切り分けるかの話です。仮想記憶を使わず実アドレスをそのままプログラムに割り当てる方式を実アドレス方式と呼びます。多重プログラミングをするには 1 本の主記憶を複数のプログラムで分け合う必要があり、割当て方式は次のように発展しました。

方式内容問題点
単一連続割当て方式主記憶に OS と 1 本のプログラムだけを置く多重プログラミングができない
固定区画方式あらかじめ決めた大きさの区画に分け、プログラムを 1 つずつ入れる区画より小さいプログラムでは区画内に未使用部分が残る(内部フラグメンテーション)
可変区画方式プログラムの大きさに合わせて必要な分だけ区画を取る確保と解放を繰り返すと、合計は足りるのに連続した空きが取れない状態になる(外部フラグメンテーション)

外部フラグメンテーションの対策がメモリコンパクション(使用中の領域を片側に寄せ集めて空きを 1 つにまとめる)です。効果は大きい一方、移動のあいだプログラムを止める必要があります。

空き領域の選び方(フィット方式)

可変区画方式では、複数ある空き領域のどれを使うかで断片化の残り方が変わります。3 つの記憶域管理アルゴリズムの結果を図 6-5 で見比べてください。

要求 16K バイトをどの空き領域に割り当てるか 空き 30K 空き 20K 空き 50K ファーストフィット 16K を割当て 残り 14K 探索せず 探索せず ベストフィット 大きすぎ 16K を割当て 残り 4K 大きすぎ ワーストフィット 候補外 候補外 16K を割当て 残り 34K ベストフィットは 4K の小さな断片を残す
図 6-5 フィット方式の比較。ファーストフィットは先頭から探して最初に見つかった領域、ベストフィットは要求を満たす最小の領域、ワーストフィットは最大の領域を選びます。ベストフィットは無駄なく詰められる代わりに、使いにくい小さな空きが多数残ります。
出題実績 ベストフィットは令和 5 年春 問 5 と令和 7 年秋 問 5 で 2 回。前者は「平均処理時間を最短にする空き領域の管理構造」を問い、正解は大きさをキーとする 2 分探索木でした(連結リストを順に見ると探索が遅くなるため)。後者は方式の特徴そのものです。従来の問 16〜19 ブロックではなく問 5 に出た点にも注意してください。

スワッピング・オーバーレイ・ガーベジコレクション

主記憶が足りないときに使う古典的な手段が 3 つあります。

ガーベジコレクションで扱うのはヒープです。関数呼出しの戻り番地や局所変数を後入れ先出しで積むスタックは、呼出しが戻れば自動的に解放されるので回収の対象ではありません。この 2 つの役割を入れ替えた選択肢が定番の誤答です。

出題実績 ガーベジコレクションは直近 10 年で 3 回(平成 28 年秋 問 16、令和 2 年 10 月 問 16、令和 3 年春 問 18)。「不要になったヒープ領域を回収して再利用可能にする」が一貫した正解で、誤答肢はコンパクション・スワップアウト・スタックの説明です。

仮想記憶とページ置換え

仮想記憶は、実記憶より大きなアドレス空間をプログラムに見せる仕組みです。実際のデータは実記憶と補助記憶(ページファイル・スワップ領域)に分かれて置かれ、プログラムが使う仮想アドレスは参照のたびに実アドレスへ変換されます。この変換を行うハードウェアが DAT(Dynamic Address Translator:動的アドレス変換機構)で、変換表がページテーブル、直近の変換結果を覚えておいて変換を速くする専用キャッシュが TLB(Translation Lookaside Buffer)です。この節は仮想記憶管理だけで直近 10 年に 20 問出ており、多重プログラミングとスケジューリング(23 問)に次ぐ第 2 の得点源です。

方式分割の単位特徴
ページング方式固定長のページ大きさが一定なので管理が簡単。ページ内に未使用部分が出る(内部フラグメンテーション)が、外部フラグメンテーションは起きない
セグメント方式可変長のセグメント(手続き・配列など論理的なまとまり)論理単位で保護・共有できる。長さがまちまちなので外部フラグメンテーションが起きる
セグメントページング方式セグメントをさらにページに分割両者の利点を組み合わせた方式
ベースアドレス方式―プログラムの先頭番地(基準アドレス)をレジスタに入れ、そこからの変位を足して実アドレスを求める。主記憶のどこに置いても実行できる(再配置)
単一仮想空間方式/多重仮想空間方式―全プロセスで 1 つの仮想空間を共有するか、プロセスごとに独立した仮想空間を持つか。後者はプロセス間の干渉を防げる

ページを実記憶へ持ち込むタイミングにも名前が付いています。参照されて初めて読み込むデマンドページングが基本で、近く使われそうなページを先読みするのがプリページングです。

ページフォールトの処理手順

参照した仮想ページが実記憶に無いとページフォールト(内部割込みの一種)が起き、OS が図 6-6 の手順でページを持ち込みます。

ページフォールト=参照した仮想ページが実記憶に無い ① フォールト検出 実記憶に無い ② 対象ページ決定 LRU などで選ぶ ③ ページアウト 変更分を書出し ④ ページイン 目的ページを読込み 変更されていないページなら ③ は不要 ページフォールト回数 = ページイン回数 ≧ ページアウト回数
図 6-6 ページフォールトの処理順序。実記憶に空きページが無いときは、②で追い出す相手を決めてから③④を行います。追い出すページが読み込まれたあと変更されていなければ書き戻す必要がないため、③を伴わないケースが生まれます。④でページを読み込んだあとは、割込みのあった命令を先頭から再実行します。

この「③を伴うか伴わないか」が、直近 10 年で 6 回出ているページフォールト(うち計算が 4 回)の急所です。回数の大小関係も覚えておきます。ページフォールトが起きれば必ずページインが 1 回起きるので両者は等しく、ページアウトは起きないこともあるのでそれ以下になります。

ページフォールト 1 回あたりの平均処理時間 30 ミリ秒 ページフォールト 確率 p ページインだけ 20 ミリ秒 確率 1−p ページアウト+ページイン 60 ミリ秒 20p + 60(1 − p) = 30 → p = 0.75
図 6-7 加重平均でページアウトを伴わない割合を求める型。平均が 2 つの経路の期待値の和になることを式にすれば、あとは 1 次方程式です。設問が「伴わない割合」か「伴う割合」かで答えが 0.75 と 0.25 に分かれます。

計算の型: ページフォールトの平均処理時間

平均処理時間 = p × Tページインのみ + (1 − p) × Tページアウトを伴う(p はページアウトを伴わない割合)

  1. 2 つの経路の処理時間を書き出す(ページインだけ 20 ミリ秒、ページアウト+ページイン 60 ミリ秒)
  2. 求める割合を p と置き、加重平均の式を立てる: 20p + 60(1 − p) = 30
  3. 展開して解く: 20p + 60 − 60p = 30 → −40p = −30 → p = 0.75
  4. 問われているのがどちらの割合かを確認する。「伴わない」なら 0.75、「伴う」なら 1 − 0.75 = 0.25
出題実績 この型は平成 28 年春 問 17・平成 30 年秋 問 18・令和 5 年秋 問 16 の 3 回とも正解が 0.75 でした。令和 3 年秋 問 17 は同じ加重平均を逆向きに使い、許容できる遅延から最大のページフォールト発生率を求めさせています。

ページ置換えアルゴリズム

実記憶に空きページが無いとき、どのページを追い出すかを決めるのが置換えアルゴリズムです。

方式追い出すページひっかけ
FIFO(First In First Out)実記憶に読み込まれてから最も時間が経過したページ「最も古い」の基準がロード時刻。よく使われていても追い出す
LRU(Least Recently Used)最後に参照されてから最も時間が経過したページ基準は最終参照時刻。FIFO と入れ替えた選択肢が定番の誤答
LFU(Least Frequently Used)参照された回数が最も少ないページ回数と時刻を混同させる
クロック方式(LRU の近似)参照ビットが 0 のページを順に探すLRU の実装コストを下げた近似方式

参照列を追うトレース問題は、表を書けば必ず解けます。図 6-8 は実記憶 3 ページで参照列 2 → 3 → 2 → 1 → 5 → 2 → 4 を処理した結果です。

参照列 2 3 2 1 5 2 4 FIFO 枠1(4000) 枠2(5000) 枠3(6000) 判定 2 2 2 2 5 5 5 3 3 3 3 2 2 1 1 1 4 × × ○ × × × × 計 6 回 LRU 枠1(4000) 枠2(5000) 枠3(6000) 判定 2 2 2 2 2 2 2 3 3 3 5 5 5 1 1 1 4 × × ○ × × ○ × 計 5 回 ×=ページフォールト ○=ヒット
図 6-8 FIFO と LRU の置換えトレース。5 回目の参照 5 で、FIFO は最初に読み込んだ 2 を、LRU は最後の参照が最も古い 3 を追い出します。この 1 手の違いで 6 回目の参照 2 がヒットするかどうかが変わり、フォールト回数に差が出ます。枠 1〜3 の括弧内は、その枠に対応する実記憶の番地(4000・5000・6000 番地)です。最後に参照したページ 4 が入るのは枠 3 なので、番地を問われたら 6000 番地が答えになります。
覚え方 FIFO は「入った順」、LRU は「使った順」。トレース表を書くときは、FIFO なら枠に入れた時刻を、LRU なら最後に参照した時刻をメモしておけば、追い出す相手を迷わず選べます。
出題実績 LRU は直近 10 年で 5 回(平成 28 年春 問 18、平成 28 年秋 問 18、平成 31 年春 問 19、令和 5 年春 問 18、令和 7 年春 問 15)出ています。うち 2 回は実記憶の番地を答えさせる形で、参照列を最後まで処理したあと「最後に参照したページが格納されている番地」を選ばせ、正解はどちらも 6000 番地でした。平成 28 年秋 問 18 はページフォールト回数(10 回)を数える計算、残る 2 回は「使用後の経過時間が最長のページを置き換える」という定義の知識問題です。トレース表に枠と番地の対応を書き添えておけば、どの形でも同じ表で答えられます。

スラッシングとワーキングセット

多重度を上げすぎると 1 プログラムあたりに割り当てられる実記憶が減り、ページフォールトが多発します。CPU がページの入替えばかりに時間を使い、処理能力(スループット)が急激に落ちる現象がスラッシングです。対策は多重度を下げる(実行中のプログラム数を減らす)か、実記憶を増設することです。

ある時点でプログラムが実際に参照しているページの集合をワーキングセットと呼び、これを実記憶に収めておけばフォールトが抑えられます。多重度の上限をワーキングセットの合計から決める考え方がワーキングセットモデルです。

出題実績 スラッシングは直近 10 年で 3 回(平成 29 年秋 問 17、令和 3 年秋 問 16、令和 6 年秋 問 17)。いずれも「ページ置換えが多発して処理能力が低下する現象名」を問う形で、誤答肢はフラグメンテーション・スワッピング・オーバーレイでした。

入出力管理とファイルシステム

入出力装置は CPU に比べて桁違いに遅いので、待たせない工夫がそのまま OS の性能になります。この小分類は直近 10 年で本中分類としての出題はありませんが、用語は科目 A の他分野や科目 B の読解でも前提知識として出てくるので、対応関係だけ押さえます。

仕組み内容効果
プログラム制御方式(直接制御)CPU が 1 語ずつ入出力命令を出すCPU が入出力に付きっきりになる
DMA(Direct Memory Access)DMA コントローラが CPU を介さずに主記憶と装置の間でデータを転送する転送中に CPU が別の処理をできる
チャネル制御方式入出力専用のプロセッサ(チャネル)がチャネルプログラムを実行する。1 台を占有するセレクタチャネル、複数台を時分割で扱うマルチプレクサチャネルがある大量の入出力を CPU から完全に切り離す
スプーリング低速な装置(プリンタなど)への出力をいったん磁気ディスクへ書き、後から装置の速度で処理するプログラムが装置の完了を待たずに次へ進める
バッファリング/バッファプール主記憶に確保した緩衝領域を介してまとめて読み書きする入出力回数を減らし、速度差を吸収する

装置とのやり取りの見せ方にも 2 通りあります。入出力装置のレジスタを主記憶の番地と同じ空間に置き、通常のメモリ操作命令で読み書きするのがメモリマップド I/O(メモリマッピング)、専用の入出力命令と入出力ポート番号で扱うのが I/O マップド I/O(入出力マッピング)です。これらを装置に依存しない形でアプリケーションに見せる制御システムが IOCS(Input/Output Control System)で、データ管理機能(レコード単位のアクセス、スペース管理、カタログ管理、ファイル保護)と組み合わせて使われます。

ディレクトリとパス

ファイルシステムは、補助記憶の領域をファイルとディレクトリ(フォルダ)として使えるようにする機能です。管理方式は、全ファイルを 1 か所に並べる単一ディレクトリから、利用者ごとに 1 段設ける 2 階層ディレクトリ、任意の深さに枝分かれできる階層型ディレクトリ(木構造ディレクトリ)へと発展しました。木構造ディレクトリでは、最上位がルートディレクトリ、いま作業している位置がカレントディレクトリ、利用者ごとの起点がホームディレクトリです。ファイルの位置を示す文字列がパス名で、書き方は次の 2 通りです。

/home/user/docs/report.txt    絶対パス(ルートから書く。/ で始まる)
../docs/report.txt            相対パス(カレントが /home/user/work のとき同じファイルを指す)
.  … カレントディレクトリ自身
.. … 一つ上(親)のディレクトリ

別のファイルを指す仕組みがシンボリックリンク(Windows のショートカット、macOS のエイリアスに相当)で、実体は別の場所にあります。開いたファイルをプログラムが識別するための番号がファイル記述子(ファイルハンドル)、ファイルの物理的位置・保護情報・参照情報を保持する管理領域がファイル制御ブロックです。装置はデータの扱い方で、1 文字ずつ扱うキャラクターデバイスと、一定サイズのブロック単位で扱うブロックデバイスに分かれます。

観点種類要点
ファイルシステムFAT ファイルシステム、NTFS、ReFS(Resilient File System)、NFSNTFS はジャーナリング(更新前に記録を残し、障害時に整合性を復旧する)に対応。ReFS はメタデータをコピーオンライトで更新し、整合性ストリームと併せて回復性を高めた方式。NFS はネットワーク越しに他ホストのファイルを共有する(共有ファイル)。区画された記憶領域の単位がボリューム
ファイル編成とアクセス手法順編成(順次アクセス)、直接編成(直接アクセス)、索引編成(動的アクセス)、区分編成順編成は先頭から順に、直接編成はキーから格納位置を計算(ハッシング)して 1 回でアクセス、索引編成はインデックスを引いてから本体を読む(順次にも直接にも読めるので動的アクセスと呼ぶ)。索引編成は追加が続くとあふれ域が伸びて性能が落ちる
ブロッキング論理レコード、物理レコード(ブロック)、ブロックサイズ、ブロック化因数複数の論理レコードを 1 ブロックにまとめたものがブロックレコード、1 論理レコードを 1 ブロックとするものが非ブロックレコード。まとめることで入出力回数が減り、取り出す処理がデブロッキング。ブロック化因数=ブロックサイズ ÷ 論理レコード長
バックアップフルバックアップ、差分バックアップ、増分バックアップ差分は直前のフルバックアップ以降の変更分(復旧はフル+最新の差分の 2 本)、増分は直前のバックアップ以降の変更分(取得は速いが復旧はフル+全増分が必要)。世代管理と多重バックアップで取り違えに備える

ミドルウェア・言語プロセッサ・開発ツール

ミドルウェアは、OS が提供する基本機能とアプリケーションの間を埋めるソフトウェアです。どのアプリでも必要になる共通機能(データの永続化、トランザクション制御、通信、監視)を引き受けることで、アプリケーション側は業務ロジックに集中できます。

種類役割例
DBMS(データベース管理システム)データの一貫性・同時実行制御・障害回復を引き受ける第 9 章で詳述
TP(トランザクション処理)モニター大量の短いトランザクションの多重実行・資源管理・整合性確保基幹系のオンライン処理
通信管理システム/アプリケーションプログラム間連携ソフトウェアプロトコル処理やメッセージの中継。メッセージキューを介した非同期連携でシステム間を疎結合にするMQ 製品、ESB
Web サーバ/アプリケーションサーバHTTP 要求の受付と、業務ロジックの実行環境の提供Web 3 層構成の中段
運用管理ツール/ソフトウェア開発支援ツール監視・ジョブ実行の自動化、開発工程の支援統合監視、CI ツール

アプリケーションからミドルウェアや OS の機能を呼び出す約束事が API(Application Programming Interface)です。HTTP でやり取りする Web API の仕様記述形式として OpenAPI が広く使われ、機械可読な仕様からクライアントコードやドキュメントを自動生成できます。API がソースコードレベルの取決めであるのに対し、機械語の呼出し規約やデータ配置といったバイナリレベルの取決めが ABI(Application Binary Interface)で、同じ ABI をもつ環境なら再コンパイルなしで実行できます。関数やクラスをまとめて再利用可能にしたものがライブラリで、格納形態によりソースライブラリ・オブジェクトライブラリ・ロードライブラリ・クラスライブラリに分かれます。実行時に結合する共有ライブラリが DLL(Dynamic Link Library)です。

部品を組み合わせて開発する考え方がコンポーネントウェア(Java Beans、CORBA、OSGi)、標準的な構造をあらかじめ用意して穴埋め的に実装させるのが開発フレームワーク(Apache Struts、CakePHP、Spring Framework、Ruby on Rails)です。利用者のコマンドを解釈してプログラムを起動するシェル(コマンドインタプリタ。BShell、CShell、cmd.exe)も、カーネルの機能を呼び出す利用者側のインタフェースとしてこの層に位置づけられます。

言語プロセッサとリンク・ロード

人が書いたソースコードが実行されるまでには、翻訳・結合・配置の 3 段階があります(図 6-9)。

原始プログラム コンパイラ 目的プログラム リンカ ロードモジュール ローダ 主記憶へ配置 実行時に結合 DLL 動的リンク 動的リンクは実行時に結合するため、実行ファイルが小さくなる
図 6-9 翻訳から実行までの流れ。リンカ(リンケージエディタ)は複数の目的プログラムとライブラリを結合してロードモジュールを作り、ローダがそれを主記憶へ読み込みます。動的リンクでは結合が実行時まで遅れ、同じ DLL を複数のプログラムが共有できます。

結合の時点で目的プログラムとライブラリをまとめて 1 つのロードモジュールにしてしまうのが静的リンク、呼び出す時点まで結合を遅らせるのが動的リンク(動的リンキング)です。静的リンクは実行ファイルが大きくなる代わりに単体で動き、動的リンクは実行ファイルが小さく DLL を複数プログラムで共有できる代わりに、実行環境に該当のライブラリが必要です。

コンパイラは内部で次の工程を順に実行します。この順序も出題対象です。

  1. 字句解析: 文字列を字句(トークン)の並びに切り分ける
  2. 構文解析: 文法に従って構文木を作る
  3. 意味解析: 型の整合性など、文法だけでは判定できない誤りを検査する
  4. 最適化: 実行速度やサイズが小さくなるようコードを変形する
  5. コード生成: 目的プログラム(機械語・アセンブリ)を出力する
言語処理ツール働き
コンパイラソース全体をまとめて翻訳してから実行する。実行は速いが翻訳時間がかかる
インタプリタ1 文ずつ解釈しながら実行する。翻訳を待たずに動かせるが実行は遅い
アセンブラアセンブリ言語を機械語に 1 対 1 で変換する
クロスコンパイラ実行するコンピュータとは異なるアーキテクチャのコンピュータ上で目的プログラムを生成する。資源の乏しい組込み機器向けの開発(クロス開発)で使う
実行時コンパイラ(JIT)実行中に頻繁に通る部分を機械語へ翻訳して速度を稼ぐ
プリプロセッサ/ジェネレーター翻訳前の前処理(マクロ展開など)/仕様からソースコードを自動生成する

開発ツール

編集・翻訳・デバッグ・実行を 1 つの環境にまとめたものが IDE(Integrated Development Environment:統合開発環境)です。IDE には、実行を任意の位置で止めて変数の中身を確認しながら 1 行ずつ動かすデバッガが組み込まれています。試験でよく問われる個別ツールは次のとおりです。

これらを一連の流れとしてつないだ道具立てをツールチェーンと呼びます。開発ツール系は直近 3 年で出題が増えており、令和 5 年秋にクロスコンパイラ、令和 6 年春にプロファイラが問われました。

オープンソースソフトウェアとライセンス

OSS(Open Source Software)は、ソースコードが公開され、再配布と改変が認められたソフトウェアです。OSI(Open Source Initiative)が示す定義では、再配布の自由、ソースコードの入手可能性、派生ソフトウェアの配布許可、利用分野・利用者・技術に対する差別の禁止などが求められます。「無償であること」は定義に含まれません(有償のサポート付きディストリビューションを販売してもよい)し、著作権を放棄したものでもありません。

ライセンスの違いを整理する軸がコピーレフトです。改変・再配布した派生物にも同じライセンスの適用を求める性質のことで、この強さでライセンスを 3 つに分けると迷いません(図 6-10)。

コピーレフト=派生物にも同じライセンスを課す性質 GPL 強いコピーレフト 派生物も GPL で公開 LGPL / MPL 弱いコピーレフト 改変部分だけ公開 BSD / MIT / Apache コピーレフトなし 改変部分は公開不要 コピーレフトが強い 自由度が高い
図 6-10 コピーレフトの強さによる分類。GPL のソースを取り込んだプログラムを配布するときは、そのプログラム全体を GPL で公開する義務が生じます。ライブラリとしてリンクするだけなら公開義務が及ばない LGPL、改変したファイル単位で公開すればよい MPL、という中間段階があります。
ライセンスコピーレフト派生物を配布するときの義務
GPL(GNU General Public License)強い派生物全体を同じ GPL で、ソースコード付きで配布する
LGPL(Lesser GPL)弱いライブラリ本体を改変したら公開する。リンクして利用するだけの側は独自ライセンスでよい(ただし著作権表示やライブラリ側ソースの入手手段提供などの条件は伴います)
MPL(Mozilla Public License)弱い改変したファイル単位で公開する(Covered Software を含む新規ファイルにも義務が及びます)
BSDL(BSD License)/MIT ライセンスなし著作権表示と免責条項を残す(MIT の必須記載は著作権表示と許諾通知で、免責文言はその一部です)。ソース非公開の製品に組み込んでよい
Apache ライセンスなし著作権表示・変更点の告知に加え、特許の取扱い(貢献者からの特許ライセンス許諾)を明文化している

1 つのソフトウェアを、OSS ライセンスと商用ライセンスの両方で提供するデュアルライセンスもあります。GPL のままでは自社製品に組み込めない利用者が、有償の商用ライセンスを選べるようにする形です。

代表的な OSS と利用上の考慮点

分野代表例補足
Web システムの定番構成LAMP(Linux・Apache・MySQL・PHP)、LAPP(PHP と組む DB を PostgreSQL にしたもの)OS・Web サーバ・DBMS・言語の 4 点セット
OS・言語Linux カーネル、UNIX 系 OS(FreeBSD、NetBSD、OpenBSD)、Perl、Python、Ruby、RR は統計解析向けの言語・実行環境(令和 6 年秋 問 7 で出題)。UNIX の仕様は The Open Group が管理
ライブラリ・配布オープンソースライブラリ、CPAN(Perl)、PEAR(PHP)、jQuery―
分散処理・仮想化・クラウドHadoop、Xen、Docker、Kubernetes、Terraform、OpenStack、IstioHadoop は大規模データセットを多数のコンピュータで分散処理するソフトウェアライブラリ
AI・機械学習TensorFlow、PyTorch、Keras、Chainer、OpenCV、Deeplearning4j―
開発・運用支援Eclipse、Git、Subversion、Jenkins、Redmine、Selenium、SonarQube、Ansible、Chef、Puppet、Prometheus、Zabbix、Grafana―
コミュニティ・団体Open Source Initiative(OSI)、Free Software Foundation(FSF)、Linux Foundation、Apache Software Foundation、OpenSSFOpenSSF は OSS のサプライチェーンセキュリティを扱う
出題実績 Hadoop は平成 29 年秋 問 19 と令和 3 年春 問 20 で 2 回、同じ「大規模データセットの分散処理」を問う形で出ています。OSS 系は直近 3 年で密度が約 2 倍になり、令和 5 年秋に Linux カーネル、令和 6 年秋に R 言語、令和 7 年春にライセンス 4 種の組合せが出題されました。

導入時の考慮点は、ライセンスの適用範囲(自社製品に組み込むと公開義務が及ばないか)、サポート費用(無償なのはソフトウェア本体だけで、保守は自社かディストリビュータが担う)、問題発生時の対処(無保証が原則で、修正は自社対応かコミュニティ待ち)、そして脆弱性情報を追い続ける体制です。ソースが公開されているだけでは安全性・信頼性は保証されません。

ソフトウェアの使用許諾 自社で開発したソフトウェアは、特許技術を使っていなくても、著作権の登録をしていなくても、他社に使用を許諾できます。著作権は創作した時点で発生し、登録は権利発生の要件ではないからです。この論点は平成 28 年秋・平成 30 年春・令和元年秋の問 50 で 3 回、同じ正解で出題されています。

ひっかけポイント

ここがひっかけ 1: LRU と FIFO の基準 「最も長い間使われていないページ」が LRU、「最も古く読み込まれたページ」が FIFO です。選択肢はこの 2 文をわざと入れ替えて並べてきます。参照回数を基準にするのは LFU で、これも同じ問題の誤答肢に並びます。時刻か回数か、ロード時刻か参照時刻かの 2 段階で切り分けてください。
ここがひっかけ 2: 「伴う」か「伴わない」か ページフォールトの加重平均問題では、方程式を解いて出る値(p = 0.75)は「ページアウトを伴わない割合」です。設問が「伴う割合」を聞いていれば答えは 1 − 0.75 = 0.25 で、両方が選択肢に並びます。解いた直後に設問文へ戻り、どちらを聞かれたか確認する習慣を付けてください。
ここがひっかけ 3: TAT の到着時刻 ターンアラウンドタイムは完了時刻 − 到着時刻です。完了時刻をそのまま答えさせる肢と、処理時間そのものを答えさせる肢が必ず用意されています。また「到着順」と「処理時間順」で解いた値の両方が並ぶので、方式名の読み違いにも注意します。
ここがひっかけ 4: プリエンプション後は「待ち状態」ではない CPU を奪われたタスクは、CPU さえ空けばすぐ動けるので実行可能状態へ移ります。待ち状態は入出力の完了など外部の事象を待つ状態で、自分から CPU を手放したときに入ります。3 回連続で正解が「実行可能状態」だったこの論点は、確実に取ってください。
ここがひっかけ 5: 似た用語の住み分け スラッシングは仮想記憶(ページ置換えの多発)、フラグメンテーションは実記憶(空き領域の細切れ)の話です。デッドロック対策では「優先度を上げる」「タイムアウトで打ち切る」が誤答肢の定番で、前者は循環待ちを解けず、後者は検出・回復であって防止ではありません。ガーベジコレクションの対象がスタックではなくヒープである点も同じ型のひっかけです。

理解度チェック(科目 A 形式)

Q1. 仮想記憶方式のシステムにおいて、ページフォールト 1 回の処理時間は、ページアウトを伴わない場合が 20 ミリ秒、ページアウトを伴う場合が 60 ミリ秒である。ページフォールト 1 回あたりの平均処理時間が 30 ミリ秒であるとき、ページアウトを伴わないページフォールトの割合はいくらか。
  1. 0.20
  2. 0.25
  3. 0.75
  4. 0.80

正解: ウ 求める割合を p として加重平均の式を立てると 20p + 60(1 − p) = 30 となり、−40p = −30 から p = 0.75 です。イ はページアウトを伴う割合で、設問が聞いているのは伴わない方です。ア と エ は方程式を解かずに 20 と 60、30 と 60 の比から作った値で、加重平均の関係を満たしません。

Q2. ページング方式の仮想記憶において、LRU 方式で置換えの対象となるページはどれか。
  1. 主記憶に読み込まれてから最も時間が経過したページ
  2. 参照された回数が最も少ないページ
  3. 参照された回数が最も多いページ
  4. 最後に参照されてから最も時間が経過したページ

正解: エ LRU(Least Recently Used)は最終参照時刻が最も古いページを追い出します。ア は読込み時刻を基準にする FIFO の説明、イ は参照回数を基準にする LFU の説明です。ウ は最もよく使われているページであり、追い出せば直後に再びフォールトするので置換え対象として不適切です。

Q3. 一つのシリアルバスに接続された 2 個のセンサから、複数のタスクが値を読み出す。読出し処理が互いに重ならないようにするために使用する OS の機能はどれか。
  1. インターバルタイマ
  2. セマフォ
  3. スプーリング
  4. メッセージキュー

正解: イ 共有資源を同時に 1 つのタスクしか使えないようにする排他制御の機能がセマフォです。ア は一定時間ごとに割込みを発生させる機能で、排他は保証できません。ウ は低速な出力装置への出力を一時的に磁気ディスクへためる仕組みです。エ はタスク間でデータを受け渡す同期の手段であり、バスの占有そのものを制御する機能ではありません。

Q4. 二つの資源 X と Y を排他的に使用する二つのタスクがある。デッドロックの発生を防ぐ方法として適切なものはどれか。
  1. どちらのタスクも X、Y の順に資源を獲得する
  2. 一方のタスクの優先度を高くする
  3. 一方のタスクだけ Y、X の順に資源を獲得する
  4. 資源の獲得待ちが一定時間を超えたタスクを打ち切る

正解: ア 獲得順序をそろえると、先に X を取れたタスクが Y も取れるため循環待ちが成立しません。イ は優先度が高くても相手が持つ資源が空くまで待つので、循環待ちは解消しません。ウ は循環待ちを作る条件そのものです。エ はデッドロックの検出と回復の手段であり、発生自体を防ぐ方法ではありません。

Q5. 実行状態のタスクが、より優先度の高いタスクの出現によって CPU を横取りされたとき、遷移する先の状態はどれか。
  1. 休止状態
  2. 待ち状態
  3. 実行可能状態
  4. 実行状態のまま変わらない

正解: ウ 横取りされたタスクは CPU さえ割り当てられればすぐ動けるので、実行可能状態の待ち行列に並び直します。イ は入出力の完了など外部の事象を待つ状態で、自分から CPU を手放したときに入ります。ア は生成前と消滅後の状態です。エ は CPU を奪われている以上、成り立ちません。

Q6. 仮想記憶方式のシステムで多重度を上げすぎたとき、ページの置換えが多発してシステムの処理能力が急激に低下する現象はどれか。
  1. オーバーレイ
  2. フラグメンテーション
  3. スワッピング
  4. スラッシング

正解: エ スラッシングは、実記憶が不足してページの入替えに CPU 時間が費やされ、スループットが急落する現象です。ア は同時に使わないモジュールを同じ領域に上書きしながら実行する手法、イ は実記憶の空き領域が細切れになる現象で仮想記憶の話ではありません。ウ はプログラム単位で主記憶と補助記憶を出し入れする仕組みで、それ自体は異常な状態を指しません。

Q7. 主記憶管理におけるガーベジコレクションの説明として適切なものはどれか。
  1. 動的に確保され、参照されなくなったヒープ領域を回収して再び割当て可能にする
  2. 使用中の領域を移動して、細切れになった空き領域を一つにまとめる
  3. 実行中でないプログラムを主記憶から補助記憶へ退避する
  4. 関数の戻り番地や局所変数を後入れ先出しで管理する

正解: ア ガーベジコレクションはヒープの回収機能です。イ はメモリコンパクション、ウ はスワップアウト(ロールアウト)の説明です。エ はスタックの説明で、スタックは呼出しが戻れば自動的に解放されるため回収の対象になりません。

Q8. A 社が自社で開発したソフトウェアを、B 社に有償で使用許諾しようとしている。使用許諾に関する記述として適切なものはどれか。
  1. 特許を取得していなければ、他社に使用許諾できない
  2. 著作権の登録をしていなければ、他社に使用許諾できない
  3. 特許技術を使用していなくても、他社に使用許諾できる
  4. ソースコードを開示しなければ、他社に使用許諾できない

正解: ウ ソフトウェアの著作権は創作した時点で発生し、著作権者は自らの判断で使用を許諾できます。ア は特許の有無と使用許諾は無関係なので誤りです。イ は登録が権利発生の要件ではないため誤りです。エ は許諾の条件を契約で自由に定められるので、ソースコードの開示は必須ではありません。

Q9. タスク A(到着 0 秒・処理 6 秒)、B(到着 1 秒・処理 3 秒)、C(到着 2 秒・処理 2 秒)を、タイムクウォンタム 2 秒のラウンドロビンで実行する。到着したタスクは実行可能待ち行列の最後尾に入り、タイムクウォンタムを使い切ったタスクはさらにその後ろに回るとき、タスク C が終了するのは何秒後か。
  1. 4
  2. 6
  3. 8
  4. 11

正解: イ 0〜2 秒は A、2 秒の時点で待ち行列は B、C、A の順になるので 2〜4 秒は B、4〜6 秒は C が実行され、処理時間 2 秒の C は 6 秒で完了します。ア は最初の巡回で C が動くと誤った値です。ウ は処理時間順で解いた C の完了時刻、エ は到着順で解いた C の完了時刻です。

Q10. Q9 と同じ 3 タスクを、処理時間順(ノンプリエンプティブ、多重度 1)で実行したとき、タスク B のターンアラウンドタイムは何秒か。
  1. 3
  2. 8
  3. 10
  4. 11

正解: ウ 0 秒の時点では A しか到着していないので A が 0〜6 秒。6 秒の時点で到着済みの B(3 秒)と C(2 秒)のうち短い C が 6〜8 秒、B は 8〜11 秒に実行され、11 − 1 = 10 秒です。ア は処理時間そのもの、イ は到着順で解いた場合の値、エ は完了時刻から到着時刻を引き忘れた値です。

Q11. 可変区画方式の主記憶に、30K バイト、20K バイト、50K バイトの空き領域が先頭からこの順に存在する。16K バイトの領域を要求したとき、ベストフィット方式が選ぶ空き領域と、この方式の特徴の組合せとして適切なものはどれか。
  1. 30K バイト/先頭から順に探索するので割当てが速い
  2. 50K バイト/割当て後に残る空きが大きく、再利用しやすい
  3. 30K バイト/要求を満たす最小の空き領域を選ぶ
  4. 20K バイト/利用しにくい小さな空き領域が多数残りやすい

正解: エ ベストフィットは要求を満たす最小の空き領域を選ぶので 20K バイトが割り当てられ、4K バイトという使い道の乏しい断片が残ります。ア はファーストフィット、イ はワーストフィットの説明です。ウ は選び方の説明自体は正しいものの、その基準で選ばれるのは 20K バイトなので、領域との組合せが誤りです。

Q12. OSS のライセンスに関する記述のうち、GPL の説明として適切なものはどれか。
  1. GPL のコードを組み込んだプログラムを配布する場合、そのプログラム全体を GPL でソースコード付きで配布しなければならない
  2. 改変したファイルだけを公開すればよく、同時に配布する他のファイルは非公開にできる
  3. 著作権表示と免責条項を残せば、ソースコードを公開せずに製品へ組み込める
  4. 商用利用が禁止されており、無償で配布する場合に限って利用できる

正解: ア GPL は強いコピーレフトをもち、派生物全体に同じライセンスの適用を求めます。イ は改変ファイル単位で公開すればよい MPL の説明、ウ は BSDL や MIT ライセンスの説明です。エ は「利用する分野に対する差別の禁止」という OSS の定義に反するので、どの OSS ライセンスにも当てはまりません。

Q13. 複数の目的プログラムやライブラリを結合して、一つのロードモジュールを作成するプログラムはどれか。
  1. ローダ
  2. リンカ
  3. コンパイラ
  4. アセンブラ

正解: イ リンカ(リンケージエディタ)が目的プログラムとライブラリを結合してロードモジュールを作ります。ア はできあがったロードモジュールを主記憶へ読み込むプログラムです。ウ は原始プログラムを目的プログラムへ翻訳するプログラム、エ はアセンブリ言語を機械語へ変換するプログラムで、いずれも結合は行いません。

Q14. 短いタスクが次々と到着し続ける環境において、処理時間の長い特定のタスクが CPU の割当てを受けられないまま待たされ続けるおそれが最も大きいスケジューリング方式はどれか。
  1. 処理予定時間が最短のタスクから順に実行する方式
  2. 到着した順にタスクを実行する方式
  3. 待ち時間が長くなったタスクの優先度を上げていく優先度方式
  4. 一定時間ごとにタスクを切り替えて順番に巡回する方式

正解: ア 処理時間順(SPT)は短いタスクを優先するため、短いタスクが到着し続ける限り長いタスクの順番が回ってこず、リソーススタベーション(飢餓)が起こります。イ は到着順なので、待てば必ず順番が回ります。ウ は待ち時間に応じて優先度を上げるエージングそのもので、飢餓を防ぐための仕組みです。エ はラウンドロビンで、全タスクにタイムクウォンタムが均等に回ります。

まとめ

中分類 5 は直近 10 年(19 回)で 76 問、1 回平均 4.0 問が出題されています。うち仮想記憶管理が 20 問、多重プログラミングとスケジューリングが 23 問で、この 2 テーマだけで 43 問。同じ論点の再出題が非常に多い分野なので、下の表の値がそのまま得点になります。

論点覚える形誤答肢の作られ方
タスクの状態遷移プリエンプション → 実行可能状態/入出力要求 → 待ち状態/待ち状態から実行状態へ直接は戻らない遷移先を「待ち状態」にすり替える
ターンアラウンドタイムTAT = 完了時刻 − 到着時刻/待ち時間 = TAT − 処理時間到着時刻を引かない/別方式で解いた値
スケジューリング方式SPT は同時に待つジョブの平均 TAT を最小にするが長いタスクが飢餓に陥る/ラウンドロビンは TSS 向き/エージングで飢餓を防ぐ方式の特徴を 1 つずらす
多重度CPU と入出力の重なりを時間軸で数える/一時ファイルは同時に存在する合計の最大値単純な割算・掛算で出る値
セマフォ/デッドロックセマフォ=共有資源の排他制御/防止策=獲得順序をそろえる/占有順序表は A と順序が逆転する相手を拾う優先度変更・タイムアウト・順序を逆にする
実記憶管理ベストフィット=要求を満たす最小の領域、小さな断片が残る/GC はヒープを回収/コンパクションで外部フラグメンテーションを解消フィット方式の入替え、スタックとヒープの入替え
ページ置換えFIFO はロード時刻、LRU は最終参照時刻、LFU は参照回数3 方式の基準を入れ替える
ページフォールト手順は 検出 → 対象決定 → ページアウト → ページイン/フォールト回数 = ページイン回数 ≧ ページアウト回数/20p + 60(1 − p) = 30 → p = 0.75「伴う割合」0.25 との取り違え、手順の入替え
スラッシング仮想記憶で置換えが多発し処理能力が急落/対策は多重度を下げるか実記憶の増設フラグメンテーション・スワッピング・オーバーレイ
言語プロセッサ字句解析 → 構文解析 → 意味解析 → 最適化 → コード生成/リンカがロードモジュールを作り、ローダが主記憶へ配置/クロスコンパイラは別アーキテクチャ向けリンカとローダの入替え
OSS ライセンスGPL=派生物全体を GPL で公開/LGPL・MPL=改変部分だけ/BSD・MIT・Apache=公開義務なしコピーレフトの強弱を 1 段ずらす
ソフトウェア使用許諾自社開発ソフトは特許技術を使っていなくても使用許諾できる特許取得・著作権登録・ソース開示を要件にする

次の第 7 章では、この OS が動く土台であるハードウェア(論理回路・組込みシステム・IoT デバイス)を扱います。本章のリアルタイム OS・組込み OS・クロス開発は、そのまま第 7 章の組込みシステム設計につながります。