annotate paper/chapter/introduction.tex @ 26:657784b3bae1

add slide
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sat, 30 Jan 2021 19:42:45 +0900
parents d9c29dddf64f
children af160f988ac8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
1 \chapter{OSとアプリケーションの信頼性}
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 コンピューター上では様々なアプリケーションが常時動作している。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 動作しているアプリケーションは信頼性が保証されていてほしい。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 信頼性の保証には、 実行してほしい一連の挙動をまとめた仕様と、 それを満たしているかどうかの確認である検証が必要となる。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 アプリケーション開発では検証に関数や一連の動作をテストを行う方法や、デバッグを通して信頼性を保証する手法が広く使われている。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 アプリケーションは通常特定のプログラミング言語で実装されている。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 このプログラミング言語自身の信頼性は高く保証される必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 また、実際にアプリケーションを動作させるOSも高い信頼性が保証される必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 OSはCPUやメモリなどの資源管理と、 ユーザーにシステムコールなどのAPIを提供することで抽象化を行っている。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 OSの信頼性の保証もテストコードを用いて証明することも可能ではあるが、 アプリケーションと比較するとOSのコード量、 処理の量は膨大である。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 またOSはCPU制御やメモリ制御、 並列・並行処理などを多用する。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 テストコードを用いて処理を検証する場合、テストコードとして特定の状況を作成する必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 実際にOSが動作する中でバグやエラーを発生する条件を、 並列処理の状況などを踏まえてテストコードで表現するのは困難である。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 非決定的な処理を持つOSの信頼性を保証するには、 テストコード以外の手法を用いる必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
20
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 テストコード以外の方法として、 形式手法的と呼ばれるアプローチがある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 形式手法の具体的な検証方法の中で、 証明を用いる方法とモデル検査を用いる方法がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 証明を用いる方法ではAgdaやCoqなどの定理証明支援系を利用し、 数式的にアルゴリズムを記述する。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
24 Curry-Howard同型対応則により、型と論理式の命題が対応する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
25 この型を導出するプログラムと実際の証明が対応する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
26 特定の型を入力として受け取り、証明したい型を生成する関数を作成する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
27 証明そのものは記述した関数の内容の整合性を、定理証明支援系が検証する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
28 証明を使う手法の場合、 実際の証明を行うのは定理証明支援系であるため、 定理証明支援系が理解できるプログラムで実装する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
29 AgdaやCoqの場合はAgda、 Cow自身のプログラムで記述する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
30 しかしAgdaで証明ができてもAgdaのコードを直接OSのソースコードとしてコンパイルすることはできない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
31 Agda側でCのソースコードを吐き出せれば可能ではあるが、 現状は検証したコードと実際に動作するコードは分離されている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
32 検証ができているソースコードそのものを使ってOSを動作させたい。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
33
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
34
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
35 他の形式手法にモデル検査がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
36 モデル検査は実際に動作するコードですべての可能な実行の組み合わせを実行し検証する方法である。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
37 例えばJavaのソースコードに対してモデル検査をするJavaPathFinderなどがある。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
38 モデル検査を利用する場合は、実際に動作するコード上で検証を行うことが出来る。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
39 OSのソースコードそのものをモデル検査すると、実際に検証されたOSが動作可能となる。
26
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
40 しかしOSの処理は膨大である。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
41 すべての存在可能な状態を数え上げるモデル検査では状態爆発が問題となる。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
42 状態を有限に制限したり抽象化を行う必要がある。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
43
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
44
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
45 OSのシステムコールは、ユーザーからAPI経由で呼び出され、 いくつかの処理を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
46 その処理に着目するとOSは様々な状態を遷移して処理を行っていると考えることができる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
47 OSを巨大な状態遷移マシンと考えると、 OSの処理の特定の状態の遷移まで範囲を絞ることができる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
48 範囲が限られているため、有限時間でモデル検査などで検証することが可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
49 この為にはOSの処理を状態遷移系で表現し、 証明しやすくする必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
50
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
51
24
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
52 証明を行う対象の計算は、 その意味が大きく別けられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
53 OSやプログラムの動作においては本来したい計算がまず存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
54 これはプログラマが通常プログラミングするものである。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
55 それ以外にデータをメモリに保存するためにメモリのアロケーションをする処理や、メモリから値を持ってくる処理が入る。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
56 メモリのほかにCPUの資源管理なども必要となる。
26
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
57 ユーザーレベルから見ると、データの読み込みなどは資源へのアクセスが必要であるため、システムコールを呼ぶ必要がある。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
58 システムコール自体もメタ計算である。
25
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 24
diff changeset
59 ユーザーが本来やりたい計算以外に、資源管理などのこれら計算を行う上でやらなければならない計算が存在する。
24
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
60 前者の計算をノーマルレベルの計算と呼び、後者をメタレベルの計算と呼ぶ。
26
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
61 ノーマルレベルの計算を確実に行う為には、メタレベルの計算が重要となる。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
62
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
63
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
64 プログラムの整合性の検証はメタレベルの計算で行いたい。
24
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
65 ユーザーが実装したノーマルレベルの計算に対応するメタレベルの計算を、自由にメタレベルの計算で証明したい。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
66 またメタレベルで検証ががすでにされたプログラムがあった場合、都度実行ユーザーの環境で検証が行われるとパフォーマンスに問題が発生する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
67 この場合はメタレベルの計算を検証をするもの、しないものと切り替えられる柔軟なAPIが必要となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
68 メタレベルの計算をノーマルレベルの計算と同等にプログラミングできると、動作するコードに対して様々なアプローチが掛けられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
69 この為にはノーマルレベル、メタレベル共にプログラミングできる言語と環境が必要となる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
70
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
71 プログラムのノーマルレベルの計算とメタレベルの計算を一貫して行う言語として、 Continuation Based C(CbC)を用いる。