プロセスとは
プロセスとはプログラムの実行単位を指すらしいです。
でもそう言われても正直なんのこっちゃ?なんですよね…
ということで可能な限り可視化できるように簡単な実験をしてみました。
プロセスの確認方法
Windowsの場合はタスクマネージャを開くことによって、現在どのアプリ・プロセスが動いているのかを確認できるようになっています。
タスクマネージャはCtrl + Shift + Esc
で開けます。
現在アプリとして起動しているのはタスクマネージャ、エクスプローラ、Edgeの3つですね。
バックグラウンドプロセスと書いてあるものは名前の通り裏で動いてくれているプロセスです。
ウイルス対策ソフトなんかがわかりやすいですかね。
画面を表示する必要はないけど裏で処理として動いているよ。みたいなやつです。
Excelで実験
正直アプリはなんでもいいのですが、ひとまずExcelファイルを2つ用意しました。
このファイルを2つとも開いてみましょう。
Excelファイルが開かれました。
ここでタスクマネージャを確認してみます。
Excelが増えてますね。
今回は2つのファイルを開いていますが、アプリケーションとしてはMicrosoft Excelという1つの大きなカテゴリで括られています。
ここでブック1とブック2の関係性を見ていきたいので、ブック1で条件付き書式を開いてみます。
条件付き書式の設定ダイアログはモーダルなので、ダイアログを閉じない限り本体のブック1は操作できません。
この状態でブック2を操作しようとしたらどうなるでしょう?
実は操作できないんです。
(キャプチャじゃ伝えようがないので割愛。よかったらご自身のPCで試してみてください。)
タスクマネージャも見てみましょうか。
直感的にはブック1の下にダイアログが従属していそうですが、ブック1・ブック2と同じ階層にいますね。
条件付き書式のターゲットは間違いなくブック1なんですけど、モーダルの影響範囲でいうとブック1、ブック2の両方が含まれるみたいです。
では、現状の状態はこのままにして今度はExcelを新しく管理者として実行してみましょうか。
新しく管理者権限の新規ブックが立ち上がりました。
ブック1でモーダルダイアログを開いているので新しく起動したファイルも操作できなさそうな気がしますが…
操作できるんですね。
タスクマネージャを見てみます。
ブック1・ブック2とは別でExcelのアプリが増えていますね…
更に細かい情報が見たいので詳細タブを見てみましょう。
プロセスごとに割り振られたID(PID)を確認できるのですが、ここに違う値が設定されているのがわかりますね。
つまり今回の場合、一般ユーザ権限で開いたブック1とブック2は同じプロセスになっており、管理者権限で開いた新しいブックは別のプロセスになっているということです。
結果を踏まえて
上記からプロセスの位置づけについてなんとなくご理解いただけたのではないかと思います。
もう少しだけ深堀にお付き合いください。
プロセスはOSにより管理されています。なのでプロセスを立ち上げる指令を出すのもOSです。
OSは新規プロセスを起動する際にプロセスが作業を行うためのメモリを確保してあげます。
現実に例えると
メモリ → 勉強机
プロセス→ 参考書
といったところでしょうか。
参考書を使って勉強するためには、勉強机に参考書を置けるだけのスペースを確保してあげる必要がありますよね。
その際にどれくらいのスペースを確保する必要があるのかというのは参考書によって異なりますし、勉強机の広さも環境によって異なります。
1つの勉強机に対して同じ参考書を複数開いて置いておくこともできますが、その場合は2冊分のスペース確保が必要になります。
そんなことをしていたらすぐに勉強机がいっぱいになってしまって他の参考書を置くことができなくなってしまうので、用途も同じ参考書に関しては同じところに重ねて置くことでスペースを削減しているわけです。
現実だと同じ参考書を綺麗に重ねてあげればスペースはきれいに1冊分で済むかもしれませんが、プロセスの場合そうはいかないのでOS
にお願いをしてちょっと多めにメモリを確保してもらうことで極力メモリ領域を圧迫しないようにしています。
プロセスとは(定義の再確認)
ここで冒頭にてお伝えしたプロセスの定義を再確認しますが、プログラムの実行単位となっていましたよね。
Excelの場合、親玉となるプログラムはProgramFiles内に配置されているEXCEL.EXE
です。
Excelのブックを開くとまずこのEXCEL.EXE
が実行されます。
するとOSがEXECL.EXE
を動作させるために必要なメモリを確保しに行きます。
この状態で別ブックを開いてみると操作直後だけ新しいプロセスが立ち上がりますが、既存プロセスと統合できると判断された場合は新規プロセスを開放しています。
こういった経緯を経てブック1とブック2は同一プロセスとなり、メモリ空間を共有することで冗長なメモリを削減したわけです。
逆に管理者権限の場合に別プロセスなのは、あえてメモリ空間を共有したくないからです。
同じプロセスにすると一般ユーザ権限ではアクセスしちゃいけない資材を触れちゃったりするのがアウトなので、その辺の定義諸々の設定なんかを独立することで排他する目的があるんだと思います。
メモリ空間を共有することによる弊害はそれだけではありません。
プロセスの定義がプログラムの実行単位となっている通り実行プログラム自体も共有している状態ですから、ブックが1つでもフリーズすると同じプロセス内のブックも全てフリーズしますし、エラー落ちしたら全ブックがお亡くなりになるわけです。
別プロセスで起動されているものに関してはこのような場合でも影響を受けないので、状況・用途に応じて適切な管理が求められます。
なのでEdgeなどのブラウザ系はタブごとにプロセスを独立させることで、どれか1つがクラッシュしても他のタブが影響を受けないような作りになっていることが多いです。
まとめ
今回はプロセスについてまとめてみました。
自分はプログラマなのですが、こういった基礎の概念が自分のソースコードにも多大な影響を及ぼすんですよね…
この記事を機に改めて再認識できてよかったと思います。
最後までご覧いただきありがとうございました。