ソフトウェア科学6 オペレーティングシステムの要約

ソフトウェア科学6 オペレーティングシステムの要約をアウトプットとして残します。（完全自分用）
https://www.amazon.co.jp/岩波講座-ソフトウェア科学%E3%80%88%E3%80%94環境%E3%80%956〉オペレーティングシステム-前川-守/dp/4000103466

<h2>1 オペレーティングシステムとは</h2>
・OSはアプリケーションプログラムやユーザとハードウェアの間に位置する。ユーザーから見ればあたかもOSがCPUであるかのように見える。こうして機能が拡張されたCPUを拡張マシンという。拡張マシンは「仮想マシン」とも言われる。
・OSの目的は以下の通り。拡張マシンを提供すること。リソースを効率よく使用すること。ソフトウェア資源を管理すること。特にユーザーが情報を共同利用することを許すこと。優れたプログラム開発環境を提供すること。統合的なコンピュータ利用環境を提供すること。
・OSはハードウェアとアプリケーションプログラム（応用プログラム）の間のインタフェースであると言える。
・分散処理は、基本的には自分のCPUで処理して、処理しきれないものはネットワークを通じてより大型のコンピュターに処理してもらうみたいな処理の仕方。
・マルチプロセッサ方式はマルチプログラミング方式においてCPUを複数台備えたシステム。CPUの数だけプログラムが実際に実行される。
・ジョブ（タスク）を処理する方式には以下のようなものがある。
バッチ処理方式：ジョブをコンピュータセンタに送り、コンピュターセンタはジョブを一定期間まとめておき、一括処理する。ユーザに結果が戻るまでの時間は長いが、CPUの利用効率は早い。財務管理や科学技術計算で用いられる。https://qiita.com/koduki/items/e90ee1fea5aa75071d95
オンライン/リアルタイム処理：座席予約システムのように、要求が発生した時点で直ちに処理する方式。処理する内容が予め決まっていることが多く、入力データによってその中の一つが選択され実行される感じ。大容量で高速のランダムアクセスファイルを使用。https://e-words.jp/w/ランダムアクセス.html
タイムシェアリング処理：コンピュータに多数の端末を接続し、ユーザーは端末からコンピュータを利用し共用する。CPUは短い時間でユーザーを切り替えてサービスを提供。研究所などでの共用利用などで使用。
分散処理：複数のコンピュータを対等に結合し互いに情報をやりとりするようなシステムを「コンピューターネットワーク」という。コンピューターネットワークを用いて複数のコンピューターを利用する方式を分散処理という。コンピューターネットワークには広域ネットワークとローカルエリアネットワーク（LAN）がある。コンピューター間で通信不良が起きても、ネットワーク内の他のコンピュータに繋げば問題が起きないというメリットがある。
・仮想化とは必要な数だけのリソースを仮想的に作り出すこと。もしくは<strong>ユーザーに仮想的に作り出すリソースはその過程において、ハードウェアと全く同じものではなく、ユーザーにとってより使いやすいものに変換すること。（2次記憶のファイルとか）</strong>時間を区切ってリソースを割り当てる「時分割」と領域を区切ってユーザーにリソースを割り当てる「領域分割」がある。
・CPUの仮想化はCPUスケジュラが行う。CPUの多重化は時分割によって行う。主記憶の仮想化は主記憶管理プログラムが行う。領域分割と時分割の両方で用いる。時分割の主たる手段はページングとセグメンテーションである。二次記憶（時期ディスクなど）の仮想化はファイルシステムが行う。仮想的に作られるリソースはファイルと呼ばれ、ハードウェアの２次記憶よりも使いやすいものになっている。（管理すべき領域が膨大であるため 主記憶におけるアドレスのような仕組みだけでは 管理しにくい）7章で解説。入出力機器の仮想化は限定的。
・集中型と分散型システムでは、OSの考え方が全く異なる。
・OSの定義とは「ハードウェア資源であるCPU、主記憶、２次記憶、入出力機器をユーザーが必要とするだけ仮想的に作り出し、場合によってはそれらをハードウェアそのものよりも使いやすい形で提供すること」

