Q1.ブートストラップはどのようにして行われるのですか?

Q2.メモリの保護の具体的な方法はどのようなものですか?

Q3.複数のプログラムが1つの入出力装置を要求したらどうなるのですか?

Q4.ユーザインタフェースとOSの関係はどのようになっていますか?

Q5.特権状態とはどのような状態ですか?

Q6.統計情報や資源の利用率には具体的にどのようなものがありますか?

Q7.割込みの目的は何ですか?

Q8.OSのユーザインタフェースとプログラムとのインタフェースはどのような関係にあるのですか?

Q9.システムコールとAPIの違いは何ですか?

Q10.アプリケーションプログラムを作成する場合、直接システムコール関数を使う必要があるのはどういう場合ですか?

Q11.カーネルからアプリケーションプログラムに戻るためのCPUの特権命令はどのようなものですか?

Q12.OSのオーバヘッドとは何ですか?

Q13.割込みはいつでも起きるのですか?カーネル実行中にも起きるのですか?

Q14.ディスパッチャ(スケジューラ)はどのような動きをするのでしょうか?

Q15.CD-Rと磁気ディスク、LBAなどの関係はどのようなものですか?

Q16.磁気ディスクとCD-Rの違いは何ですか?

Q17.ブロッキングはアプリケーションが行わなければならないのですか?

Q18.キャッシュ領域の空きを探す方法にはどのようなアルゴリズムがあるのですか?

Q19.順編成ファイルと直接編成ファイルの構造上の違いはどこにあるのですか?

Q20.UNIXのファイルでのファイル編成やレコードの概念はどのようになっているのですか?

Q21.UNIXのファイル記述子というのは何ですか?

Q22.システムコールのcreatはミススペルではないのでしょうか。

Q23.仲間(グループ)の構成メンバはどのようにして定義するのですか?

Q24.なぜUNIXは最初から非同期入出力ではなかったのですか?

Q25.応答時間とはどのようなものですか?

Q26.実際のプロセススケージューリングはどのようになっていますか?

Q27.優先順位法で、プロセスへの優先度の与え方はどのように行うのですか?

Q28.タイムスライスの大きさはどのぐらいの値ですか?

Q29.スレッドとプロセスの関係を教えてください。

Q30.共用メモリを用いれば事象の連絡ができるのではありませんか?

Q31.共用メモリを用いればプロセス間の通信ができるのではありませんか?

Q32.パイプのread、writeと、ファイル管理のread、writeとは、同じ使い方でよいのですか?

Q33.排他制御とクリティカルセクションの関係を教えてください。

Q34.OS内部の処理でも排他制御が必要ですか? また、必要な場合、どのように行っていますか?

Q35.セグメント間の保護機構とはどのようなものですか?

Q36.なぜスタックとヒープがあるのでしょうか(1種類ではダメな理由は何ですか)?

Q37.パーティションの保護機構にはどのようなものがありますか?

Q38.具体的なページサイズにはどのようなものがあるのですか?

Q39.ページ化によりプロセス内の無駄領域はどのように減るのですか?

Q40.アドレス変換テーブルは64ビットマシンでは巨大になると思われますが、工夫はあるのですか?

Q41.動的アドレス変換の高速化の手法はありますか?

Q42.オンデマンドページングは一ページ単位に割り付けるのでオーバヘッドが問題にならないのですか?

Q43.ページングファイルやスワッピングファイルに、最初にプログラムやデータが格納されるのはいつですか?

Q44.UICはどこにあり、どのぐらいのビット数なのですか?

Q45.LRU以外のページ置換えアルゴリズムにはどのようなものがありますか?

Q1
ブートストラップはどのようにして行われるのですか?


A1
電源が投入されると、指定された外部入出力装置から特定の領域に対する入力操作が行われるのが一般的です。指定された装置の指定は、管理者が行います。例として、PC/AT互換機では、BIOSによる指定を行います。パソコンなどでは、磁気ティスクやCD-ROMなどが指定可能であり、複数の装置を指定できたり、ブートする順序を指定したりできます。読み込まれる特定の領域は、多くの場合、その装置の先頭のブロックで、たとえば、1セクタが読み込まれます。読み込まれる主記憶のアドレスはそれぞれのマシンで決まっています。読込みが完了すると、CPUは読み込んだデータの先頭から命令を実行します。したがって、ブートプログラムの作成では、これらのことをすべて理解してプログラミングしておく必要があります。

Q2
メモリの保護の具体的な方法はどのようなものですか?


A2
最近のコンピュータは仮想記憶を提供しているのが一般的です。これを前提に説明します。仮想記憶は多くのコンピュータで、ページ化されたメモリを使用しています。したがって、ページ単位の記憶保護が一般的になっています。各々の実ページに対して、読込み、書込み、命令実行の3種類の記憶保護がなされているのが理想的です。コンピュータによっては、この一部しか備わっていないものもあります。しかし、書込みに関する保護は最も基本的な保護機能のため、この機能の無いコンピュータは稀です。この3つの保護機能は実ページに付けられた属性です。第二の保護機能は、メモリに鍵(ロック)をかけておく方法です。命令実行は、命令実行器がキーを持ってメモリにアクセスします。命令実行でメモリの内容を読むとき、このキーとロックが一致しているか、あるいは、キーがロックよりも権限が大きいか、等がチェックされます。第三の記憶保護機能は、多重仮想記憶による方法です。この方法は、プロセスのアドレス空間を隔離することで他のプロセス空間からの侵害をハードウェア的に防ぎます。しかし、同一アドレス空間内の記憶保護は、別の問題であるため、先に説明したいずれかの保護機構と組み合わせなければなりません。

