annotate paper/chapter/01-introduction.tex @ 40:66b32f3ec7fa

rename
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 01 Feb 2021 08:32:58 +0900
parents paper/chapter/introduction.tex@d89b7d150b9f
children 76eee6847726
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
29
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
8 実際にアプリケーションを動作させるOSは、アプリケーションよりさらに高い信頼性が保証される必要がある。
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 OSはCPUやメモリなどの資源管理と、 ユーザーにシステムコールなどのAPIを提供することで抽象化を行っている。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 OSの信頼性の保証もテストコードを用いて証明することも可能ではあるが、 アプリケーションと比較するとOSのコード量、 処理の量は膨大である。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 またOSはCPU制御やメモリ制御、 並列・並行処理などを多用する。
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 実際にOSが動作する中でバグやエラーを発生する条件を、 並列処理の状況などを踏まえてテストコードで表現するのは困難である。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 非決定的な処理を持つOSの信頼性を保証するには、 テストコード以外の手法を用いる必要がある。
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
16
2
e543ba9a8e5c from git
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 テストコード以外の方法として、 形式手法的と呼ばれるアプローチがある。
29
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
18 形式手法の具体的な検証方法の中で、 証明を用いる方法\cite{Yang:2010:SLI:1806596.1806610}\cite{Klein:2009:SFV:1629575.1629596}\cite{Sigurbjarnarson:2016:PVF:3026877.3026879}\cite{Chen:2015:UCH:2815400.2815402}とモデル検査を用いる方法がある。
30
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
19 証明を用いる方法ではAgda\cite{agda}やCoq\cite{coq}などの定理証明支援系を利用し、 数式的にアルゴリズムを記述する。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
20 Curry-Howard同型対応則により、型と論理式の命題が対応する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
21 この型を導出するプログラムと実際の証明が対応する。
30
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
22 証明には特定の型を入力として受け取り、証明したい型を生成する関数を作成する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
23 整合性の確認は、記述した関数を元に定理証明支援系が検証する。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
24 証明を使う手法の場合、 実際の証明を行うのは定理証明支援系であるため、 定理証明支援系が理解できるプログラムで実装する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
25 AgdaやCoqの場合はAgda、 Cow自身のプログラムで記述する必要がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
26 しかしAgdaで証明ができてもAgdaのコードを直接OSのソースコードとしてコンパイルすることはできない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
27 Agda側でCのソースコードを吐き出せれば可能ではあるが、 現状は検証したコードと実際に動作するコードは分離されている。
30
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
28 検証されたアルゴリズムをもとにCで実装することは可能であるが、 この場合移植時にバグが入る可能性がある。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
29 検証ができているソースコードそのものを使ってOSを動作させたい。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
30
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
31
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
32 他の形式手法にモデル検査がある。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
33 モデル検査は実際に動作するコードですべての可能な実行の組み合わせを実行し検証する方法である。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
34 例えばJavaのソースコードに対してモデル検査をするJavaPathFinderなどがある。
15
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 2
diff changeset
35 モデル検査を利用する場合は、実際に動作するコード上で検証を行うことが出来る。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
36 OSのソースコードそのものをモデル検査すると、実際に検証されたOSが動作可能となる。
26
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
37 しかしOSの処理は膨大である。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
38 すべての存在可能な状態を数え上げるモデル検査では状態爆発が問題となる。
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
39 状態を有限に制限したり抽象化を行う必要がある。
23
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
40
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
41
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
42 OSのシステムコールは、ユーザーからAPI経由で呼び出され、 いくつかの処理を行う。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
43 その処理に着目するとOSは様々な状態を遷移して処理を行っていると考えることができる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
44 OSを巨大な状態遷移マシンと考えると、 OSの処理の特定の状態の遷移まで範囲を絞ることができる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 15
diff changeset
45 範囲が限られているため、有限時間でモデル検査などで検証することが可能である。
30
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
46 この為にはOSの処理を証明しやすくする表現で実装する必要がある。\cite{hyperkernel}
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
47 証明しやすい表現の例として、 状態遷移ベースでの実装がある。
23
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
24
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
50 証明を行う対象の計算は、 その意味が大きく別けられる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
51 OSやプログラムの動作においては本来したい計算がまず存在する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
52 これはプログラマが通常プログラミングするものである。
28
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
53 これら本来行いたい処理のほかに、 CPU、メモリ、スレッドなどの資源管理なども必要となる。
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
54 前者の計算をノーマルレベルの計算と呼び、後者をメタレベルの計算と呼ぶ。
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
55 OSはメタ計算を担当していると言える。
26
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
56 ユーザーレベルから見ると、データの読み込みなどは資源へのアクセスが必要であるため、システムコールを呼ぶ必要がある。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
57 システムコールを呼び出すとOSが管理する資源に対して何らかの副作用が発生するメタ計算と言える。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
58 副作用は関数型プログラムの見方からするとモナドと言え、 モナドもメタ計算ととらえることができる。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
59 OS上で動くプログラムはCPUにより並行実行される。この際の他のプロセスとの干渉もメタレベルの処理である。
28
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
60 実装のソースコードはノーマルレベルであり検証用のソースコードはメタ計算だと考えると、OSそのものが
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
61 検証を行ない、システム全体の信頼を高める機能を持つべきだと考える。
26
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
657784b3bae1 add slide
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
65 プログラムの整合性の検証はメタレベルの計算で行いたい。
24
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 またメタレベルで検証ががすでにされたプログラムがあった場合、都度実行ユーザーの環境で検証が行われるとパフォーマンスに問題が発生する。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
68 この場合はメタレベルの計算を検証をするもの、しないものと切り替えられる柔軟なAPIが必要となる。
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
28
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
72 プログラムのノーマルレベルの計算とメタレベルの計算を一貫して行う言語として、 Continuation Based C(CbC)を用いる。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
73 CbCは基本\texttt{goto文}で\texttt{CodeGaar}というコードの単位を遷移する言語である。通常の関数呼び出しと異なり、スタックあるいは環境と呼ばれる隠れた状態を持たない。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
74 このため、計算のための情報は\texttt{CodeGear}の入力にすべてそろっている。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
75 そのうちのいくつかはメタ計算、つまり、OSが管理する資源であり、その他はアプリケーションを実行するためのデータ(\texttt{DataGear})である。
28
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
76 メタ計算とノーマルレベルの区別は入力のどこを扱うかの差に帰着される。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
77 CbCはCと互換性のあるCの下位言語である。
28
af160f988ac8 from sigos
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 26
diff changeset
78 CbCは\texttt{GCC}\cite{gcc}\cite{weko_82695_1}あるいは\texttt{LLVM}\cite{llvm}\cite{llvmcbc}上で実装されていて、通常のCのアプリケーションやシステムプログラ厶をそのまま包含できる。
32
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
79 Cのコンパイルシステムを使える為に、 CbCのプログラムをコンパイルすることで動作可能なバイナリに変換が可能である。
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
80 またCbCの基本文法は簡潔であるため、 Agdaなどの定理証明支援系\cite{agda-ryokka}との相互変換や、 CbC自体でのモデル検査が可能であると考えられる。