<h2>2 CPUスケジュリング</h2>
・CPUのタスクの切り替えを行うのをCPUスケジュリングといい、それを行うプログラムをCPUスケジュラ、またはディスパッチャという。
・プロセス（タスク）は下の3状態を移行する。実行中。実行可能中（CPUが割り当てられればすぐプログラムを実行できる）。待ち状態（要求している資源（入出力機器）などが開くのを待っている、メッセージの到着を待っているなど、なんらかの待ち状態にあり、CPUを必要としてない状態）
・プロセスはより優先度の高いジョブに割り込まれたり、自分に割り当てられた時間が終了した時に実行状態から実行可能状態に戻る。
・WAIT命令（ある条件が成立するまで待機することを指示する命令）を実行することによって、実行状態から待ち状態に移行する。
・SIGNAL命令によって待ち状態から実行可能状態に移行する。
・プロセスは3つのプロセス状態（実行中、実行可能、待ち状態）に対応する三つの列のいずれかに入っている。
・プロセスの切り替え方式には以下の2つがある。
イベントドリブン：システムの状態に変化が生じたときにCPUを別のプロセスに切り替える方式。状態変化をイベントといい、入出力の完了、入出力要求の発生、新しいジョブの到着などがある。割り込み機構によってプロセスの切り替えが行われる。一般に割り込まれたプログラムは割り込まれた事実を感知しない。
タイムスライシング：システムの状態変化とは無関係に周期的にプログラムを切り替える方式。この方式はタイムシェアリングシステムの基本となっている。割り当てられた時間が終了したら割り込みを生じさせるインタバルタイマを使う。
・マルチプログラミングの実現はイベントドリブン方式でのみ可能。一方タイムシェアリングの実現にはタイムスライシングの機能が必要。多くのシステムはマルチプログラミングとタイムシェアリングの両方のサービスを備えており、イベントドリブン方式とタイムスライシング方式の両方を組み合わせて使っている。また両方を組み合わせることでお互いの性能を向上させることが可能。
・プロセスが入出力を要求するためにシステムを呼び出したり、割り込みが発生したりすると制御は割り込み処理ルーチンへ移される。割り込みが生じた際はプログラムカウンタの内容を保存することで、プロセスの再続行地点が保存される。また割り込みの種類ごとにその割り込みを許可するかどうかを選択できる。また割り込みが生じた時は割り込みの理由を保存する。
・割り込み処理ルーチンは割り込みの種類を分析して、要求されたサービスを行う。その後CPUスケジュラは次に実行するべきプロセスを選択する。
・割り込みの種類は以下の通り
スーパバイザコール割り込み：OSを呼び出すためにプログラムが意図的に呼び出す割り込み。https://ja.wikipedia.org/wiki/システムコール
入出力割り込み：入出力が完了したときに入出力チャネルから発生させられる。
プログラムチェク割り込み：セロによる除算などプログラム上の様々なエラーにより生じる。
マシンチェク割り込み：ハードウェアの障害により生じる。
外部割り込み：インタバルタイマの終了や他のプログラムからの信号などにより生じる。
リスタート割り込み：OSがリスタートボタンを押した時などに生じる。
・プログラムを実行するのに最も重要で頻繁に参照されたり変更されたりする情報は、PCBと呼ばれる主記憶内のデータ構造に保存される。PCBにはCPUレジスタの内容や割り込み禁止状態、プログラムカウンタの内容、プロセスの優先度などが保存されている。PCBはOSの常駐領域（対義語はユーザ領域）に保存されてる。実行可能列と待ち行列はPCBを待ち行列として管理することで作られる。
・CPUはプロセス間で切り替えられるが、その切り替えの方針がCPUスケジュリング方式である。方針には以下のようなものがある
到着順：ジョブを到着順で処理
処理時間順：処理時間の短いプロセスから処理
優先度順スケジュリング：優先度順
ラウンドロビン：ジョブを短いサイクルで順次繰り返し実行
フィードバック待ち行列orフォアグラウンド・バックグラウンド待ち行列：ジョブを多段のラウドロビン方式で行う
・スケジュリングを議論するにあたって評価基準を決める必要がある。重要な評価基準は応答時間とスループットの二つ。
・応答時間はTSSまたは対話型サービスでは「レスポンスタイム」と表現し、バッチシステムの場合は「ターンアラウンドタイム」という語が用いられる。
・レスポンスタイムは端末のオペレータがコマンドを送ってからCPUから最初の応答を受け取るまでの時間。ターンアラウンドタイムはバッチ処理においてジョブをコンピュータセンタに提出してから結果を受け取るまでの時間。
・スループットは単位時間になされる仕事量。
・応答時間とスループットは相反関係。場合によっては両方とも改善することも可能。
・利用効率を向上させるには、サーバーの空き時間が生じないようにできるだけ多くのジョブを送り込まなければならない。しかし多くのジョブが送り込まれると順番待ちのジョブが増えて応答時間が長くなる。
・処理時間の短い順方式は平均応答時間を最小にする方式として知られている。
・入出力待ちの無駄な時間をうまく管理することで利用効率が改善する。
・一般にマルチプログラミングは利用効率を向上させるのを目標とし、TSSは応答時間を最小にすることを目標とする。
・利用効率と応答時間以外にも以下のような評価基準がある。
予測性：平均としては短いがばらつきの多い応答時間よりも、安定した応答時間を好むユーザもいる。
公平性：あるジョブが無期限に延期されるような不公平な方式は望ましくない。しかし一般にはシステム全体の性能向上と、個々のジョブを公平に扱うのは相反する要求。
グレースフルな終了：システムが過負荷になったときに、突然動かなくなるよりは段階的に性能を落とすべきである。
・ジョブの処理時間をわかっている前提でスケジュリングを組むのは不可能。しかし処理時間の予測を行う方式がいくつか開発されている。これらのことを踏まえて今から議論。
・今からそれぞれのスケジュリング方式の特徴について述べる。
到着順方式：到着順に実行。特徴は公平さと単純さ。応答時間は非常に大きくなるのでTSSには適さない。
処理時間順方式：SPTでは処理時間の短いジョブから実行。平均応答時間を最小にすることが可能p37。利用効率を向上させることも多い。難点は前もって処理時間を知るのが難しいこと。そのためSPTはプリエンプション（実行を一時中断し他のジョブを実行する）と組み合わせると有効。処理時間を前もって知ることはできないが統計的に予測することは可能。一般的に処理の実行が長引くと終了までにかかる時間が長引き、新しいジョブは高確率で処理が終了するので、新しいジョブには高い優先度を与え、ある一定時間処理され尚且つ処理が終わってないものには低い優先度を与えると良い。このようにプリエンプションはいくつかの利点を有しているが、CPUの場合プロセスの切り替えにはレジスタの内容の保存といったオーバヘッドが伴うデメリットがある。
優先度順スケジュリング方式：各プロセスに優先度を与え、その順に実行する。優先度の与え方としてよく使われる方式は、リアルタイムプロセスに1番高い優先度を割り当て、次にOSのプロセス、次に対話型ジョブのプロセス、最後にバッチジョブの順に優先度を割り当てるもの。SPTは処理時間の短いジョブに高い優先度を与えるから、一種の優先度順スケジュリング方式と言える。優先度の低いジョブはサービスの順番が中々回ってこない状態に陥ることがある。対策としては「エージング」といってジョブの待ち時間の長さに比例して優先度を上げるものである。
ラウンドロビン方式：実行可能列の最初のプロセスにq秒のクオンタムを割り当てて、そのプロセスがq秒以内に終了しないとそれはディスパッチャによって実行可能列の最後に割り当てられる。対話型ジョブの応答時間を短くするために開発された方式で、クオンタイムの大きさを適切に選べば適度な応答時間を保障することができる。
フィードバック待ち行列：多段のラウンドロビン方式。新しく到着したプロセスは優先度の最も高い待ち行列に追加され、処理が終了せずに中断したプロセスは次に高い優先度を待ち行列に追加される。i番目の待ち行列はそれより高い優先度の行列が全て空きになったときに実行される。これは処理時間による優先度をラウンドロビンよりもさらに強調する方式である。なおスタベーションの問題が当然生じるのでエージングなどで解決する。ラウンドロビンもフィードバック待ち行列は共に、TSSのみならずマルチプログラミングシステムでも有効。
入出力ジョブ優先方式：あるCPU処理が非常に長くかかり他のジョブがサービスを受けられない状態というのが生じるのを防止する方法の一つが、短いCPU処理を有するジョブ、すなわち入出力割合が多いジョブ（入出力待ちではCPU処理を必要としないから）を優先して実行することである。入出力ジョブを優先する理由には他にも、入出力ジョブの多くはユーザーのジョブを準備することであるから、これらのジョブを優先して実行する必要があるといったものがある。
・プロセスはCPU処理と入出力処理が交互に連続する列と見なすことができる。

