42
オペレーティングシステム 設計と実装 第3版 oraccha http://d.hatena.ne.jp/oraccha/ 2010年12月11日版 (P.190まで)

オペレーティングシステム 設計と実装 第3版(20101211)

Embed Size (px)

Citation preview

Page 1: オペレーティングシステム 設計と実装 第3版(20101211)

オペレーティングシステム設計と実装 第3版

oracchahttp://d.hatena.ne.jp/oraccha/

2010年12月11日版(P.190まで)

Page 2: オペレーティングシステム 設計と実装 第3版(20101211)

「MINIX本読書会」について•ほぼ一ヶ月に一度集まって、「オペレーティングシステム 設計と実装 第3版」を読んでいます。

•興味のある方は次のGoogle Groupを参照してください。

https://groups.google.com/group/minixReadingClub

Page 3: オペレーティングシステム 設計と実装 第3版(20101211)

Andrew S. Tanenbaum

Albert S. Woodhull

Page 4: オペレーティングシステム 設計と実装 第3版(20101211)

OSの設計者はオーケストラの指揮者と同じである。つまり、指揮者に問われるのは音楽の教養であるのと同じように、OS設計者に問われるのはコンピュータのハード、ソフト、応用のすべてに対する教養の深さである

高橋延匡

Page 5: オペレーティングシステム 設計と実装 第3版(20101211)

第1章オペレーティングシステム概論

Page 6: オペレーティングシステム 設計と実装 第3版(20101211)

理論と実践のバランス•理論:基本的な原理・原則を重視

•プロセス、プロセス間通信、セマフォ、モニタ、メッセージパッシング、スケジューリングアルゴリズム、入出力、デッドロック、デバイスドライバ、メモリ管理、ページングアルゴリズム、ファイルシステム設計、セキュリティ、保護機構

•実践:具体例としてのMINIX 3

Page 7: オペレーティングシステム 設計と実装 第3版(20101211)

MINIXの歴史• 1987 MINIX 1: UNIX (v7)互換教育用OS

• 8088 16bit リアルモード、フロッピーディスク

• 1997 MINIX 2

• 386 32bit プロテクトモード、ハードディスク

• v7 → POSIX.1互換(IEEE1003.1/ISO 9945-1)

• 2006 MINIX 3 (book versionはMINIX 3.1.0)

Page 8: オペレーティングシステム 設計と実装 第3版(20101211)

OSの役割•資源管理としてのOS

•計算機資源(CPU、メモリ、IO機器)の効率的な管理• 時間多重化:CPU

• 空間多重化:メモリ、ハードディスク

•拡張マシンとしてのOS

•ユーザに対して現実のマシンより便利に使用できる仮想的なマシンを提供

•アプリケーションとOSの界面:システムコール

Page 9: オペレーティングシステム 設計と実装 第3版(20101211)

システムコールの主な機能1.プロセス生成と消滅:fork, waitpid, exec, exit, ...

2.シグナル操作:sigaction, sigreturn, kill, alarm, ...

3.ファイルの読み書き:creat, open, close, read, write, ...

4.ディレクトリ管理:mkdir, rmdir, mount, unmount, chdir, ...

5.情報の保護:chmod, chown, unmask, ...

6.時間の管理:time, stime, utime, times

Page 10: オペレーティングシステム 設計と実装 第3版(20101211)

OSの構造単一システム ユーザ・カーネル

モード

階層システム リング機構 THE、MULTICS

バーチャルマシンシステム

マルチプログラミングと拡張マシンの機能の分離 VM/370

エクソカーネル (軽量な)資源の隔離 exokernel

クライアントサーバモデル

カーネル機能の高階層化 MINIX 3

Page 11: オペレーティングシステム 設計と実装 第3版(20101211)

クライアントサーバモデル• OSの部品化

•分散透過

•メカニズムとポリシーの分離

クライアントプロセス

プロセス管理サーバ

端末管理サーバ

ファイル管理サーバ ・・・ ファイル

管理サーバメモリ管理サーバ

マイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルクライアントはサーバプロセスにメッセージを送信することでサービスを享受する

P.55

Page 12: オペレーティングシステム 設計と実装 第3版(20101211)

マイクロカーネルの物語は、すばらしいアイデアと袋小路に満ちている。期待された柔軟性、安全性、モジュール性の劇的な向上に対する熱狂は、数年後失望へと変わる。第一世代のマイクロカーネルは、効率が悪く、柔軟性に欠けていたからである。

Jochen Liedtke“Toward Real Microkernels,” CACM Vol. 39, No.9, 1996.

Page 13: オペレーティングシステム 設計と実装 第3版(20101211)

マイクロカーネル世代論• A New Hope: 第一世代マイクロカーネル

