第1章 難文書の例
まず難文書とは何を指しているのか、具体例を挙げます。ご自身でタップハイライトしてほしいですが、最初は白黒で読んでみてください。かなり『てごわい』文書たちを用意しました。
1.1 並行計算の説明*1*2
1.1.1 並行計算
1.1.1.1 概要
並行計算(へいこうけいさん、英: Concurrent computing)とは、複数の計算あるいはアルゴリズムを、同一期間に同時実行させつつ相互に同調(コンカレント)させて、次の期間開始までに互いに完遂させるという計算形態を意味している。非同期なメッセージパッシングではその完遂の抽象化も可能になる。対義語は順次計算(シーケンシャル)である。並行コンピューティングとも邦訳される。並行プログラミング(Concurrent programming)とも言われる。並行計算は、コンピュータプログラムやコンピュータネットワークの重要な特性であり、各プロセスの各スレッド制御などがその要点になる[1]。並行計算下の各スレッドは、一定の制約内で他のスレッドの完了を待つことなく同時にそれぞれ進行できる。非同期では他のスレッドの応答も一定の制約内で待たなくてよくなる。エドガー・ダイクストラやアントニー・ホーアが、並行計算のパイオニアとして名高い。
1.1.1.2 イントロダクション
並行計算は、「並列」計算(parallel computing)としばしば混同される。並列計算はマルチプロセッサ前提であり、独立した各「プロセッサ」が割り振られた計算を同時実行することを指す。故にシングルプロセッサでは不可になる[2]。分散システム内の各コンピュータが割り振られた計算を同時実行するのもそうである。並列計算はスループット・パフォーマンス向けとされる。並列計算の対義語はマルチプロセッサのシリアル計算(serial computing)であり[3]、各プロセッサの排他的な計算順序配置が重視される。
並行計算は一つのプロセッサに複数のタスクを存在させて、各タスクに計算を割り振ることを指す[4]。そこではタイムシェアリング技術などが使われる。マルチプロセッサならば、タスクを各プロセッサに分散できるのでより効率的になる[5]。各タスクは協調する相手タスクが別プロセッサの並列性なのか、同プロセッサの並行性なのかを気にしない[6]。いわゆるマルチタスクOSでは、カーネルとアプリケーションプログラムから複数のプロセスやスレッドが生成されて、それぞれがタスクの担い手になる。並行計算はレイテンシ・パフォーマンス向けとされる。並行計算の対義語はシーケンシャル計算(sequential computing)であり[3]、タスクが一つずつ実行される。
並列計算・「シリアル計算」・並行計算・「シーケンシャル計算」の適性は下のようになる。
- 「スレッド」Aの完了後に、スレッドBが実行される(シリアル・シーケンシャル)
- スレッドAと、スレッドBが交互に実行される(シリアル・並行)
- スレッドAと、スレッドBが同時に実行される(並列・並行)
並行計算システムの設計における主要な課題は、タスク間の相互作用や通信の順序付けとタスク間で共有するリソースへのアクセスである。そこではスレッド間通信やプロセス間通信を意識して開発を行う必要があり、通信に用いるプロトコルの開発も必要となる。
1.1.1.3 リソース共有アクセス調整
並行計算の最も身近な課題になるのは、複数のプロセス/スレッドで一つのリソース共有するためのアクセス調整をする並行性制御である[7]。ここでよく取り沙汰されるのは競合状態、デッドロック、リソース欠乏などである。下は共有リソースのコード例である。
図1.1: 普通のハイライト(キーボード利用、単色)
ここでbalance=500としてプロセスAとプロセスBを走らせる。Aがwithdraw(300)を、Bがwithdraw(350)をコールする。Aが2行目をtrueで終えて3行目に入る前に、Bが2行目に入るとbalance > withdrawalはここでもtrueになってしまい、AとBの双方が減算してbalance=-150となり、口座残高以上の金額が引き落とされてしまうことになる。こうしたリソース共有問題の並行性制御では、クリティカルセクションのロック(セマフォ・ミューテックス・モニタなど)同期がよく使われる。
並行システムは共有リソース(通信媒体を含む)に依存しているため、並行計算は一般にリソースへのアクセスに関する何らかの調停回路を実装する必要がある。これにより無制限の非決定性問題が生じる可能性が出てくるが、調停回路を注意深く設計すればその可能性を限りなくゼロに近づけることができる。だが、リソース上の衝突問題への解決策は数々あるが、それら解決策は複数のリソースが関わってきたときに、新たな並行性問題(同期のデッドロックなど)を生じる。非ブロックアルゴリズムはそれらに対応できる並行性制御とされる。
1.1.2 化学結合*3*4
1.1.2.1 概要
化学結合(かがくけつごう、(英: chemical bond)は、化学物質を構成する複数の原子を結びつけている結合である。化学結合は分子内にある原子同士をつなぎ合わせる「分子内結合」と分子と別の分子とをつなぎ合わせる「分子間結合」とに大別でき、分子間結合を作る力を分子間力という。なお、金属結晶は通常の意味での「分子」とは言い難いが、金属結晶を構成する結合(金属結合)を説明するバンド理論では、分子内結合における原子の数を無限大に飛ばした極限を取ることで、金属結合の概念を定式化している。
分子内結合、分子間結合、「金属結合」のいずれにおいても、化学結合を作る力は原子の中で正の電荷を持つ原子核が、別の原子の中で負の電荷を持つ電子を電磁気力によって引きつける事によって実現されている。物理学では4種類の力が知られているが、電磁気力以外の3つの力は電磁気力よりも遥かに小さい為、化学結合を作る主要因にはなっていない。したがって化学結合の後述する細かな分類、例えば共有結合やイオン結合はどのような状態の原子にどのような形で電磁気力が働くかによる分類である。
化学結合の定式化には、複数の原子がある場合において電子の軌道を決定する必要があり、そのためには量子力学が必須となる。しかし多くの簡単な化合物や多くのイオンにおいて、化学結合に関する定性的な説明や簡単な定量的見積もりを行う分には、量子力学で得られた知見に価電子や酸化数といった分子の構造と構成を使って古典力学的考察を加える事でも可能である。
それに対し複雑な化合物、例えば金属複合体では価電子理論は破綻し、その振る舞いの多くは量子力学を基本とした理解が必要となる。これに関してはライナス・ポーリングの著書、The Nature of the Chemical Bondで詳しく述べられている。
1.1.2.2 分子内結合
古典力学的な説明
分子間力が働く機構を定性的に説明すると下記のとおりになる。分子内にある「原子」は、原子Aの「原子核」と原子Bの「電子」との間に働く電磁気的な力F1により引きつけられ、これがAとBの間の分子内結合を構成する引力となる。それに対し、原子Aの原子核と原子Bの原子核の間には電磁気的な