<h2>3 平行プロセス</h2>
・プロセスが同時実行されると、色々な点で相互に作用し干渉しあう。プロセス間の相互干渉は3種類に分類できる。「協調」は複数のプロセスが互いに協調して情報交換をしながら共通の目的のために処理をするもので、互いに他のプロセスを必要とする場合。「競合」はリソースを取り合うなど、互いに他のプロセスの存在を意識しないといけないが、自分自身の処理のためにはそれらは不要な場合。「干渉」は相手のプロセスの中断などはっきりと他のプロセスに影響を与える場合。
プロセスの競合：ほぼ同時に同じリソースに書き込みをしたりすると、正確な値が算出されなくなる可能性があるから、共通変数へのアクセスを同時には一つのプログラムに限ることを相互排除または排他制御という。
プロセスの協調：プロセス間でメッセージを交換したりする場合
プロセスの干渉：主記憶の空き領域を確保するために他のプロセスの実行を止める場合など。一時停止されたプロセスは一時停止されたことを知らない。
・排他制御を実現する方法はハードウェアに依存するが、基本的な考え方の一つは誰かがクリティカルセクション（コンピュータ上において、単一の計算資源（リソース）に対して、複数の処理が同時期に実行されると、破綻をきたす部分）に入っているというフラグを設けること。ただこの方式でも結局はフラグの上げ下げをどうやって排他的にやるかという問題がある。
・主に利用される排他制御のやり方は
ユニプロセッサシステムの場合：単一CPUではプログラムの実行が中断されるのは割り込みが生じた時だけである。従ってクリティカルセクションを割り込み禁止にすることで排他制御を実現できる。
マルチプロセッサシステムの場合：一つのCPUだけがあるメモリへのアクセスをできるようにフラグを使って設定すれば良いp59 https://ja.wikipedia.org/wiki/排他制御　クリティカルセクションに入る前に割り込みを禁止する設定をする。なぜなら禁止しないと、クリティカルセクションに入った状態であるタスクが割り込まれてその実行を中断させられた場合、他のタスクがクリティカルセクションにずっとアクセスできなくなるから。（疑似デッドロック）（クリティカルセクションにアクセスできるタスクは一つ）
・上記で説明した排他制御の方式は現実のシステムに適応するには原始的すぎる。また排他制御はビジウェイティング（プロセスがクリティカルセクションに入れない時に、入れるようになるまでループを実行して待つこと。CPUの無駄使い）を用いているので、ごく短いクリティカルセクションへの利用に限定されるべきである。より一般的な排他制御の方法としてセマフォアを導入する。https://ja.wikipedia.org/wiki/セマフォ
・セマフォア自身へのアクセスも排他制御される必要がある。セマフォアは一般にイベント変数と呼ばれる変数の一種である。イベント変数はイベントの履歴を記録するデータ構造部分と、イベント変数の待ち条件が満たされるのを待っているプロセスの待ち行列の2つからなる。
・セマフォアはP命令（wait命令）とV命令（signal命令）で成り立つ。
・プロデューサー/コンシューマ問題　https://docs.oracle.com/cd/E19455-01/806-2732/sync-31/index.html
・リーダ/ライタ問題　p70
・セマフォアと異なる排他制御の機構として、シーケンサとイベントカウンタに対する操作がある。シーケンサのイメージは整理券である。サービスする側はサービス終了した客の番号札を積み上げており、その1番上の札が現在サービス中の客の番号札である。この番号を記憶しているのがイベントカウンタ。
・シーケンサSに対してはticket(s)という操作のみが許されている。ticket(s)は現在のSの値を返すとともにSを一増加させる操作である。このticket操作は新しい客が番号札をもらうの行為に対応する。
・イベントカウントEに対してはadvance(E),await(E,v),read(E)の3個の操作が許される。advace操作はサービスの完了に対応し、イベントカウンタを１増加させ、次の客を受け入れる。awaitは客が待合室でサービスの順番を待つのに対応する。read操作はイベントカウンタの現在の値を調べるためのもの。これはプロセスが自分の順番がすぐ来るかを調べるのに用いる。もしすぐ来ないならプロセスは順番が来るまで何か他のことをできる。
・イベントカウントを操作する命令、advance,await,readに対してはこれらが同時に同じイベントカウントに処理を行っても矛盾なく動作するように作成できる(0,1を書き込むんじゃなくて+1をするだけだから？)。一方シーケンサに対するticket(s)の実現には排他制御が必要。
・入出力チャネルとCPUの間の同期は最も一般的なプロセス同期問題である。
・入出力機器はたまに入出力動作の完了を知らせる割り込み信号を送ることを失敗することがある。このエラーが生じた時にCPUが永遠に完了信号を待つことがないように、インタバルタイマを設定し、割り込み信号が一定時間こない時はインタバルタイマによって起動されるようにする。
・プロセスのマルチプレクシング（多重化）は利用効率向上のために行われる。例えばTSSで、多数の端末のそれぞれにプロセスを割り当てるのは簡単だが、システムにあまりにも多くのプロセスが存在することになり実際的な方法とは言い難い。より現実的な方法としては全端末に対して一個のプロセスを割り当て、そのプロセスをマルチプレクシングすること。多重化はwait_or命令で実現できる。