Q3
複数のプログラムが1つの入出力装置を要求したらどうなるのですか?


A3
このような状況は不特定多数のユーザが同時にコンピュータを利用するサーバには常に起り得ます。一度に複数の入出力処理はできないため、入出力要求は一旦、待ち行列に入れておきます。装置を直接制御するプログラムはOSの基本機能であり、デバイスドライバと言います。デバイスドライバは、割込みによって入出力要求の処理の完了を知らされます。このとき、当該装置に待ち状態の入出力要求があるならば、直ちに装置を起動します。このように待ち行列に複数の要求を蓄えることができると、デバイスドライバは処理する順番を選択可能です。一般的に、優先度の高い要求を先に処理します。このような機能を入出力スケジュールと呼び、サポートしているOSもあります。

Q4
ユーザインタフェースとOSの関係はどのようになっていますか?


A4
歴史的な観点から見たユーザインタフェースはバッチ処理におけるJCL(Job Control Language)です。利用者の課金番号、使用するメモリ量、ファイル名やその属性、実行するプログラム、などをカードに穿孔してOSに知らせていました。これらの情報は、カーネルがプロセスを生成するにあたり、資源量を知る手段であり、ひとつの仕事(ジョブ)を実行する前処理です。つまり、OSの中核であるカーネルの外側にある世話役的な機能を果たしています。TSSの時代になり、対話型で非定型な仕事を行う作業では、その時々のユーザの要求を行う必要性から、文字列によるコマンドが考案されました。コマンドはコンピュータに習熟した人間には便利ですが、一般のユーザにコンピュータを使ってもらうには問題があります。そこで、アイコンをディスプレイに表示し、マウスなどのポインティングデバイスにより、クリック操作でコンピュータを使用できるGUIが考案されたわけです。これは、画期的なアイデアでした。

Q5
特権状態とはどのような状態ですか?


A5
CPUには二つの状態(モード)があります。一つは非特権状態であり、他は特権状態です。特権状態では、そのコンピュータに備わったすべての命令が実行可能となります。しかし、非特権状態では、一部の命令は実行できません。この一部の命令を特権命令と言います。代表的な特権命令は、外部記憶を起動する入出力命令です。また、メモリなどの操作では、記憶保護のためのストレージキーの書換えや、仮想記憶管理で重要な実ページの参照ビットや変更ビットのリセット命令、などがあります。さらに、CPUの状態を変更する命令として、特権状態から非特権状態に切り替えたり、CPUのメモリアドレッシングにDATを使って仮想記憶モードで実行したり、割込み禁止状態にしたり、などがあります。さらに、コンピュータが実行する仕事が無くなったとき、命令を実行しない、つまり、命令フェッチを停止する命令も特権命令です。以上で説明したようにこれらの特権命令は、コンピュータシステム全体の資源に対する操作を行う重要な機能です。したがって、OSが特権状態を得て、使用しなければなりません。

Q6
統計情報や資源の利用率には具体的にどのようなものがありますか?


A6
コンピュータの管理者は、性能や信頼性に責任を持っています。したがって、そのために必要な情報を入手し、情報を分析し、意思決定する必要があります。資源の利用に関する情報として一般的なものは、資源の3要素である、CPU、入出力装置、メモリなどの利用率です。これらは、一般的に、変化しています。たとえば、銀行のシステムならば、賞与や給与支払いのあった次の日、お盆休み前、年末など、特定の日や特定の時間帯などがピーク負荷になると想像できます。システム管理者は、ピーク時の負荷をOSから得、それを蓄積し、分析することにより、システムのボトルネックとなっている資源が何かを分析することが可能です。また、OSが記録した障害のログ情報なども、定期的に分析し、信頼性の保証をしなければなりません。

Q7
割込みの目的は何ですか?


A7
割込みの目的は、コンピュータ資源を遊ばせないことです。コンピュータ資源はCPU、メモリ、外部入出力装置(ファイル)です。割込みによって、これらの資源を要求しているプロセスに資源の分配を適切に行い、コンピュータ管理者の要求を満たすことがOSの使命です。このことを理解すれば、割込みの各々を容易に理解できるでしょう。入出力完了割込みは、その装置がデータ転送などの処理を完了したので、OSに必要ならば、その後の指示をして欲しいという意味があります。プログラムが誤って他人の記憶領域を侵害しようとしたなら、割込みが起きます。これは、この誤りを見逃すと、正しい計算(処理)が相互にできなくなるためであり、場合によると、コンピュータシステムダウンにつながり、資源が無駄になるからです。ソフトウェアのバグ検出の割込みにはこの意味があります。資源を無駄にしないためにはタイマによる監視や、時間の管理なども重要です。また割込みには、その優先度を設けることができる特徴もあります。ある割込み処理をしていても、より緊急度の高い処理要求がある場合には、先に発生した割込み処理を一時的に中断し、緊急度の高い割込み処理をしなくてはなりません。したがって、OSは、このような多段の割込み処理が可能になっていなければならないことがあります。一般的に、外部割込みは割込みを可能な状態にしたり、禁止したりできます。このために、割込みマスクの設定機能があり、特権命令で操作可能となっています。

Q8
OSのユーザインタフェースとプログラムとのインタフェースはどのような関係にあるのですか?


