Effective-Concurrency-in-Go、速攻で挫折。
最近は、数日Effective-Concurrency-in-Goを読んでいました。
その前にgRPC Go for Professionals を読んでいて、Contextを使用した実装が出てきたのですが、どうにも理解できませんでした。gRPC Go for Professionalsを読む目的は、gRPCを理解することなのでContextについては、雰囲気でなんとなくで先に進めてもよかったのですが、雰囲気で進めるとどっかで行き詰まり感でます。
なので、いったん、gRPC は置いておいて、並列処理、並行処理まわりについてきちんと理解してみようと思いました。
そこで、Effective-Concurrency-in-Goを読み始めたわけですが、しかし、Effective-Concurrency-in-Goの並列処理、並行処理の概論部分がまるで理解できない。
なんで理解できないか?と考えていたところ、どうやらプロセスやらスレッドのことが理解できていないからではないかを思いました。
プロセス、スレッドについてはまずは概念的に理解した上で並列処理、並行処理に入った方がすんなりいけるんじゃないかと。
そこで、こちらの講義を試聴しました。
初回から順に聞いていきまして思いかけず感動的な講義内容だったので、講義の雑感と本題であるプロセスやらスレッドのことなどをまとめてみました。
計算機システム概論 第14回「計算資源(CPU)の管理:プロセスとスレッドの利用」 - YouTube
本記事は、↑の講義内容を自分なりに勉強のためにまとめたものですので、詳しくは講義をご視聴ください。
計算機の原理と構造
まずは、計算機(コンピュータ)の原理と構造から講義は始まります
講義の冒頭で 「計算機は、人間と同様に知的な問題解決を行う能力を持つ機械」 と説明されます。
ここだけではピンとこないかもしれません。
そこでまずは、「人間の知的な問題解決とは何か?」についてを理解していきます。
人間の知的な問題解決と計算機
人間の知的活動(言語を用いた思考)については、以下のように定義しています。
ある情報を有限なシンボル列(文)で表現し,一時的に種々の文を中間的に生成,利用しながら,別の情報を表現 する文を生成する作業.
有限なシンボルおは、アルファベットや五十音、漢字などの言語のことですが、シンプルにいえば人間の知的活動は有限なシンボル を操ることで行なっている、ということかと思います。
では、計算機はどうかというと
コンピュータによる情報処理
データや処理手順(情報)をコード化,すなわち通常 {0, 1}のシンボルの列で表現し,そのコードをプログラムによっ て処理し,別な情報を表すコードを生成する作業.
人間はアルファベットや五十音、漢字などの言語によって情報を表現しますが、同じようにコンピュータは0,1で表現します。
つまり、扱うシンボルが異なるだけで、「種々のシンボルを中間的に生成,利用しながら,別の情報を表現する」という構造においては同じですよね。
うわーーなるほど、と感じ入りました。
これまで、計算機入門的な本をいくつか読んでみたのですが、計算機ってイマイチ腹落ちしてませんでした。
しかし、計算機が人間の知的活動と同じ原理で動いている。という理解は脳汁でますね。
OS
続いてはOSの話に移ります。
講義では計算機の理論的な説明をこの後続けているのですが、今回のテーマはプロセスとスレッドなので割愛します。
講義ではOSの目的について以下のように定義しています。
OS の目的:より高機能なより使いやすい計算機の実現
人間の知的な問題解決と計算機の原理を理解した後だと、この定義もすんなり理解できますね。
計算機それ自体は、人間の知的活動と同じ原理と構造であるのでプログラムを書いてあげれば、原理的にはなんでも計算できるというわけですが、要は計算機だけだと使い勝手が悪い、効率が良くないというわけですね。
そこでOSにより効率的に、より多くの、より早く計算させることができるという話です。
計算機を抽象化して理解しておくとOSの話、つながりますね。
資源の管理者としての OSと仮想計算機としての OS
では具体的にはOSが何をしているのか?について、押さえておきましょう。
講義では、2つの視点でOSを定義しています。
講義スライドから引用 2つの観点から定義されていますが、目的は同じ、すなわち「より高機能なより使いやすい」コンピュータを実現することです。
プロセス
では、ようやく本題のプロセスに入っていきましょう。
プロセスの考え方
講義では「プロセス = システム内で実行中の「仕事」」という定義をした上で、日常生活を例にしながら、プロセスについて説明しています。
日常生活の中で、たとえば
- 子供にご飯を食べさせる
- 技術書を読む
- 酒を飲む、ビール飲む
などなど、いろんなことを行なっているわけですが、これらの日常生活での行動は
それぞれ持続した独立の処理単位 それぞれを並行して実行する必要がある
という性質をもっていますよね。いろんなタスクを中断したり、再開しながら日常を送っているわけです。
この構造は、コンピュータに置き換えても同じです。
コンピュータがさまざまなタスクをより効率的に進めるために、タスクに応じてCPUを割り当てたり、スケジュールをしているわけです。
というわけで定義に戻りますが、プロセスというのは、システム内で実行中の「仕事」というわけですね。
プロセスの実体
では、概念的な話をおさえた上でプロセスの実体について見ていきましょう。
まず、計算機は、メモリ上にプロセスの実行状態を保持する領域を確保します。
で、そのプロセスの実行状態を保持する領域をPCB(プロセス制御ブロック)と呼び、PCBが プロセスの実体です。
講義スライドから引用
プロセスを実行するとは、PCBに保存されたCPUの状態をレジスタにロードすることですが、先程の日常生活の例と同じく、プロセスは中断されたり再開されたりしながら進行していきます。
こうすることで、CPUを効率的に使っておるというわけです。
概念的な話だけだと、シンプルなお話ですね。
スレッド
続いて、スレッドです。 講義の中での定義では「スレッドとはプロセス内の並列な実行単位」と定義しています。
スレッドの説明に入る前に、スレッドのコンセプト的な部分を押さえておきましょう。
並行処理
講義スライドから引用
逐次プログラムとありますが、図の通り、順々に実行されるプログラムですが、一つ一つの処理は別に順々に実行しなくてもよいものもある、それなら同時に実行してしまえ!という感じですな
スレッドの実体
並行処理を実現するにあたっては、スレッドしか実現方法がないわけではない、子プロセス方式という形でも実現できるらしいです。
しかし、子プロセス方式ではコンテキストスイッチのためのコストがスレッドに比べ高いらしく、今はほとんどのOSがスレッド方式を採用しているとのことでした。
なぜ、スレッドの方がコストが低いか?ですが、図の通りプロセスと共有しているのが、レジスタとスタックポインタなので、切り替えが早いらしい。
まとめ
以上、プロセスやらスレッドのことなどについて講義の内容をまとめながらざっと書いて見ました。
詳細な話に突っ込めばもっともっと深い話になるのでしょうが、今回はコンセプトと目的をざっくりと理解できたので目的は達成できました。
講義は14回までしかみていないので、続きをみてまたまとめていきたいと思います。 本当に感謝ですね、この講義、、。
僕から以上。あったかくして寝ろよ。