• 1980年後半からのポストUNIXの流れ• 例:Mach、Chorus、Mach

• The Microkernel Strikes Back: 第二世代マイクロカーネル• より効率的なナチュラルボーン・マイクロカーネル• 例:L4、Exokernel

• Return of Virtual Machines: 仮想マシンモニタの大衆化• 結局やっていることはマイクロカーネルと同じ!?• 例:VMWare、Xen

Page 14: オペレーティングシステム 設計と実装 第3版(20101211)

第2章プロセス

Page 15: オペレーティングシステム 設計と実装 第3版(20101211)

プロセス•逐次プロセスモデル

•タスク>CPUの場合、疑似並列処理をいかに実現する?

•各プロセスは資源と状態を保有

• OSによるスケジューリングの基本単位

実行中

ブロック中 実行可能

実行中:その瞬間CPUを使っている実行可能:実行可能であるが、他プロセスが実行中のため一時停止させられているブロック中:何らかの外部的事象が発生しない限り実行できない

Page 16: オペレーティングシステム 設計と実装 第3版(20101211)

相互排除•クリティカルセクションを他プロセスと排他的に実行するための制御

•ビジーウェイト(スピンロック)•割込み禁止• Petersonのアルゴリズム• TSL命令

•セマフォ、ミューテックス•モニタ

問題点:‣CPU時間の浪費‣優先度逆転

Mars Pathfinder’s Sojourner

Page 17: オペレーティングシステム 設計と実装 第3版(20101211)

相互排除• Petersonのアルゴリズム

•ソフトウェアによる相互排除の基本的手法で、Dekkerのアルゴリズムを単純化したもの

•プロセス数Nへの拡張も簡単• Filterアルゴリズム• LamportのBakeryアルゴリズム

• TSL命令が一般的なので現場では使われない?

Page 18: オペレーティングシステム 設計と実装 第3版(20101211)

do { interested[1] = TRUE; turn = 1; while (turn == 1 && interested[0]);

/* critical region */

interested[1] = FALSE;

/* non critical region */} while (TRUE);

PERTERSONのアルゴリズムint turn;boolean interested[2];

do { interested[0] = TRUE; turn = 0; while (turn == 0 && interested[1]);

/* critical region */

interested[0] = FALSE;

/* non critical region */} while (TRUE);

enter region

leave region

プロセス0 プロセス1

共有変数

Page 19: オペレーティングシステム 設計と実装 第3版(20101211)

TSL命令• Test-and-Set Lock

•一つの記憶(変数)に対する二つの動作(readとwrite、readとcmp)を1命令サイクルで不可分に実行

•実例• ts (System/360)

• cas (68000, SPARC)

• xchg, cmpxchg (x86)

• ll/sc (MIPS), ldrex/strex (ARMv6)

Page 20: オペレーティングシステム 設計と実装 第3版(20101211)

セマフォ•ビジーウェイトを必要としないsleep&wakeup方式• Semafore(蘭)/Semaphore(英)

• P: down (sleepに相当)• V: up (wakeupに相当)

•使い方•排他:1に初期化•イベント待ち:0に初期化

用例•生産者消費者問題•哲学者の食卓問題•リーダライタ問題 

Page 21: オペレーティングシステム 設計と実装 第3版(20101211)

スケジューリング• CPUバウンドとI/Oバウンド

•プリエンプティブ

•対話型システムのスケジューリング

•ラウンドロビンスケジューリング

•優先度スケジューリング

•スレッドスケジューリング

Page 22: オペレーティングシステム 設計と実装 第3版(20101211)

MINIX 3の内部構造

initユーザプロセス

ユーザプロセス ......

プロセスマネージャ

(pm)

ファイルシステム

(vfs)

仮想記憶サーバ(vm)

ネットワークサーバ(inet)

再生サーバ

(rs)

ディスクドライバ(at_wini)

TTYドライバ

(tty)

Ethernetドライバ

(lance)......

カーネル(kernel)カーネル(kernel)カーネル(kernel)

システムタスク(system)

クロックタスク(clock)

階層

1

2

3

4ユーザプロセス

サーバプロセス

デバイスドライバ

カーネル

ユーザモード

カーネルモード

システムコール

カーネルコール

P.121

Page 23: オペレーティングシステム 設計と実装 第3版(20101211)

起動シーケンス• boot monitor

•ブートイメージ(カーネル、必要最小限のサーバ・ドライバ、init)をロードし、カーネルに制御を遷移

• MINIX kernel

•上記のサーバ・ドライバを起動• init(8)

• /etc/rcの実行• service(8)を介して追加のサーバ・ドライバを起動

• /etc/ttytabを参照してgetty (login)プロセス起動

Page 24: オペレーティングシステム 設計と実装 第3版(20101211)