A8
OSが資源管理をするためにCPUの特権状態で動く部分はOSの中核部という意味でカーネルと呼ばれます。カーネルの機能を利用するにはシステムコールを使います。すなわち、カーネルはプログラムとのインタフェースだけを持ち、ユーザインタフェースは持ちません。
OSのユーザインタフェースは、非特権モードで動くOSのプログラム(シェルやコマンド処理プログラムなど)が提供しています。それらのプログラムは必要に応じて内部でシステムコールを出して、OSのカーネルの機能を利用します。すなわち、OSのユーザインタフェースは間接的にOSのプログラムとのインタフェースを利用することになります。

Q9
システムコールとAPIの違いは何ですか?


A9
プログラムが動くときはすべて機械語の命令が実行されています。これはアプリケーションプログラムもOSも変わりません。アプリケーションプログラムに提供されているOSの機能も、機械語の命令により利用されます。そして、OSの機能を利用するためにシステムコール(コンピュータによってはスーパバイザコールと呼ぶこともあります)の割込みを起こす命令が用意されています。システムコールは、厳密に言えばOSの機械語レベルの機能、と言うことができます。
プログラマがあるソフトウェアシステムの機能を使ってプログラムを作成するときに、その機能を使いやすい形で提供するものがAPIです。OSのAPIの場合、UNIX系のOSではC言語の関数としてシステムコールの機能を提供しています。プログラマはソースプログラムを作成するとき、これらの関数を使えます。システムコール関数は、システムコール割込みを起こす機械語の命令群を包んだ(ラッピングした)ものです。なお、IBM OS/360およびその後継のOSでは、OS APIはアセンブリ言語のマクロ命令の形で提供されていました。

Q10
アプリケーションプログラムを作成する場合、直接システムコール関数を使う必要があるのはどういう場合ですか?


A10
いくつかの場合があります。第一は、プログラミング言語のライブラリ関数は他のOSとの移植性を保つために機能が限定されていて、必要な機能はシステムコールでしか提供されていない場合です。C言語のライブラリ関数では、OSに強く依存するプロセス管理やネットワーク通信の機能は提供されていません。したがって、多重プロセス構成のプログラムにする場合や、ネットワークで通信を行う場合は、システムコール関数を利用する必要があります。また、入出力装置への入出力を行う場合も、C言語のライブラリ関数では標準的な操作しかできず、装置固有の操作をするにはioctl(I/O Control)システムコールを利用する必要があります。第二は、性能や信頼性の高いプログラムを作成する場合です。たとえばアプリケーションプログラムが、メモリの管理を自分で行ったり、また外部のシグナルを直接受け取って処理したりする場合です。
プログラミング言語の機能の範囲を越えて、システムコール関数を直接使うようなプログラムの作成を、システムプログラミングと言うことがあります。

Q11
カーネルからアプリケーションプログラムに戻るためのCPUの特権命令はどのようなものですか?


A11
この特権命令は、アプリケーションプログラムが前回割り込まれたときのCPU状態の情報(プログラムカウンタの値、その他のCPU状態。それらは割込み時に退避され、OSによってプロセス毎に保存されている)を実際のCPUのレジスタ類に回復することを行います。それにより、アプリケーションプログラムは中断されたところから再開できます。回復されるCPU状態の中には非特権状態もあり、特権状態のカーネルから非特権状態のプロセス実行へと移ることができます。
この命令はインテル系のCPUではIRET(Interrupt Return)です。IBMのメインフレームマシンではLPSW (Load PSW、PSW: Program Status Word)という命令です。

Q12
OSのオーバヘッドとは何ですか?


A12
コンピュータの処理のうちOSの処理の部分をオーバヘッドと呼びます。またその比率のことを指すこともあります。科学技術計算の処理などでは、アプリケーションプログラムはCPUを多量に使い、OSの機能はあまり使わないので、オーバヘッドは小さくなります。オンライン処理などは、磁気ディスクへの入出力などOS機能を頻繁に使うので、OSの処理も頻繁に動き、オーバヘッドは大きくなります。なお、オーバヘッドはコンピュータの利用者にとってムダな処理ではなく、利用者がOSサービスを受けるために必要な処理です。

Q13
割込みはいつでも起きるのですか?カーネル実行中にも起きるのですか?


A13
アプリケーションプログラム実行中は割込みはいつでも起きます。
カーネル実行中に割込みが起きるかどうかはOSによります。割込み原因となる事象が発生しても割込みを起さないようにするCPUの実行モード(割込み禁止モード)があり、モノリシックなカーネルはこのモードで動かすことが普通です。しかし、カーネル内の特定の場所で割込み禁止をいったん解除し、待っていた割込みを許すことにより、システムの応答性を上げることも行われます。さらに、リアルタイム機器制御用のOSでは、特定の種類の割込みはカーネル実行中であっても受け付けて優先的に処理し、リアルタイム性を確保することも行われます。

Q14
ディスパッチャ(スケジューラ)はどのような動きをするのでしょうか?


A14
カーネルで割込み原因に対応した処理が行われた後カーネルから出るときに、その出口で行われる、プロセスの実行に復帰するための処理をディスパッチャ(またはスケジューラ)と呼びます。ディスパッチャでは、CPUの割当てを待っている複数のプロセスのうちの一つを次に実行するプロセスとして選択して、最後にカーネルからアプリケーションプログラムに戻るための特権命令を実行します。それにより、カーネルの実行からプロセスによるアプリケーションプログラムの実行に移ります。
レッスン7の「4. プロセス切替えの仕組み」も参照してください。

Q15
CD-Rと磁気ディスク、LBAなどの関係はどのようなものですか?