<h2>4 コンカレントプログラミング</h2>
・セマフォはアセンブリ言語レベル。モニタはより次元の高いもの。セマフォの上位互換がモニタみたいな感じ。
・コンカレントプログラミング＝並列処理
・オブジェクトモデルは情報処理、特に並列処理において有効な概念。基本的な概念は現実の世界において存在する物、あるいは要素を抽象化し、それらの間の相互干渉としてモデルを記述する方式。プログラミング言語においてはクラスの概念まで遡ることができる。
・抽象化によってユーザは必要最低限の機能だけを使うことができる。
・オブジェクトモデルにおけるオブジェクトは次の性質を有する。オブジェクトのユーザはオブジェクトに備えられた操作のみを行うことができる。オブジェクトに備えられた操作がオブジェクトの振る舞いを定めることになる。ユーザはオブジェクトを破壊することはできない。なぜならユーザがオブジェクトの内部構造にアクセスする方法は存在しないから。
・プログラムには同じであるかまたは似ているオブジェクトがたくさん現れる。それらは同じような操作を備えている。この場合これら一連の操作を一まとめにして定義しておくと便利である。同じ一連の操作を共有するオブジェクトを同一タイプ（クラス）であるという。そして特定のオブジェクトをそのタイプのインスタンスという。https://www.youtube.com/watch?v=bagC84R2gPk
・モニタはオブジェクトモデルの一つの実現方法。主に集中型システムのリソース管理に使われる。
・モニタはリソースをしまっている箱のような物であり、一定の手順を経ないとそのリソースを使うことはできない。p128。モニタにはリソース、ローカルデータ、スケジュラ、プロセデュア、待ち行列などが含まれている。
・ローカルデータはリソースの状態を保持している変数で、スケジュラとプロセデュアによってモニタ内で用いられる。スケジュラはあらかじめ定められた方式に従ってリソースをスケジュールする物である。待ち行列はプロセデュアの中で待ち条件が成立しなかった時に使われる。プロセデュアはプロセスがリソースを確保したり開放したりするためのもの。
・モニタの基本的機能の一つはモニタ内で同時に動作できるプロセスを一個に限定することができること。
・モニタのプロセデュアはどのプロセスからも呼ぶことができる。しかし同時には1個のプロセスしかプロセデュアを実行できないように制限されている。これによりモニタのローカル変数の一貫性が保たれる。
・モニタの目的はリソースの管理と割り当てを円滑に記述するための機構を提供すること。http://www.matlab.nitech.ac.jp/~matsuo/OS/OS06.pdf
・モニタはwaitとsignalの2つの命令を備えている。
・OSのような大規模システムの構築には、階層構造の導入が不要である。この場合モニタは別のモニタのプロセデュアを呼び、それはまた別のモニタのプロセデュアを呼ぶという形を取るためデッドロックの可能性がある。p145
・モニタは集中型システムで広く用いられている。
・並列処理プログラミングの必要条件と制約で重要なものは以下の通り。
集中型・分散型システムへの抵抗可能性：集中型システムと分散型システムは今後統一されていくと思われるので、同じサイトのプロセスに対しても、リモートなプロセスに対しても同一のプロセス統合機構で対処できることが望ましい。
表現能力：プロセス間の相互干渉は協調、競合、干渉に分類できるが、プロセス統合機構はこれら全ての相互干渉を記述できるべきである。一般に協調はメッセージか信号の交換の形で表され、競合は一般的に再利用型リソース（記憶領域など）の獲得競争の形で表される。
モジュール性：以下の直交する二つのモジュール化基準を考えないといけない。リソースはにはリソース自身以外にもプロセス統合機構、スケジュリング機構などが含まれており、リソース自身がモジュールに分割できる必要がある。一方リソースモジュールを構成する各要素はデッドロックやスケジュリングのようにシステム全体に及ぶ制御を受ける必要がある。
使いやすさ：それぞれのプロセス統合問題を独立して考えることができると使いやすい。あるプロセス統合問題の条件が他のプロセス統合問題にも影響を与えると解の構築が難しくなる。
プログラム構造との関連：高レベルのプロセス統合機構の場合にはその機構と親言語の親和性が重要な問題になる。
プロセスの故障とタイムアウト：プロセス統合機構は一つのプロセスの故障が他のプロセスに波及しないようにするべき。