再生サーバ• PMを除くすべてのシステムプロセスの親

•子プロセスが異常終了したら、そのプロセスを再起動

• service(8)は再生サーバのフロントエンドコマンド

•研究としてはMINIX3の胆?

• C.Giuffrida, “We Crashed, Now What?,” USENIX HotDep’10

Page 25: オペレーティングシステム 設計と実装 第3版(20101211)

再生サーバの動作例•例題:情報サーバの特権テーブルのデバッグダンプ(F4キー押下で表示)の表示を修正

• isをkillすると自動的に再起動# cd servers/is# vi dmp_kernel.c# diff dmp_kernel.c.orig dmp_kernel.c338c338< ! printf("(%02u) %-7.7s %s %s %7d",---> ! printf("(%02u) %-7.7s %s %s %6d",# make && make install# kill 38

変更前

変更後

Page 26: オペレーティングシステム 設計と実装 第3版(20101211)

PSの結果 PID TTY TIME CMD(-4) ? 0h44 idle(-3) ? 0:00 clock(-2) ? 0:00 system(-1) ? 0:00 kernel 5 ? 0:00 pm 7 ? 0:00 vfs 4 ? 0:00 rs 8 ? 0:00 memory: 1 ? 0:00 init: 122 co 0:00 sh 123 c1 0:00 getty

システムタスク

プロセス

Page 27: オペレーティングシステム 設計と実装 第3版(20101211)

ソースコードを読む前に• MINIX3 bookにしたがって読み進めるなら、v3.1.0の

ISOイメージか、Appendix Bのファイルの入手を勧める

• MINIX3 book version (v3.1.0)とcurrent version (v3.1.8)の差分は結構大きい

• http://www.minix3.org/doc/

Page 28: オペレーティングシステム 設計と実装 第3版(20101211)

ソースツリー(/USR/SRC)include (make worldで/usr/includeにコピーされる)

sys 追加のPOSIXヘッダファイルminix MINIX 3 OSが用いるibm IBM PCに固有の定義

kernel 第一階層drivers 第二階層servers 第三階層

Page 29: オペレーティングシステム 設計と実装 第3版(20101211)

カーネル再構築(1/2)• src/toolsでmakeすれば、以下が設定される

(詳細はhttp://wiki.minix3.org/en/DevelopersGuide/RebuildingSystem)

• /boot/boot: ブートモニタ

• /boot/images: ブートイメージ

• /sbin: サーバ、ドライバ# cd /usr/src/tools# make image# make install

Page 30: オペレーティングシステム 設計と実装 第3版(20101211)

カーネル再構築(2/2)•ブートモニタに入って、newminixコマンドで起動イメージの選択項目を追加

Page 31: オペレーティングシステム 設計と実装 第3版(20101211)

プロセス間通信(1)• MINIXはC/S型のマイクロカーネル

•システム階層内・間の通信はメッセージパッシング(ユーザプロセス間は対象外)

•割込みをメッセージに変換するのが胆

•例1)システムコール(ソフトウェア割込み)

•例2)ハードウェア割込み

Page 32: オペレーティングシステム 設計と実装 第3版(20101211)

プロセス間通信(2)•ブロッキング操作

• send、receive、sendrec

•ランデブ方式:単純でバッファ管理が不要だが、遅延が大きい

•システムコール、カーネルコールはsendrecのみを使用 send

receive

S Rkernel

send

receive

S Rkernel

(ブロック中)

Page 33: オペレーティングシステム 設計と実装 第3版(20101211)

プロセス間通信(3)•ノンブロッキング操作

• notify

•タイムスタンプ、ビットマップを設定して、プロセスを起床

Page 34: オペレーティングシステム 設計と実装 第3版(20101211)

プロセス間通信(4)•プロセス毎の許可ビットマップ(priv構造体)

• ipc_to: IPCの宛先プロセス• traps: IPCの種類(send、receive、sendrec、notify)

•例:ユーザプロセスはpm、vfs、rsのみにsendrec可能ユーザプロセスユーザプロセスユーザプロセスユーザプロセスユーザプロセス

pm vfs vm inet rs

driversdriversdriversdriversdrivers

kernelkernelkernelkernelkernel

sendrec sendrecsend

Page 35: オペレーティングシステム 設計と実装 第3版(20101211)

システムタスクメッセージ型 送信元 意味

sys_fork PM プロセスは分岐したsys_exec PM EXECコールの後にSPを設定するsys_exit PM プロセスは終了した

sys_privctl RS 特権レベルを設定または変更するsys_irqctl driver 割込みを、許可、禁止、構成するsys_devio driver I/Oポートを読み書きするsys_umap driver 仮想アドレスを物理アドレスに変換する