A15
CD-Rは一本の線上に渦巻き上に記録していきます。しかし、磁気ディスクは同心円上に記録する点が違います。しかし、データへのアクセスはほぼ同じ機構を有しています。アクセスアームを移動(シーク)することで、目的のセクタ近辺に到達し、読み書きヘッドに目的のセクタが通過するのを待ち(サーチ)読み書きを行います。LBAは両媒体の先頭のセクタからの番号です。この番号を指定することで、両装置のコントローラはシーク動作ならびにサーチ動作を行います。以前の磁気ディスクでは、シリンダ、ヘッド、セクタアドレスを指定してアクセスしていましたが、記録密度の向上に伴い、内側と外側の記録容量の差が無視できないようになり、これらの物理的な構造情報の指定を行うことは現実的でなくなってしまいました。そこで、論理的なセクタアドレスとしてLBAを指定し、装置のコントローラがLBAを解釈するようになりました。

Q16
磁気ディスクとCD-Rの違いは何ですか?


A16
磁気ディスクは円盤上に磁性体を施した円盤を回転させ、その表面にデータの書き込みを行い、それを読み込むこと、書き換えること、などが自由にできる記録媒体です。一方、CD-R(Compact Disk Recordable)はデータの書き込みができますが、一度書き込むと、その部分を書き換えや消去が不可能です。しかし、容量の許す限り、追記は可能です。CD-Rは一度しか書込みできませんが、データ消去可能で書き換え可能なCD-RW(Compact Disc ReWritable)も広く利用されています。CD-RWはCD-Rの試し焼きやCDプレーヤに利用されています。

Q17
ブロッキングはアプリケーションが行わなければならないのですか?


A17
入出力を頻繁に行うアプリケーションプログラムであって、ブロッキングの効果が高いと期待される場合には、ブロッキングを行うことが望ましいでしょう。ブロッキングはアプリケーションプログラムが行わなくともOSが行っている場合もあります。たとえば、プリンタへの出力などは、OSの機能であるスプーラがアプリケーションの陰でブロッキングを行っています。また、ファイルシステムによっては、アプリケーションプログラムからの入出力要求に対して、内部でブロッキングをして性能向上をしている場合もあります。

Q18
キャッシュ領域の空きを探す方法にはどのようなアルゴリズムがあるのですか?


A18
キャッシュ領域は、複数のファイルを対象としているので、常時込み合っています。したがって、空き領域を作るアルゴリズムは重要です。基本的には、将来再利用されることのない領域を解放するのが一番よいと思われます。しかし、将来のプログラム動作を占うのは困難な問題ですので、各々のブロック参照のアクティビティを測定し、アクティビティの低い領域から解放することにするのが一般的です。この方法は、仮想記憶のページ置換えアルゴリズムで説明しているLRU(Least Recently Used)が代表的なもので、良く利用されています。つまり、最も古く利用された領域を解放する候補とし、内容が変更されていなければ、直ちに空き領域とします。変更されている場合は、内容を磁気ディスクに書き戻してからでないと空き領域にできません。したがって、空き領域の確保には、LRUと内容が書き換えられているか否かを基にして、判断することになります。

Q19
順編成ファイルと直接編成ファイルの構造上の違いはどこにあるのですか?


A19
UNIXの場合は、ファイルは一次元の単なるバイト列であり、構造はない、という考え方です。その中に、構造があるか否かは、ファイルを扱うアプリケーションプログラム(AP)が認識することになっています。直接アクセスしたければ、lseekのようなシステムコールが用意されており、ファイル内の目的のバイトアドレスにアクセス可能です。
一方、OS/360系のファイル管理では、レコード、ブロック、順編成ファイル、直接編成、などの定義をファイル生成時にユーザは定義しなくてはなりません。これらの情報は、ファイルのアクセス法が利用します。これらのことから、ファイルの構造は異なっています。アクセス法を使うことなく、スーパバイザコールを直接APが行う場合は、APがファイル構造の操作に責任を持つことになっています。

Q20
UNIXのファイルでのファイル編成やレコードの概念はどのようになっているのですか?


A20
UNIXの場合は、ファイルは一次元の単なるバイト列であり、構造はない、という考え方です。その中に、構造があるか否かは、ファイルを扱うアプリケーションプログラム(AP)が認識することになっています。したがって、レコードやファイル編成の概念はありません。APがテキスト編集ならば、そのAPの扱うファイルはAPの定義したデータ構造をしているはずで、UNIXはその構造に関与しないことになっています。ファイル内データが画像なのか、音楽なのか、動画なのか、などの内容には全く関与しないという思想です。

Q21
UNIXのファイル記述子というのは何ですか?


A21
UNIXのファイルをオープンすると、ファイル記述子(FD: file descriptor)が戻り値となります。FDはカーネル内のファイル管理テーブルのインデックスです。端末からログインすると、デフォールト(特に何もしなくても)で、標準入力(stdin)であるキーボードのFDは0であり、標準出力(stdout)のディスプレイのFDは1,そして、標準エラー出力(stderr)のFDは2です。ファイルのオープンが実行されると、FDは空いている整数値の小さな番号から割り振るルールになっているので、端末からログインした直後にオープンするファイルのFDは3です。UNIXでは、FDを通常ファイルだけに使うのではなく、通信ソケット、プロセスファミリ間データ転送のパイプ、名前付きパイプ(FIFO)などにも使われます。

Q22
システムコールのcreatはミススペルではないのでしょうか。


