- OS の構成(カーネル・シェル・ミドルウェア)と、タスクの 3 状態がどの契機で遷移するか
- 到着順・処理時間順・ラウンドロビンのガントチャートを描き、ターンアラウンドタイムを計算する型
- セマフォによる排他制御と、資源の獲得順序を揃えるデッドロック防止策
- 実記憶の区画割当て(フィット方式・フラグメンテーション・ガーベジコレクション)と、仮想記憶のページ置換え(FIFO / LRU)・ページフォールトの計算
- ファイルシステム・言語プロセッサ・開発ツールの用語と、OSS ライセンスをコピーレフトの強弱で見分ける方法
科目 A では直近 10 年(19 回)で 76 問、1 回平均 4.0 問(2〜5 問)出題されています。仮想記憶管理(20 問)と多重プログラミング・スケジューリング(23 問)の 2 テーマだけで 43 問を占めるので、この 2 つの計算を確実に取って 3 問確保が目標です。
OS の役割・構成と種類
OS(Operating System)は、ハードウェアを直接操作して CPU・主記憶・入出力装置をアプリケーションに公平かつ効率よく割り当てるソフトウェアです。ソフトウェアの体系では、OS・言語プロセッサ(コンパイラやインタプリタ)・サービスプログラム(ユーティリティ)をまとめてシステムソフトウェア(基本ソフトウェア)と呼び、その上に OS とアプリケーションの中間に位置するミドルウェア、さらに応用ソフトウェアが載ります。図 6-1 で階層の位置関係を押さえてください。
カーネルとシェル、特権モード
カーネルは 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 用 OS | GUI・マルチメディア・幅広い周辺機器への対応 | 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 |
| ネットワーク OS | LAN / 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 をまだ持たない |
| 実行可能 → 実行 | ディスパッチ(ディスパッチャが CPU を割り当てる) | 「誰を次に走らせるか」を決めるのがスケジューラ、実際に CPU を渡すのがディスパッチャ |
| 実行 → 実行可能 | プリエンプション(タイムクウォンタムの満了、より優先度の高いタスクの出現) | まだ動ける状態なので「待ち」ではない |
| 実行 → 待ち | 入出力要求などの SVC(スーパーバイザーコール)割込み | 自分から CPU を手放す |
| 待ち → 実行可能 | 入出力終了割込み(待っていた事象の完了) | 実行状態へは直接戻らない |
| 実行 → 消滅 | タスクの終了 | 資源を解放して消える |
ディスパッチャと割込み
実行可能状態のタスクから次に走らせるものを選ぶのがスケジューラ、選ばれたタスクに実際に 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・ラウンドロビンで解いたガントチャートです。同じ入力でも完了順と平均が変わることを目で確認してください。
| ジョブ | 到着/処理 | FCFS の TAT | SPT の TAT | RR の TAT |
|---|---|---|---|---|
| A | 0 / 6 | 6 − 0 = 6 | 6 − 0 = 6 | 11 − 0 = 11 |
| B | 1 / 3 | 9 − 1 = 8 | 11 − 1 = 10 | 9 − 1 = 8 |
| C | 2 / 2 | 11 − 2 = 9 | 8 − 2 = 6 | 6 − 2 = 4 |
| 平均 | ― | 23 ÷ 3 ≒ 7.7 | 22 ÷ 3 ≒ 7.3 | 23 ÷ 3 ≒ 7.7 |
計算の型: ターンアラウンドタイム(TAT)
TAT = 完了時刻 − 到着時刻 / 待ち時間 = TAT − 処理時間
- 方式に従って処理順を決める(到着順は到着時刻順、処理時間順はその時点で到着済みのジョブのうち処理時間が最短のもの、ラウンドロビンは量子ごとの巡回)
- 時間軸に沿ってガントチャートを書き、各ジョブの完了時刻を読む
- 完了時刻から到着時刻を引く(引き忘れが最頻出の誤答)
- 平均を問われたら全ジョブの TAT を足して件数で割る
図 6-3 の例を処理時間順で解くと、A が 0〜6 秒、次は到着済みの B(3 秒)と C(2 秒)のうち短い C が 6〜8 秒、最後に B が 8〜11 秒。B の TAT は 11 − 1 = 10 秒です。
多重度と処理時間の計算
もう 1 つの計算の型が多重度です。同時に走らせるタスク(ジョブ)の数を増やすと、あるタスクが入出力をしている間に別のタスクが CPU を使えるため、全体の所要時間が短くなります。CPU は 1 個しかない点、入出力と CPU 処理は重ねられる点の 2 つを押さえて時間軸を描きます。
計算の型: 多重度を上げたときの短縮時間
1 件が「CPU 2 秒 → 入出力 4 秒」で構成される処理を 4 件実行します。CPU は 1 個、入出力装置は十分にあり、待ちは CPU の取り合いだけで起こるものとします。多重度 1(1 件ずつ順番に)と多重度 2(常に 2 件までシステム内に置く)で、全件終了までの時間はどれだけ違うでしょうか。
- 多重度 1: 1 件が 2 + 4 = 6 秒。順番に 4 件なので 6 × 4 = 24 秒
- 多重度 2 は時間軸で追う。0〜2 秒に 1 件目が CPU、2〜4 秒に 2 件目が CPU(1 件目は入出力中)
- 1 件目は 6 秒で終了し 3 件目が入る(6〜8 秒に CPU)。2 件目は 8 秒で終了し 4 件目が入る(8〜10 秒に CPU)
- 3 件目は 12 秒、4 件目は 14 秒に終了。全件終了は 14 秒
- 差は 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〜2 | 2〜6 | 6 | 0〜2 | 2〜6 | 6 |
| 2 件目 | 6〜8 | 8〜12 | 12 | 2〜4 | 4〜8 | 8 |
| 3 件目 | 12〜14 | 14〜18 | 18 | 6〜8 | 8〜12 | 12 |
| 4 件目 | 18〜20 | 20〜24 | 24 | 8〜10 | 10〜14 | 14 |
ジョブ管理側の頻出計算がジョブ多重度と一時ファイル容量です。実行中だけ一時ファイルを使うジョブが複数あるとき、必要な容量は同時に存在し得る一時ファイルの合計の最大値で決まります。例えば一時ファイルが 100M バイト・150M バイト・200M バイトの 3 ジョブを多重度 2 で実行するなら、どの 2 つが重なってもよいので最大の 2 つを足した 350M バイトを用意します。多重度を 3 に上げれば 450M バイト必要です。
排他制御とデッドロック
複数のタスクが 1 つの資源(共有メモリ、ファイル、1 本のシリアルバスにつながったセンサなど)を同時に使うと、読み書きが混ざって結果が壊れます。そこで「一度に 1 つのタスクしか入れない区間」を作るのが排他制御で、その区間をクリティカルセクションと呼びます。
| 手段 | 仕組み | 使いどころ |
|---|---|---|
| セマフォ | 利用できる資源の個数を表すカウンタ。獲得時の P 操作で 1 減らし、0 未満になった場合はタスクを待ち行列へ。解放時の V 操作で 1 増やし、待っているタスクを 1 つ起こす | 共有資源の管理全般。カウンタの初期値を n にすれば「同時 n 個まで」も表せる |
| ミューテックス | 初期値 1 のセマフォ(二値セマフォ)。ロックをかけたタスクだけが解除できる | 1 個しかない資源の相互排除 |
| イベントフラグ/メッセージ通信 | 「処理が終わった」という事象や、データそのものをタスク間で受け渡す | 排他ではなく同期やデータ受渡し。排他制御を問う設問では誤答肢になる |
| 割込み禁止 | クリティカルセクションの間だけ割込みを受け付けない | ごく短い区間に限る。長く使うと応答性が落ちる |
デッドロックと獲得順序
デッドロックは、複数のタスクが互いに相手の持つ資源の解放を待ち、どちらも永久に進めなくなる状態です。発生には「相互排除」「保持と待ち」「横取り不可」「循環待ち」の 4 条件がすべて必要で、対策はこのどれかを崩すことに帰着します。試験で問われるのはほぼ循環待ちを崩す方法、すなわちすべてのタスクで資源の獲得順序をそろえることです(図 6-4)。
読解問題として、複数プロセスの資源占有順序表を示し「プロセス A と同時に実行するとデッドロックが起こり得る組合せはどれか」を問う形式も 2 回出ています(令和 2 年 10 月 問 17、令和 6 年春 問 17)。解き方は単純で、A と資源の獲得順序が逆転しているプロセスをすべて拾うだけです。順序が A と同じプロセスは、いくら同時に走っても循環を作れません。
なお、タイムアウトやロールバックはデッドロックの検出と回復の手段であって、発生させない防止・回避とは別物です。銀行家アルゴリズムのように、資源を割り当てても安全状態が保てるときだけ割り当てる方式が回避にあたります。
実記憶管理 ― 区画・フィット方式・ガーベジコレクション
実記憶管理は、主記憶(実アドレス空間)をプログラムにどう切り分けるかの話です。仮想記憶を使わず実アドレスをそのままプログラムに割り当てる方式を実アドレス方式と呼びます。多重プログラミングをするには 1 本の主記憶を複数のプログラムで分け合う必要があり、割当て方式は次のように発展しました。
| 方式 | 内容 | 問題点 |
|---|---|---|
| 単一連続割当て方式 | 主記憶に OS と 1 本のプログラムだけを置く | 多重プログラミングができない |
| 固定区画方式 | あらかじめ決めた大きさの区画に分け、プログラムを 1 つずつ入れる | 区画より小さいプログラムでは区画内に未使用部分が残る(内部フラグメンテーション) |
| 可変区画方式 | プログラムの大きさに合わせて必要な分だけ区画を取る | 確保と解放を繰り返すと、合計は足りるのに連続した空きが取れない状態になる(外部フラグメンテーション) |
外部フラグメンテーションの対策がメモリコンパクション(使用中の領域を片側に寄せ集めて空きを 1 つにまとめる)です。効果は大きい一方、移動のあいだプログラムを止める必要があります。
空き領域の選び方(フィット方式)
可変区画方式では、複数ある空き領域のどれを使うかで断片化の残り方が変わります。3 つの記憶域管理アルゴリズムの結果を図 6-5 で見比べてください。
スワッピング・オーバーレイ・ガーベジコレクション
主記憶が足りないときに使う古典的な手段が 3 つあります。
- スワッピング: 実行中でないプログラムを丸ごと補助記憶へ退避(スワップアウト/ロールアウト)し、必要になったら書き戻す(スワップイン/ロールイン)。単位はプログラム全体で、ページ単位で出し入れする仮想記憶とは粒度が違います
- オーバーレイ: 同時には使わないモジュールを同じ領域に上書きしながら実行する。分割はプログラム作成者が指定します
- ガーベジコレクション: プログラムが動的に確保したまま参照されなくなったヒープ領域を回収し、再び割当て可能にする機能
ガーベジコレクションで扱うのはヒープです。関数呼出しの戻り番地や局所変数を後入れ先出しで積むスタックは、呼出しが戻れば自動的に解放されるので回収の対象ではありません。この 2 つの役割を入れ替えた選択肢が定番の誤答です。
仮想記憶とページ置換え
仮想記憶は、実記憶より大きなアドレス空間をプログラムに見せる仕組みです。実際のデータは実記憶と補助記憶(ページファイル・スワップ領域)に分かれて置かれ、プログラムが使う仮想アドレスは参照のたびに実アドレスへ変換されます。この変換を行うハードウェアが DAT(Dynamic Address Translator:動的アドレス変換機構)で、変換表がページテーブル、直近の変換結果を覚えておいて変換を速くする専用キャッシュが TLB(Translation Lookaside Buffer)です。この節は仮想記憶管理だけで直近 10 年に 20 問出ており、多重プログラミングとスケジューリング(23 問)に次ぐ第 2 の得点源です。
| 方式 | 分割の単位 | 特徴 |
|---|---|---|
| ページング方式 | 固定長のページ | 大きさが一定なので管理が簡単。ページ内に未使用部分が出る(内部フラグメンテーション)が、外部フラグメンテーションは起きない |
| セグメント方式 | 可変長のセグメント(手続き・配列など論理的なまとまり) | 論理単位で保護・共有できる。長さがまちまちなので外部フラグメンテーションが起きる |
| セグメントページング方式 | セグメントをさらにページに分割 | 両者の利点を組み合わせた方式 |
| ベースアドレス方式 | ― | プログラムの先頭番地(基準アドレス)をレジスタに入れ、そこからの変位を足して実アドレスを求める。主記憶のどこに置いても実行できる(再配置) |
| 単一仮想空間方式/多重仮想空間方式 | ― | 全プロセスで 1 つの仮想空間を共有するか、プロセスごとに独立した仮想空間を持つか。後者はプロセス間の干渉を防げる |
ページを実記憶へ持ち込むタイミングにも名前が付いています。参照されて初めて読み込むデマンドページングが基本で、近く使われそうなページを先読みするのがプリページングです。
ページフォールトの処理手順
参照した仮想ページが実記憶に無いとページフォールト(内部割込みの一種)が起き、OS が図 6-6 の手順でページを持ち込みます。
この「③を伴うか伴わないか」が、直近 10 年で 6 回出ているページフォールト(うち計算が 4 回)の急所です。回数の大小関係も覚えておきます。ページフォールトが起きれば必ずページインが 1 回起きるので両者は等しく、ページアウトは起きないこともあるのでそれ以下になります。
計算の型: ページフォールトの平均処理時間
平均処理時間 = p × Tページインのみ + (1 − p) × Tページアウトを伴う(p はページアウトを伴わない割合)
- 2 つの経路の処理時間を書き出す(ページインだけ 20 ミリ秒、ページアウト+ページイン 60 ミリ秒)
- 求める割合を p と置き、加重平均の式を立てる: 20p + 60(1 − p) = 30
- 展開して解く: 20p + 60 − 60p = 30 → −40p = −30 → p = 0.75
- 問われているのがどちらの割合かを確認する。「伴わない」なら 0.75、「伴う」なら 1 − 0.75 = 0.25
ページ置換えアルゴリズム
実記憶に空きページが無いとき、どのページを追い出すかを決めるのが置換えアルゴリズムです。
| 方式 | 追い出すページ | ひっかけ |
|---|---|---|
| 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 を処理した結果です。
スラッシングとワーキングセット
多重度を上げすぎると 1 プログラムあたりに割り当てられる実記憶が減り、ページフォールトが多発します。CPU がページの入替えばかりに時間を使い、処理能力(スループット)が急激に落ちる現象がスラッシングです。対策は多重度を下げる(実行中のプログラム数を減らす)か、実記憶を増設することです。
ある時点でプログラムが実際に参照しているページの集合をワーキングセットと呼び、これを実記憶に収めておけばフォールトが抑えられます。多重度の上限をワーキングセットの合計から決める考え方がワーキングセットモデルです。
入出力管理とファイルシステム
入出力装置は 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)、NFS | NTFS はジャーナリング(更新前に記録を残し、障害時に整合性を復旧する)に対応。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)。
結合の時点で目的プログラムとライブラリをまとめて 1 つのロードモジュールにしてしまうのが静的リンク、呼び出す時点まで結合を遅らせるのが動的リンク(動的リンキング)です。静的リンクは実行ファイルが大きくなる代わりに単体で動き、動的リンクは実行ファイルが小さく DLL を複数プログラムで共有できる代わりに、実行環境に該当のライブラリが必要です。
コンパイラは内部で次の工程を順に実行します。この順序も出題対象です。
- 字句解析: 文字列を字句(トークン)の並びに切り分ける
- 構文解析: 文法に従って構文木を作る
- 意味解析: 型の整合性など、文法だけでは判定できない誤りを検査する
- 最適化: 実行速度やサイズが小さくなるようコードを変形する
- コード生成: 目的プログラム(機械語・アセンブリ)を出力する
| 言語処理ツール | 働き |
|---|---|
| コンパイラ | ソース全体をまとめて翻訳してから実行する。実行は速いが翻訳時間がかかる |
| インタプリタ | 1 文ずつ解釈しながら実行する。翻訳を待たずに動かせるが実行は遅い |
| アセンブラ | アセンブリ言語を機械語に 1 対 1 で変換する |
| クロスコンパイラ | 実行するコンピュータとは異なるアーキテクチャのコンピュータ上で目的プログラムを生成する。資源の乏しい組込み機器向けの開発(クロス開発)で使う |
| 実行時コンパイラ(JIT) | 実行中に頻繁に通る部分を機械語へ翻訳して速度を稼ぐ |
| プリプロセッサ/ジェネレーター | 翻訳前の前処理(マクロ展開など)/仕様からソースコードを自動生成する |
開発ツール
編集・翻訳・デバッグ・実行を 1 つの環境にまとめたものが IDE(Integrated Development Environment:統合開発環境)です。IDE には、実行を任意の位置で止めて変数の中身を確認しながら 1 行ずつ動かすデバッガが組み込まれています。試験でよく問われる個別ツールは次のとおりです。
- プロファイラ: 実行時に手続きごとの実行回数や所要時間を計測し、性能上のボトルネックを特定する(令和 6 年春 問 19 で出題)
- 静的解析ツール(ソースコード解析・プログラム構造解析): プログラムを実行せずにコーディング規約違反や潜在バグを検出する。プリティプリンターやクロスリファレンスも静的デバッギングツール
- 動的解析ツール(プログラムを実際に動かして調べる動的デバッギングツール): テストデータ生成ツール、テストカバレージツール、テストベッドツール、プログラム検証ツール、アサーションチェッカ、トレーサー、インスペクター、スナップショット
- エミュレーター・シミュレーター・ICE(In-Circuit Emulator): 実機がなくても組込みソフトを動かして検証する。クロス開発と対で使う
- バージョン管理ツール(SCM:Software Configuration Management=ソフトウェア構成管理)、構築ツール(ビルド/CI)、ドキュメント生成ツール、ローコードツール・ノーコードツール、設計支援ツール(SADT、SREM、PSL/PSA)
これらを一連の流れとしてつないだ道具立てをツールチェーンと呼びます。開発ツール系は直近 3 年で出題が増えており、令和 5 年秋にクロスコンパイラ、令和 6 年春にプロファイラが問われました。
オープンソースソフトウェアとライセンス
OSS(Open Source Software)は、ソースコードが公開され、再配布と改変が認められたソフトウェアです。OSI(Open Source Initiative)が示す定義では、再配布の自由、ソースコードの入手可能性、派生ソフトウェアの配布許可、利用分野・利用者・技術に対する差別の禁止などが求められます。「無償であること」は定義に含まれません(有償のサポート付きディストリビューションを販売してもよい)し、著作権を放棄したものでもありません。
ライセンスの違いを整理する軸がコピーレフトです。改変・再配布した派生物にも同じライセンスの適用を求める性質のことで、この強さでライセンスを 3 つに分けると迷いません(図 6-10)。
| ライセンス | コピーレフト | 派生物を配布するときの義務 |
|---|---|---|
| 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、R | R は統計解析向けの言語・実行環境(令和 6 年秋 問 7 で出題)。UNIX の仕様は The Open Group が管理 |
| ライブラリ・配布 | オープンソースライブラリ、CPAN(Perl)、PEAR(PHP)、jQuery | ― |
| 分散処理・仮想化・クラウド | Hadoop、Xen、Docker、Kubernetes、Terraform、OpenStack、Istio | Hadoop は大規模データセットを多数のコンピュータで分散処理するソフトウェアライブラリ |
| 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、OpenSSF | OpenSSF は OSS のサプライチェーンセキュリティを扱う |
導入時の考慮点は、ライセンスの適用範囲(自社製品に組み込むと公開義務が及ばないか)、サポート費用(無償なのはソフトウェア本体だけで、保守は自社かディストリビュータが担う)、問題発生時の対処(無保証が原則で、修正は自社対応かコミュニティ待ち)、そして脆弱性情報を追い続ける体制です。ソースが公開されているだけでは安全性・信頼性は保証されません。
ひっかけポイント
理解度チェック(科目 A 形式)
Q1. 仮想記憶方式のシステムにおいて、ページフォールト 1 回の処理時間は、ページアウトを伴わない場合が 20 ミリ秒、ページアウトを伴う場合が 60 ミリ秒である。ページフォールト 1 回あたりの平均処理時間が 30 ミリ秒であるとき、ページアウトを伴わないページフォールトの割合はいくらか。
- 0.20
- 0.25
- 0.75
- 0.80
正解: ウ 求める割合を p として加重平均の式を立てると 20p + 60(1 − p) = 30 となり、−40p = −30 から p = 0.75 です。イ はページアウトを伴う割合で、設問が聞いているのは伴わない方です。ア と エ は方程式を解かずに 20 と 60、30 と 60 の比から作った値で、加重平均の関係を満たしません。
Q2. ページング方式の仮想記憶において、LRU 方式で置換えの対象となるページはどれか。
- 主記憶に読み込まれてから最も時間が経過したページ
- 参照された回数が最も少ないページ
- 参照された回数が最も多いページ
- 最後に参照されてから最も時間が経過したページ
正解: エ LRU(Least Recently Used)は最終参照時刻が最も古いページを追い出します。ア は読込み時刻を基準にする FIFO の説明、イ は参照回数を基準にする LFU の説明です。ウ は最もよく使われているページであり、追い出せば直後に再びフォールトするので置換え対象として不適切です。
Q3. 一つのシリアルバスに接続された 2 個のセンサから、複数のタスクが値を読み出す。読出し処理が互いに重ならないようにするために使用する OS の機能はどれか。
- インターバルタイマ
- セマフォ
- スプーリング
- メッセージキュー
正解: イ 共有資源を同時に 1 つのタスクしか使えないようにする排他制御の機能がセマフォです。ア は一定時間ごとに割込みを発生させる機能で、排他は保証できません。ウ は低速な出力装置への出力を一時的に磁気ディスクへためる仕組みです。エ はタスク間でデータを受け渡す同期の手段であり、バスの占有そのものを制御する機能ではありません。
Q4. 二つの資源 X と Y を排他的に使用する二つのタスクがある。デッドロックの発生を防ぐ方法として適切なものはどれか。
- どちらのタスクも X、Y の順に資源を獲得する
- 一方のタスクの優先度を高くする
- 一方のタスクだけ Y、X の順に資源を獲得する
- 資源の獲得待ちが一定時間を超えたタスクを打ち切る
正解: ア 獲得順序をそろえると、先に X を取れたタスクが Y も取れるため循環待ちが成立しません。イ は優先度が高くても相手が持つ資源が空くまで待つので、循環待ちは解消しません。ウ は循環待ちを作る条件そのものです。エ はデッドロックの検出と回復の手段であり、発生自体を防ぐ方法ではありません。
Q5. 実行状態のタスクが、より優先度の高いタスクの出現によって CPU を横取りされたとき、遷移する先の状態はどれか。
- 休止状態
- 待ち状態
- 実行可能状態
- 実行状態のまま変わらない
正解: ウ 横取りされたタスクは CPU さえ割り当てられればすぐ動けるので、実行可能状態の待ち行列に並び直します。イ は入出力の完了など外部の事象を待つ状態で、自分から CPU を手放したときに入ります。ア は生成前と消滅後の状態です。エ は CPU を奪われている以上、成り立ちません。
Q6. 仮想記憶方式のシステムで多重度を上げすぎたとき、ページの置換えが多発してシステムの処理能力が急激に低下する現象はどれか。
- オーバーレイ
- フラグメンテーション
- スワッピング
- スラッシング
正解: エ スラッシングは、実記憶が不足してページの入替えに CPU 時間が費やされ、スループットが急落する現象です。ア は同時に使わないモジュールを同じ領域に上書きしながら実行する手法、イ は実記憶の空き領域が細切れになる現象で仮想記憶の話ではありません。ウ はプログラム単位で主記憶と補助記憶を出し入れする仕組みで、それ自体は異常な状態を指しません。
Q7. 主記憶管理におけるガーベジコレクションの説明として適切なものはどれか。
- 動的に確保され、参照されなくなったヒープ領域を回収して再び割当て可能にする
- 使用中の領域を移動して、細切れになった空き領域を一つにまとめる
- 実行中でないプログラムを主記憶から補助記憶へ退避する
- 関数の戻り番地や局所変数を後入れ先出しで管理する
正解: ア ガーベジコレクションはヒープの回収機能です。イ はメモリコンパクション、ウ はスワップアウト(ロールアウト)の説明です。エ はスタックの説明で、スタックは呼出しが戻れば自動的に解放されるため回収の対象になりません。
Q8. A 社が自社で開発したソフトウェアを、B 社に有償で使用許諾しようとしている。使用許諾に関する記述として適切なものはどれか。
- 特許を取得していなければ、他社に使用許諾できない
- 著作権の登録をしていなければ、他社に使用許諾できない
- 特許技術を使用していなくても、他社に使用許諾できる
- ソースコードを開示しなければ、他社に使用許諾できない
正解: ウ ソフトウェアの著作権は創作した時点で発生し、著作権者は自らの判断で使用を許諾できます。ア は特許の有無と使用許諾は無関係なので誤りです。イ は登録が権利発生の要件ではないため誤りです。エ は許諾の条件を契約で自由に定められるので、ソースコードの開示は必須ではありません。
Q9. タスク A(到着 0 秒・処理 6 秒)、B(到着 1 秒・処理 3 秒)、C(到着 2 秒・処理 2 秒)を、タイムクウォンタム 2 秒のラウンドロビンで実行する。到着したタスクは実行可能待ち行列の最後尾に入り、タイムクウォンタムを使い切ったタスクはさらにその後ろに回るとき、タスク C が終了するのは何秒後か。
- 4
- 6
- 8
- 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 のターンアラウンドタイムは何秒か。
- 3
- 8
- 10
- 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 バイトの領域を要求したとき、ベストフィット方式が選ぶ空き領域と、この方式の特徴の組合せとして適切なものはどれか。
- 30K バイト/先頭から順に探索するので割当てが速い
- 50K バイト/割当て後に残る空きが大きく、再利用しやすい
- 30K バイト/要求を満たす最小の空き領域を選ぶ
- 20K バイト/利用しにくい小さな空き領域が多数残りやすい
正解: エ ベストフィットは要求を満たす最小の空き領域を選ぶので 20K バイトが割り当てられ、4K バイトという使い道の乏しい断片が残ります。ア はファーストフィット、イ はワーストフィットの説明です。ウ は選び方の説明自体は正しいものの、その基準で選ばれるのは 20K バイトなので、領域との組合せが誤りです。
Q12. OSS のライセンスに関する記述のうち、GPL の説明として適切なものはどれか。
- GPL のコードを組み込んだプログラムを配布する場合、そのプログラム全体を GPL でソースコード付きで配布しなければならない
- 改変したファイルだけを公開すればよく、同時に配布する他のファイルは非公開にできる
- 著作権表示と免責条項を残せば、ソースコードを公開せずに製品へ組み込める
- 商用利用が禁止されており、無償で配布する場合に限って利用できる
正解: ア GPL は強いコピーレフトをもち、派生物全体に同じライセンスの適用を求めます。イ は改変ファイル単位で公開すればよい MPL の説明、ウ は BSDL や MIT ライセンスの説明です。エ は「利用する分野に対する差別の禁止」という OSS の定義に反するので、どの OSS ライセンスにも当てはまりません。
Q13. 複数の目的プログラムやライブラリを結合して、一つのロードモジュールを作成するプログラムはどれか。
- ローダ
- リンカ
- コンパイラ
- アセンブラ
正解: イ リンカ(リンケージエディタ)が目的プログラムとライブラリを結合してロードモジュールを作ります。ア はできあがったロードモジュールを主記憶へ読み込むプログラムです。ウ は原始プログラムを目的プログラムへ翻訳するプログラム、エ はアセンブリ言語を機械語へ変換するプログラムで、いずれも結合は行いません。
Q14. 短いタスクが次々と到着し続ける環境において、処理時間の長い特定のタスクが CPU の割当てを受けられないまま待たされ続けるおそれが最も大きいスケジューリング方式はどれか。
- 処理予定時間が最短のタスクから順に実行する方式
- 到着した順にタスクを実行する方式
- 待ち時間が長くなったタスクの優先度を上げていく優先度方式
- 一定時間ごとにタスクを切り替えて順番に巡回する方式
正解: ア 処理時間順(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 章の組込みシステム設計につながります。