<h2>5 主記憶の管理</h2>
・理想的な仮想アドレス空間が備えているべき性質は以下の通り。
プロセス、プロセデュア、データ構造などに対して必要となる空間を、任意の場所に任意の時点で作成・削除できる。
各空間を随時に拡大・縮小できる。
各空間をプロセス間で共有することができる。
各空間の大きさには制限がない。
・ネーミング関数はユーザが定義した名前をユニークな論理アドレスに対応づける関数。
・ネーミング関数はコンパイラで実現され、メモリ関数はOSで実行されるものと考えられている。
・メモリ上でプログラム用に領域を確保する方法には、ファーストフィット（プログラムを、プログラムを格納するのに十分な大きさの最初の空き領域に割り当てる）、ベストフィット（プログラムを、プログラムを確保するのに十分な大きさの最小の領域に割り当てる）、ブロックを1番大きな空き領域に割り当てる。
・ワーストフィット方式は、3つの中で最もパフォーマンスが悪い。
・ファーストフィット方式は一般にアドレスの低い空きブロックをより高い頻度で使うという特徴を持つ。そのため高いアドレス領域に大きな空きブロックを残すことになり、大きな空きブロックが比較的残りやすいというメリットがある。
・ベストフィット方式は、空きブロックのなかで条件を満たす最小のものを割り当てるので、大きな空きブロックを壊さないというメリットがある。
・メモリフラグメンテーションを解決する方法として、実行中のジョブを移動する機能を動的再配置という。
・銅的再配置では、主記憶領域が小さな空き領域に分割されるのを防ぐため、スワップアウトされたプログラムを前とは異なる場所に入れることもできる。
・空き領域を集めて一つの連続した空き領域を作る（メモリコンパクション）際には、移動されるプログラムの全ての入出力を止める必要がある。
・プロセスが共用プロセデュアを利用する場合には、ページング処理を行う際は、その共用ページにアクセスするプログラムの数とかを記憶しておかないといけない。
・主記憶の仮想化の歴史は下限レジスタ→ロック/キー→リロケーションレジスタ→ページング→セグメンテーション→ページングとセグメンテーションの順で発展してきた。