A22
システムコールcreatは最後のeが抜けています。確かに、ミススペルのように思われるのが当然です。UNIXを開発したKenneth Thompsonはシステムコールを設計したときに、一文字でも短く簡潔にした名称にしたかったのだと思います。しかし、多くのプログラマがこの部分にバグを出すので、後に、Thompsonはある取材で「もう一度、UNIXを作るときが来たら、どこを修正しますか?」との質問に対して「あのcreatシステムコールをcreateと修正したい」と答えたとある本に書かれていました。

Q23
仲間(グループ)の構成メンバはどのようにして定義するのですか?


A23
UNIXのシステム管理者はグループの構成を設定する必要があります。多くの場合、/etc/groupファイルに記述します。ここには、グループ名称やそのグループのパスワード、グループ番号、グループに所属するアカウント名(ログイン時の名前)などを指定します。たとえば、一般ユーザ(user)、管理者(operator)などを設定します。このファイルを操作するユーティリティも用意されています。

Q24
なぜUNIXは最初から非同期入出力ではなかったのですか?


A24
理由は不明です。Kenneth Thompsonは、MIT/Multicsのプロジェクトの経験から、あのような大規模なTSSをめざすのではなく、自分のプログラミングを行う道具として、UNIXを開発したと言われています。個人利用の対話型OSを目的として開発されたので、不特定多数のユーザからの利用や、ヘビートラフィックのトランザクション処理を目的としたサーバOSを狙いにしていたわけではありません。したがって、個人がプログラムを作る際は、一つのファイル処理をしているだけで十分ですので、プログラミングが面倒な非同期入出力は無用と考えたと想像できます。

Q25
応答時間とはどのようなものですか?


A25
対話処理で、端末から入力してから、システムがその入力で要求された処理を実行して応答が返ってくるまでの時間が応答時間(レスポンスタイム)です。TSSやオンライン処理などでは、利用者に良好なサービスを提供するために、短い応答時間が望まれます。
応答時間は、入力で要求された処理を実行する正味の時間(サービス時間)と、コンピュータの中で他のプロセスがCPUなどの資源を利用しているためにそれが空くまで待っている時間とから構成されます。すなわち、「応答時間 = サービス時間 + 待ち時間」です。後者は、そのときのシステムの込み具合、すなわち同時に存在するプロセスの数や、それらのプロセスが要求している処理量に依存しています。同時に存在するプロセス数は、システムを同時に利用している利用者数と、それらの利用者がどの位の間隔で要求を入力するかによっています。
以上がどのような関係にあるのかを見てみましょう。一人の利用者が端末でシステムを使う様子は図1のようになります。入力してから応答が返ってくるまでの時間が応答時間です。また、応答が返ってきてから次の入力を入れるまでの時間を思考時間と呼びます。これらが繰り返されます。
図1 応答時間と思考時間
システムにN人の利用者がいるとして、それぞれが図1のように対話処理をしているとすると、システムでの処理は図2のようにモデル化されます。
図2 対話処理のモデル
すると、平均の応答時間と他の量の平均値との間には次の関係が成り立ちます。
式
利用者数Nが増えるとコンピュータの利用率も1に近づき、平均応答時間は「平均サービス時間 × N − 平均思考時間」になります。
なお、これは平均値について成り立つ関係であり、個々の応答時間はコンピュータ資源の分配の方法、すなわちプロセススケジューリングの方法によって大きく変わります。それについては、レッスン7「7. 代表的なプロセススケジューリング」「8. ラウンドロビン法の実現方法」を参照してください。

【参考文献】 野口 健一郎: IT Text オペレーティングシステム、第14章、オーム社(2002年)

Q26
実際のプロセススケージューリングはどのようになっていますか?


A26
実際のOSではプロセススケジューリングの方法を組み合わせて使用しています。優先順位法とラウンドロビン法の組合せがよく使われます。OSは実行可能状態のプロセスを優先度ごとの行列(キュー)に並べて管理します。プロセスの選択はまず優先度順で行われ、同一優先度の行列に複数のプロセスがある場合はその中でラウンドロビン法が適用されます。

Q27
優先順位法で、プロセスへの優先度の与え方はどのように行うのですか?


A27
いくつかの方法により、プロセスに与える優先度が決まります。第一は、利用者が優先度を指定する方法です。バッチ処理の場合は、ジョブごとに実行の種別を指定することで、優先度を指定しました。第二の方法は、OSが動的に決定するものです。優先順位法を使用しているOSで、高い優先度のプロセスが長時間CPUを占有し続けている場合は、優先度を一つ落とす、ということを行う場合があります。第三の方法は、プロセス実行中に、アプリケーションプログラムが優先度の変更を行うものです。UNIXではniceシステムコールを出すことにより、プロセスに与えられていた優先度を下げることができます(他のプロセスにとってナイスです。)

Q28
タイムスライスの大きさはどのぐらいの値ですか?


A28
タイムスライスは1秒よりかなり小さい値が使われます。これがあまり大きいと、対話処理で短いサービスをOSに依頼したのに、同時に存在する他プロセスの実行のために応答時間が大きくなってしまう、という問題が生じます。また、あまり小さいと、CPUを長時間使用するプロセスの実行中でもしばしばタイマ割込みが起こってスケジューリングの処理を行うことになり、オーバヘッドが無視できません。
例として、Linux2.6では、優先度によりタイムスライスの値を変化させており、標準の優先度を持つプロセスのタイムスライス値は100 ミリ秒です。

【参考文献】 D. P. Bovet, M. Cesati著、高橋浩和監訳、詳解Linuxカーネル 第3版、オライリー・ジャパン(2007年)