sys_vircopy FS, driver 仮想アドレスを指定してコピーを行うsys_physcopy driver 物理アドレスを指定してコピーを行うsys_getinfo all システム情報を要求する

P.208

Page 36: オペレーティングシステム 設計と実装 第3版(20101211)

おまけ:FORK&EXECの起源• UNIX最初期(PDP-7の頃)のプロセス管理は未成熟

•プロセスは端末毎に一つで、シェルはOSの一部(当時のTSSではありがちな実装)

•マルチプロセス化に向けたforkとexecの実装• forkとexecを分離したのは実装が簡単だったから

•分離のアイデア自体はSDS 930 TSSで実装例あり

•副作用:カレントディレクトリ、ファイルポインタなど出典:D.M.Ritchie, ”The evolution of the UNIX Time-sharing system,” 1979

Page 37: オペレーティングシステム 設計と実装 第3版(20101211)

割込み処理の概要• 割込みや例外が発生すると、IDTに登録された割込みハンドラが実行され、iretd命令で復帰する

• CPUはスタックをTSSに格納されたSSとESP(カレントプロセスのstackframe_s構造体に初期化済み)に切り替える

• 割込み処理初期はプロセスのコンテキストをstackframe_s構造体に保存。その後、割込みハンドラをカーネルスタックを使って実行する

• 割込み中にプロセススイッチが行われる場合は、iretd命令でユーザモードに復帰するときにプロセスが切り替わる• 割込みはデバイスドライバ(優先度が高いユーザプロセス)へのメッセージ送信を伴うので、通常はプロセススイッチする

Page 38: オペレーティングシステム 設計と実装 第3版(20101211)

割込み制御(IA32の場合)

SYS386_VECTOR

zero divide

base limit

IDTR

0

55

ハードウェア的に最大256個(32~255はユーザ定義可能)

+IDT

IA-32 ®

5-16

5.12.

! "#$$!

! %&'

"#$$! ()*)+)

()*),)"#$$

5-2. IDT

31 16 15 1314 12 8 7 0

P31..16DPL

0 4

31 16 15 0

15..0 0

011D

DPL

P

31 16 15 1314 12 8 7 0

PDPL

0 4

31 16 15 0

TSS 0

1010

45

0 0 0

31 16 15 1314 12 8 7 0

P31..16DPL

0 4

31 16 15 0

15..0 0

111D

45

0 0 0

1=32 0=16D33

Page 39: オペレーティングシステム 設計と実装 第3版(20101211)

割込み・例外とスタック(IA32の場合)

SS

ESP

EFLAGS

CS

EIP

(Error Code)

ここまではCPUがpush

SS

ESP

EFLAGS

CS

EIP

(Error Code)

IRETでpop

•エラーコードがpushされるかは例外の原因に依存する•例えば、ゼロ除算はpushされないが、ページフォルトはpushされる•エラーコード分はIRET実行前にプログラマが責任をもってpopしておくこと

Page 40: オペレーティングシステム 設計と実装 第3版(20101211)

カーネルからユーザへの遷移コードの共通化

restart()

service(int)

save()

syscall()

プロセスまたはタスク

起動

外部割込み(ハードウェアまたはクロックより)

ソフトウェア割込み(システムコール)

カーネル空間

ユーザ空間

P.188

Page 41: オペレーティングシステム 設計と実装 第3版(20101211)

_RESTART呼出しのトリック

SS

ESP

EFLAGS

CS

EIPhwint_XXへのret address

SSSS

ESPESP

EFLAGSEFLAGS

CSCS

EIPEIPhwint_XXへのret addresshwint_XXへのret address

EAXEAX

ECXECX

EDXEDX

EBXEBX

ESPESP

EBPEBP

ESIESI

EDIEDI

DS ES

FS GS

(RETADR)

(saveからjmpで復帰後)(call save後)

save関数はスタックをカーネルスタックに切り替え、(ret命令ではなく)jmp命令で復帰する。その結果、hwint_XXマクロのret命令では_restart

関数が戻りアドレスと解釈される。(v3.1.8でこのトリックは使われていない)

struct stackframe_s

カーネルスタック

_restartk_stktop

mov esp, k_stktop

struct stackframe_s (struct procの先頭)(割込みハンドラの実行)

save内でpush

Page 42: オペレーティングシステム 設計と実装 第3版(20101211)

例外ハンドラ

SS

ESP

EFLAGS

CS

EIP

(Error Code)

SS

ESP

EFLAGS

CS

EIP

old EFLAGS

old CS

old EIP

エラーコード例外番号

call save前

ここまではCPUがpush

エラーコードの有無で例外ハンドラ(_exception or

_errexception)を変えてスタックをそろえた後、C言語で記述された共通関数を呼び出す

例外発生後