powershellはどういう仕組みで動いているか
この記事では、powershellはどのような技術/仕組みかについて自分の理解をまとめます。
ユーザー側のプロセスとして動作する
powershellはwindowsにもとから入っています。一見するとOSの機能に見えますが、そうではありません。ユーザープロセスとして動作します。1
powershell.exeは「アプリ」の欄にありますね。下の方にある「windowsプロセス」という欄がOS側のプロセスですので、powershellはユーザー側のプロセスということになります。
ここで気になるのは、windowsターミナル(wt.exe)の子プロセスになっている点です。powershell.exeをダブルクリックして立ち上げてもこのような状態になります。なぜでしょうか?
下図に従って説明していきます。

立ち上げる時の仕組み
そもそもexeとは、PE形式の実行バイナリです。
PE形式のデータ構造の規格として、GUIアプリかCUIアプリかを表すデータを詰めることが決まっています。(参考:公式ドキュメント)
GUIアプリの場合、exeのなかに「これくらいの大きさの、こういうウィンドウをつくる」プログラムが記述してあります。それに従ってウィンドウをつくるという動作になります。
CUIアプリの場合、「hello, worldと表示」くらいのプログラムしかなく、ウィンドウをどう作ったらいいのかなどを管理するための命令がexeにありません。ですのでOS側でウィンドウを作るためwt.exeを立ち上げ、その子プロセスとしてCUIアプリを立ち上げます。
CUIアプリのウィンドウにフォーカスして文字を入力すると、入力された文字は一旦wt.exeが受け取った後hello_CUI.exeに渡します。こうしてCUIアプリは動いているわけです。
(絵からわかると思いますが、wt.exe自身はGUIアプリです)
補足:CUIアプリのウィンドウをつくるもう一つのソフト
windowsターミナル(wt.exe)のほかにも、同じような機能を持ったソフトがあります。windowsコマンドプロセッサ(conhost.exe)です。
この2つはターミナルと呼ばれるジャンルのソフトウェアで、CUIのウィンドウを作ったり背景の色を決めたりしています。
powershellはシェルと呼ばれるジャンルのソフトウェアで、ターミナルとシェルはよく混同されるみたいです。
また、CUIアプリを立ち上げる時にwindowsターミナルを使うのか、windowsコマンドプロセッサを使うのかはwindowsターミナルの設定から選べます。

conhost.exeのほうが機能が少ない分依存関係が少なく、安定して動作するようです。(例えばGPUドライバが死んでいるときにも動作するらしい)
ちなみに、windowsターミナルもwindowsコマンドプロセッサもオープンソースになっています。
src/hostがwindowsコマンドプロセッサ、src/terminalがwindowsターミナルのソースであるようです。こちらの内部まで調査した記事もいずれ書きたいと思っています。
まとめ
- ユーザー空間のプロセスであり、ターミナルソフトの子プロセスとして動作する。
最後までお読みいただきありがとうございました。
-
プロセスとは何かについて、概要はわわわIT用語辞典をお読みください。参考:わわわIT用語辞典「プロセス」 ↩