Q29
スレッドとプロセスの関係を教えてください。


A29
スレッドは軽量の処理の流れです。UNIXなどのプロセスは、プロセス毎にアドレス空間を持っているため、プロセス生成時にアドレス空間の生成も必要である、またプロセス間でメモリ経由で簡単にデータを渡すことができずプロセス間通信機能の利用が必要になる、などで処理のオーバヘッドが大きくなるという問題がありました。それを解決するために、一つのプロセスの中に、さらに複数の処理の流れを持てるようにする、そしてそれらはアドレス空間を共用する、という方式が考案されました。その処理の流れを軽量プロセスあるいはスレッドと呼びます。
なお、IBM OS/360では、メモリ空間割当ての単位はジョブであり、ジョブ内のタスク群はメモリ空間を共用していました。すなわち、タスクはスレッドに近いものでした。

Q30
共用メモリを用いれば事象の連絡ができるのではありませんか?


A30
OSを介することなく、共用メモリを用いて事象の連絡ができそうですが、それには問題があります。事象の連絡を通知する側のプロセスが先に動いて共用データに事象の発生を書き込み(たとえば共用データの初期値を0にしておき、事象が発生したら1にする)、その後で連絡を受け取る側のプロセスが動けば、共用データが1になっているので通知が来たことが分かります。この場合はうまくゆきます。しかし、連絡を受け取る側のプロセスが先に動いたらどうなるでしょう。共用データを見に行ったら初期値の0で、連絡が来ていないことが分かります。その後、そのプロセスは共用データが1に変わるまで繰り返し見に行ったら(すなわちループしたら)、CPUを占有し続けるので、連絡を通知する側のプロセスが動く機会が無くなってしまいます。そこで、タイマ割込みを利用して、小休止した後共用データを見に行くということを繰り返す(そのような処理をポーリングと呼びます)、というような構成にする必要があります。そうすれば、連絡を通知する側のプロセスが動く機会ができます。しかし、このポーリング方式は、連絡を受け取るのに遅れが出てしまう、という問題があります。また、タイマ割込みの利用で結局OSを使っていることになります。

Q31
共用メモリを用いればプロセス間の通信ができるのではありませんか?


A31
OSを介することなく、共用メモリを用いてプロセス間の通信ができそうですが、それには問題があります。その問題は、共用メモリを用いた事象の連絡の場合と同様です。

Q32
パイプのread、writeと、ファイル管理のread、writeとは、同じ使い方でよいのですか?


A32
基本的にread、writeの使い方は同じです。ただし、パイプではlseekは使えず、順次アクセスのみが可能です。また、ファイル管理のcreat(またはopen)に相当するものが、パイプではpipeシステムコールになる点が異なります。UNIX系OSの種類によって、pipeシステムコールで片方向のパイプが作られるものと、双方向のパイプが作られるものがあります。パイプを使い終わったらcloseを出します。

Q33
排他制御とクリティカルセクションの関係を教えてください。


A33
複数のプロセスが資源を共用する場合、競合が発生し、処理に矛盾を発生するケースがあります。例えば共用データへの書込みなどが、その典型的なケースです。排他制御は、共用資源へのアクセスをプロセスが独占して行うことで処理の矛盾を解決する手段です。
排他的に処理をしなければならないプログラムの部分をクリティカルセクション(critical section)あるいは、クリティカルリージョン(critical region)と呼びます。具体的には、共用資源の独占的使用をOSに宣言するために、システムコールlockを発行してクリティカルセクションに入り、共用資源を使用した後にunlockを発行して、クリティカルセクションから抜けます。排他制御を実現する上でプログラム設計者が知っておかねばならない重要な概念です。

Q34
OS内部の処理でも排他制御が必要ですか? また、必要な場合、どのように行っていますか?


A34
OSはコンピュータの資源を管理するために、システム全体で共用される多くのテーブル類を持ちます。それらを操作するときに、排他制御は重要な課題です。
モノリシックなカーネルで、かつCPUが1台の場合は、次の二つの方法でこの課題を解決しています。第一は、カーネル全体(または排他制御が必要な部分)は外部割込みを禁止するモードで動かします。第二は、カーネルのプログラムは主記憶に常駐させます(これにより、仮想記憶方式であってもページフォールト割込みが起きません)。こうすることで、カーネルの処理が排他的に実行されることが保証されます。
多重プロセッシングの環境では、複数のCPUで同時にカーネルが実行されることがあるので、排他制御の仕組みが必要になります。そのために、CPUは排他制御用の特別な命令を用意しています。排他制御用の命令では、主記憶のデータの値を判定して、その結果によりその値を変化させる、という動作をCPUが排他的に(動作の間は他のCPUがそのデータにアクセスすることをハードウェア的に禁止する)行えます。この命令を使って、OSはCPU間の排他制御を実現します。

Q35
セグメント間の保護機構とはどのようなものですか?


