シェル(UNIX)のイメージのよくある誤解

「シェル」って「カーネルを貝殻(shell)のように包んでユーザとの間を取り持つ」ってことでイメージが作られてるけど、その中身結構テキトーだよね、というちょっとしたまとめ。
25
angel (as ㌵㌤の猫) @angel_p_57

そういえば、シェルとカーネルの関係性ってよくこういう図で説明されるけど、誰得なデマではあるな。 引用元: cc.kyoto-su.ac.jp/~hirai/text/sh… pic.twitter.com/xf2ZfqoiYj

2020-04-19 14:39:45
拡大
angel (as ㌵㌤の猫) @angel_p_57

分かってる人は単純に ( ウソで役に立たないので ) スルーするだけだし、なじみがない人は「へー」で流すだけなんだけど、この図を真に受けてシステムとして理解しようとすると、( ウソなので ) 害がある、って感じ。

2020-04-19 14:50:23
angel (as ㌵㌤の猫) @angel_p_57

ちなみに某所で載せたざっくりポンチ絵だとこんな感じ。 pic.twitter.com/Y3HI7ZostD

2020-04-19 19:41:52
拡大
angel (as ㌵㌤の猫) @angel_p_57

これは、「入出力経路調整」( 要するにリダイレクトやパイプラインのこと ) については盛り込んでないので注意。いや、そこまで描くとおおごとになっちゃうし。

2020-04-19 19:43:55
angel (as ㌵㌤の猫) @angel_p_57

多分、一般的に出回ってる、元の図のようなイメージは、「シェル」っていう言葉をそのまま ( 実態をなーんも考えずに ) 絵にしちゃったんだろうなあ、と思う。 そういうのもあるから、ちょっとした喩え、用語の選択ってのも侮れない。少し間違えただけで誤解まっしぐら。

2020-04-19 19:48:39
angel (as ㌵㌤の猫) @angel_p_57

あ、一般に出回ってるイメージだと、シェルは「通訳」に喩えるのが合ってるように見えるけど、実態は「司会者」に相当するものかな、と思った。敢えて喩えるなら。 あくまで進行指示に応じて色んな人に振って、実際に話をするのは、振られた各担当者。翻訳しながら自分で話をする通訳とは違う。

2020-04-19 19:53:59
angel (as ㌵㌤の猫) @angel_p_57

※注: ここで「人」って言ってるのは「カーネル」ではないので注意。あくまで「シェル」は「アプリの実行管理に特化した1アプリ」であり、「人」ってのは「( コマンドに対応した ) アプリ」のことを指す。

2020-04-19 19:59:49

ここで「『入出力経路調整』については盛り込んでない」に関連して、補足

angel (as ㌵㌤の猫) @angel_p_57

そうそう。入出力周りの話は、以前「標準入力・標準出力ってなに?」という記事に書いていた。「TTYとPTY」とか「シェル上でのコマンド実行」が参考になると思う。 qiita.com/angel_p_57/ite…

2020-04-19 20:25:20
angel (as ㌵㌤の猫) @angel_p_57

それを踏まえて、次のようなクイズ記事も書いてるけど…。フツーにUNIX/Linux技術者なら大丈夫だよね。 ただこれ、「よくあるイメージ」が頭にあると、思い切り間違える可能性高いと思う。 qiita.com/angel_p_57/ite…

2020-04-19 20:27:24

折角なので、じゃあ元のモデルだとあってるんだろうかを検証する方法のデモを追加

angel (as ㌵㌤の猫) @angel_p_57

この図を見て、本気で ( 概要レベルでも ) 妥当と考えてる人って、実態との整合性、どうしてるんだろうか。 こういう説明をよく見かけるから、なんとなくそういうもんかと思っていた、なら分かるんだけど。 twitter.com/angel_p_57/sta…

2020-04-20 21:12:55
angel (as ㌵㌤の猫) @angel_p_57

例えば ls ってコマンド打ち込んで、ファイル一覧が返ってきます、とか。 pic.twitter.com/cOXvWPN6Vf

2020-04-20 21:15:05
拡大
angel (as ㌵㌤の猫) @angel_p_57

まあ、シェルがコマンドを受け取るところはいいとして。シェルがファイル一覧をカーネルから受け取って、良い感じに整形して出力してる…ってことにしかならなさそうだけど。 pic.twitter.com/qR1hlIHJXi

2020-04-20 21:24:03
拡大
angel (as ㌵㌤の猫) @angel_p_57

このモデルが妥当だとすると、肝心のシェルが止まっちゃったら、処理も先に進まない ( カーネルの仕事が終わってもユーザに情報が届かない ) ってことになるよね。

2020-04-20 21:25:43
angel (as ㌵㌤の猫) @angel_p_57

じゃあ、ちょっとなんか試してみるか。 すぐ終わるコマンドだとよく分かんないから、top あたりがいいか。シェル自身のPIDを指定してモニタしてみましょう。 ( 適宜ヘッダは表示を切ってます ) pic.twitter.com/3ztAx1qQHB

2020-04-20 21:28:03
拡大
拡大
angel (as ㌵㌤の猫) @angel_p_57

で、top ってシグナルを送る機能があって、STOPシグナル送るとシェルを止めることができますね。k 入力後、こんな感じで指定します。 pic.twitter.com/TFOU506kyH

2020-04-20 21:29:51
拡大
拡大
angel (as ㌵㌤の猫) @angel_p_57

で、S欄がT になって、シェルはめでたく停止してるんだけど、top は以前出力内容を更新してる ( 左上の時刻とかで分かる )。そりゃそうで、シェルが出力内容の中継なんかしてないから。シェルの停止で出力が止まることはない。 pic.twitter.com/sWetZI4kZ0

2020-04-20 21:32:26
拡大
拡大
angel (as ㌵㌤の猫) @angel_p_57

まあなので、もとのモデルでは全く説明できないわけで、概要レベルで合ってないことになるんだよね。

2020-04-20 21:34:37
angel (as ㌵㌤の猫) @angel_p_57

ちなみに、( シェルに限らず ) アプリとカーネルとの連携は「システムコール」( アプリからカーネルへの処理依頼のAPI ) を追うことで、簡単に見ることができる。Linuxなら strace ( 昔のUNIX系だと truss とかだったけど )

2020-04-20 21:37:08
angel (as ㌵㌤の猫) @angel_p_57

例えば、mv コマンドでファイル移動するようなケースだと ( 状況によって違うけど ) rename というシステムコールが関係する。 pic.twitter.com/Mjq2gRK9dl

2020-04-20 21:38:45
拡大
angel (as ㌵㌤の猫) @angel_p_57

なので、strace してみれば、誰が何を担当してるかは見ることができる。で、じゃあ、こういうモデルなのでしょうか? と。 pic.twitter.com/qJHdTPRedP

2020-04-20 21:41:58
拡大
angel (as ㌵㌤の猫) @angel_p_57

これは慣れてないと読みづらいだろうから、ちょっと抜粋。 pic.twitter.com/Lc6S6bLHuu

2020-04-20 22:02:03
拡大
angel (as ㌵㌤の猫) @angel_p_57

で、赤字にしてるのが mv という「アプリ」がカーネルに依頼して処理を実現しているところ。シェルがなにかやってるわけではなくて、シェルはアプリを起動するところ、mv が実現した処理そのもの。役割分担になっている。 pic.twitter.com/ep967YqWOz

2020-04-20 22:06:40
拡大