<h2>6 仮想記憶</h2>
・仮想記憶は基本的にページング機構を用いて行う（セグメンテーション機構での仮想化は大変だから）
・主記憶上にページが存在しなくて、ディスクからページを持ってくる必要があることをページフォルトという。
・ページフォルトは処理に時間がかかるので、いかにページフォルトを減らすかが重要。ページフォルトの数はページングポリシ（ページングの際に行われる種々の決定事項の総称）によって大きく変わってくる。
・ページングポリシは以下の3つに分けられる。
フェッチの方式：どのページをいつ主記憶へ移すかを決めるための方式
配置の方式：ページを主記憶のどこへ置くかを決めるための方式
置き換えの方式：空きのページフレームを作るために、主記憶からどのページを退避させるかを決めるための方式。
・フェッチの方式はプリページング（予測ページング）とデマンドページングの二つに分類できる。プリページングはページを前もって、主記憶に入れる方式。これにより実際にアクセスが行われたときにページフォールトは生じず、ページをディスクから取り出すために生じる遅れを避けられる。デマンドページングは実際にページが参照されたときにそのページを主記憶に取り入れる方式。デマンドページングは実際にアクセスが生じた時のみページを取り入れるのでプリページングよりも正確性が高い（無駄なページを取り入れることがない）。
・将来必要となるページを予測するのは難しいため、デマンドページングが現在の主流。デマンドページングとプリページングを組み合わせる方式もある。
・ページの配置方式に関してはページフレームは全て同じ特性をもっているのでどのページフレームを選んでも構わない。これはセグメンテーションと対照的。
・時間的局所性とは短い時間で見たときにある一部のページにアクセスが集中すること。空間的局所性とは主記憶上の隣接した空間にアクセスが集中すること。この特性を活かすにはプリページングが有効。
・マルチプログラミングにおいては、「全体のシステムを向上させるために主記憶にできるだけ多くのジョブを格納する」「ページングのオーバヘッドを最小にするために個々のプログラムにできるだけ多くのページフレームを割り当てる」という相反する要求が発生する。ワーキングセットの概念は主記憶に格納するジョブの最適点を決めるのに役立つ。

<h2>7 ファイルと入出力</h2>
・ディスク記憶装置はディスク上にその回転方向に沿ってデータを記録する装置。回転速度は1分間に3600回程度。https://gigazine.net/news/20151104-how-hard-drive-work/
・二次記憶上に保存される一連のデータをファイルという。ファイルはその大きさが可変。
・本章の主題であるファイルシステムは二次記憶装置と入出力機器を抽象化し、二次仮想アドレス空間と仮想入出力機器を作ること。
・仮想アドレス空間はプロセスが動作中の間のみ存在するが、二次仮想アドレス空間はプロセス終了後も存在し続ける。
・ユーザが名前を定義→全システムでユニークな名前に変換→全システムでユニークな物理的記憶位置に変換という流れをとる。
・一つのファイルは一人のユーザにしか所属できないので。他のユーザと共有するときはリンクと呼ばれるパスを許す。
・ファイルはプロセスの有無に関わらず存在するため、そのファイルの記憶位置、名前といった特性をディスクに保存しないといけない。保存する場所をファイルディスクリプタという。