A35
論理的な情報の集合をセグメントと言います。セグメント間の保護の具体的な例は、プログラムが入っているセグメント(テキストと呼ぶ場合もある)がデータ操作の対象としているセグメントに対してどのような機能があるか、ということになります。一般的に、ハードウェアがセグメント機能を持ったコンピュータでは、ページ化された仮想記憶をサポートしているメモリの保護機構と同様の機能が各セグメントに適用されている例が多く見られます。基本的には、ページに関する保護機能をそのままセグメントに適用しています。具体的には、各々のセグメントに対して、プログラムからの読込み、書込み、命令実行の記憶保護が備わっているのが理想的です。しかし、コンピュータによっては、この一部しか備わっていないものもあります。とはいえ、書込みに関する保護は最も基本的な保護機能であり、メモリ保護の基本です。また、セグメント間の上下関係(リングレベル)によるセグメント間の保護機能もあります。一般的には、同等のセグメント間のデータアクセスは可能ですが、下位のセグメントが上位セグメントへアクセスするのはハードウェア的に禁止されています。OSは最も上位のレベルで命令実行し、OSの管理テーブル類は最上位のレベルに位置するセグメントとするのが一般的です。このような概念を最初に提案したのが、米国MITのMulticsです。現在利用可能なマイクロプロセッサでは、Intel社のIA32などがあります。

Q36
なぜスタックとヒープがあるのでしょうか(1種類ではダメな理由は何ですか)?


A36
スタックとはスタックメモリのことであり、ハードウェアとして特別な機能を持ったメモリです。つまり、スタックにデータを蓄積する際には、push Aのような命令により行いますが、蓄える情報(A)をメモリの上から下に押し込むように蓄積します。従って、push A, push Bと連続してデータを蓄積すると、データAが下に押し込められ、上にデータBが蓄積されています。したがって、蓄積したデータを取り出す命令、popを実行すると、上にあるデータBを取り出すことになります。そして、データAが一番上に位置するので、次にpop命令を実行すると、データAが読み取れることになります。つまり、先入後出しのメモリです。スタックメモリは、上記のような特別な機能を持ったメモリです。この機能を使用することで都合の良い処理(計算)ができる領域として利用されます。代表的なものは、関数呼び出しの引数、レジスタの退避領域、戻りアドレス、などです。これらの領域として利用されるので、スタック領域は常に増減すると考えられます。
一方、ヒープ領域とは、プログラムが動作中にプログラムが作業領域としてメモリを一時的に使用する目的を持っています。動的に増減する、という意味では、スタックメモリと同じです。しかし、メモリの蓄積と読み出しはスタックメモリのような、先入後出し機能はありません。

Q37
パーティションの保護機構にはどのようなものがありますか?


A37
多重プログラミングを実現するには記憶保護は必須条件です。この場合、必要最低限の機能は、プロセスがプログラムを実行している間は、他のパーティションに対して不当な書込みを禁止することです。この機能がないと、他のプロセスが正しい計算をできないばかりか、OS自身が破壊され、システムクラッシュが起きてしまいます。そこで、初期に考案された記憶保護機構は、バウンダリレジスタ(境界レジスタ)をCPUに設け、OSがプロセスをディスパッチする前に割り当てたパーティションの領域アドレスをこのレジスタに設定する方法です。ハードウェアは、メモリ参照の度に、バウンダリレジスタに設定されたアドレスの範囲内であるか否かの正当性をチェクし、不当なアクセスを行おうとすると、アドレッシングエラー、もしくは、記憶保護例外、として割込みを起こし、OSに制御を渡します。このような原始的な方法が初期に考案されていましたが、その後、ページ単位の記憶保護、セグメント単位の記憶保護など、高度なハードウェア機構が考案され、それらをOSがサポートするようになってきました。

Q38
具体的なページサイズにはどのようなものがあるのですか?


A38
32ビットマシンぐらいまでのコンピュータでは、4KB(4,096byte)が主流でした。しかし、半導体メモリが安価になり大容量な主記憶が利用可能な状況になると、アドレス変換テーブルのサイズの問題、ページフォールトによるOSオーバヘッドの問題が大きくなり、大きな実ページが求められるようになりました。したがって、32KB、1MB、4MBなどのページサイズ拡張を行っているコンピュータもあります。

Q39
ページ化によりプロセス内の無駄領域はどのように減るのですか?


A39
主記憶をページ化すると、プロセスに割り当てるメモリの単位はページになります。例えば、1ページを4KBとすると、4,096バイト単位です。したがって、プロセスの要求するメモリもページの整数倍となるため、最後の1ページ内に無駄になる領域が生まれる可能性があります。しかし、上記のページサイズであるならば、無駄領域の最大サイズは、4,095バイトとなります。また平均サイズはページサイズの半分の2,048バイトとなります。オンデマンドページングによる仮想記憶方式では、参照されたメモリだけの実ページ割当てとなるので、さらに無駄な領域は削減されます。しかし、プログラムのメモリの参照行動は、事前には予想し難いので、正確なメモリ削減効果をプログラム実行前に知ることは難しい問題です。

Q40
アドレス変換テーブルは64ビットマシンでは巨大になると思われますが、工夫はあるのですか?


A40
アドレス空間の拡張はアドレス変換テーブルも巨大化しますので、大きな問題です。したがって、大きなアドレス空間を持つアーキテクチャでは、アドレス変換テーブルを持たない方法が考案され実用化されています。この方法は「逆引きページテーブル:inverted page table方式」と呼ばれています。逆引テーブルは実ページ毎に設けます。そこには、OSが(P,N)の情報を格納しておきます。Pはプロセス番号であり、Nは仮想ページ(仮想記憶アドレスのページ部)番号です。もし、64ビットマシンで、ページサイズが4KB、主記憶が512MBならば(P,N)は131,072個必要となります。DATはアドレス変換テーブルを参照するのでなく、TLB(Table/Translation Lookaside Buffer)だけ参照します。TLBに該当する(P,N)エントリが見つからないときは、ページフォールトを発生させます。OSは、逆引テーブルを探し、(P,N)が探索できれば、TLBにその値を入れるので、今度は、DATはTLBに要求のあった(P,N)を見つけられるので、実ページアドレスを知ることが可能となります。逆に、OSが逆引テーブル内に(P,N)を探索できなければ、空いている実ページを探し、その後に、ページイン操作を行います。したがって、この方式を取るには、大きなエントリ数を持つTLBが必要となります。
TLBについては、「FAQ: 動的アドレス変換の高速化の手法はありますか」も合わせてご覧ください。

Q41
動的アドレス変換の高速化の手法はありますか?


A41
動的アドレス変換装置(DAT)はアドレス変換テーブルを参照します。メモリ参照はCPUにとってサイクルタイムを消費することになります。DATはメモリ参照の度に必要ですので、このサイクルタイムは無視できません。そこで、初期の頃より、DATの高速化が考案されてきました。基本的な考えは、一度サイクルタイムを消費して求めた論理ページアドレスに対応する物理ページは、CPUのキャッシュレジスタに蓄えておき、その後、同一の論理ページに対する変換要求があれば、アドレス変換テーブルを参照することなく、キャッシュレジスタを読み取る、という方法です。もし、大容量のキャッシュレジスタを備えることが可能ならば、高速なDATが実現できます。このDATのキャッシュレジスタをTLB(Table/Translation Lookaside Buffer)と呼んでいます。今日の仮想記憶をサポートしているCPUでは、マイクロプロセッサのチップの中に、TLBを備えています。マイクロプロセッサを作るデバイス技術や、そのサイズの問題などから、自ずと容量には制限があります。この問題には、命令読み出し、命令オペランドへのデータアクセス(load/store)などの、メモリアクセスの分析が重要です。そこでは、それらのアクセス頻度の違い、局所参照性の問題、などから、さまざまな工夫がなされています。

Q42
オンデマンドページングは一ページ単位に割り付けるのでオーバヘッドが問題にならないのですか?


A42
オンデマンドページング方式にはメモリ節約の利点がありますが、逆に、欠点もあります。この質問は、あるプログラムを実行する際に、参照される毎に1ページずつ割込みを起こし、ページを割り付け、ページインするコストと、(たとえ参照がなくても)要求される領域の全部を一度にページ割り付けし、装置から読み込むコストの比較の問題と解釈できます。後者の方法は、プリページングという方法です。OSによっては、プリページングを選択できて、高度なアプリケーションプログラムを設計するシステムプログラマに提供している場合もあります。プリページングが有利なのは、メモリが十分あり、プログラムの読込みの際に、プログラム領域がディスクなどに連続的に格納されていることが保証されており、ディスクを休ませることなく連続的にデータ転送できるような時と考えられます。

Q43
ページングファイルやスワッピングファイルに、最初にプログラムやデータが格納されるのはいつですか?


A43
OSによって異なるかもしれませんが、一般的には、主記憶が不足して、実ページの空きを作るために行われるページアウトの際に、ページングファイルへの最初の書込みが行われます。このようにして書き込まれたページが再参照されると、ページフォールトが発生し、ページングファイルからページイン(読込み操作)されます。同様に、ページフォールトが多発し、メモリ負荷が高くなったとOSが判断すると、メモリ負荷を緩和するために、多重プログラミングの多重度を下げるスワップアウトが行われます。これが、スワップファイルへのプログラムやデータ部分の最初の格納になります。

Q44
UICはどこにあり、どのぐらいのビット数なのですか?


A44
UIC(Un-referenced Interval Counter)は実ページの各々に用意します。OSによって異なりますが、実用という意味では、このカウンタは1バイトで十分です。つまり、0から255までの値で十分という意味です。255に至ったら、これ以上は増えないようにします。UICは実ページ管理テーブル内にあるのが一般的です。実ページ管理テーブルには、当該実ページの状態(空きページ、割付中、ページング入出力中、など)、割り付けられているときは、そのプロセスID、論理アドレス、などの情報が含まれています。

Q45
LRU以外のページ置換えアルゴリズムにはどのようなものがありますか?


A45
いくつかのアルゴリズムが存在します。レッスン10「11. ページ置換えアルゴリズム」ではLRUの測定法を説明しました。LRUではOSが測定するUIC(Un-referenced Interval Counter)は実時間の割込みを使います。例えば、1秒毎、などです。そして、全実ページに対してUICの計測をしています。このため、各々のプロセスに割り付けられた実ページを区別することなく、コンピュータシステム全体のページ参照アクティビティを測定し、ページ置換えアルゴリズムを実現しています。この意味で、グローバルストラテジ(global strategy)アルゴリズムと言われています。
一方、プロセス毎のメモリ参照アクティビティを測定することで、ページ置換えをするアルゴリズムがあります。この代表的なものは、ワーキングセット法です。ワーキングセット法では、UICの測定の基本となる時間が、そのプロセスに割り当てられたCPU時間です。実時間ではないので、仮想時間(virtual time)と言うことがあります。したがって、プロセスが使うCPU時間の軸で、タイマ割込みを掛け、そのプロセスに割り当てられた実ページについてUICを測定します。この場合、割込み間隔を、ワーキングセットにおけるウインドウサイズの三分の一とすると、UICの値が3以上となった実ページは、ワーキングセットの外に出たとみなされるので、空きページの候補とします。これが、ワーキングセット法によるページ置換えアルゴリズムです。そして、LRUとは異なり、各々のプロセス毎に実ページ割付けの管理をすることから、ローカルストラテジと呼ばれています。
ワーキングセットについては、レッスン10の参照画面「ワーキングセットの概念」も合わせてご覧ください。