シェル(UNIX)のイメージのよくある誤解
- angel_p_57
- 8673
- 57
- 1
- 0
そういえば、シェルとカーネルの関係性ってよくこういう図で説明されるけど、誰得なデマではあるな。 引用元: cc.kyoto-su.ac.jp/~hirai/text/sh… pic.twitter.com/xf2ZfqoiYj
2020-04-19 14:39:45分かってる人は単純に ( ウソで役に立たないので ) スルーするだけだし、なじみがない人は「へー」で流すだけなんだけど、この図を真に受けてシステムとして理解しようとすると、( ウソなので ) 害がある、って感じ。
2020-04-19 14:50:23ちなみに某所で載せたざっくりポンチ絵だとこんな感じ。 pic.twitter.com/Y3HI7ZostD
2020-04-19 19:41:52これは、「入出力経路調整」( 要するにリダイレクトやパイプラインのこと ) については盛り込んでないので注意。いや、そこまで描くとおおごとになっちゃうし。
2020-04-19 19:43:55多分、一般的に出回ってる、元の図のようなイメージは、「シェル」っていう言葉をそのまま ( 実態をなーんも考えずに ) 絵にしちゃったんだろうなあ、と思う。 そういうのもあるから、ちょっとした喩え、用語の選択ってのも侮れない。少し間違えただけで誤解まっしぐら。
2020-04-19 19:48:39あ、一般に出回ってるイメージだと、シェルは「通訳」に喩えるのが合ってるように見えるけど、実態は「司会者」に相当するものかな、と思った。敢えて喩えるなら。 あくまで進行指示に応じて色んな人に振って、実際に話をするのは、振られた各担当者。翻訳しながら自分で話をする通訳とは違う。
2020-04-19 19:53:59※注: ここで「人」って言ってるのは「カーネル」ではないので注意。あくまで「シェル」は「アプリの実行管理に特化した1アプリ」であり、「人」ってのは「( コマンドに対応した ) アプリ」のことを指す。
2020-04-19 19:59:49ここで「『入出力経路調整』については盛り込んでない」に関連して、補足
そうそう。入出力周りの話は、以前「標準入力・標準出力ってなに?」という記事に書いていた。「TTYとPTY」とか「シェル上でのコマンド実行」が参考になると思う。 qiita.com/angel_p_57/ite…
2020-04-19 20:25:20それを踏まえて、次のようなクイズ記事も書いてるけど…。フツーにUNIX/Linux技術者なら大丈夫だよね。 ただこれ、「よくあるイメージ」が頭にあると、思い切り間違える可能性高いと思う。 qiita.com/angel_p_57/ite…
2020-04-19 20:27:24折角なので、じゃあ元のモデルだとあってるんだろうかを検証する方法のデモを追加
この図を見て、本気で ( 概要レベルでも ) 妥当と考えてる人って、実態との整合性、どうしてるんだろうか。 こういう説明をよく見かけるから、なんとなくそういうもんかと思っていた、なら分かるんだけど。 twitter.com/angel_p_57/sta…
2020-04-20 21:12:55例えば ls ってコマンド打ち込んで、ファイル一覧が返ってきます、とか。 pic.twitter.com/cOXvWPN6Vf
2020-04-20 21:15:05まあ、シェルがコマンドを受け取るところはいいとして。シェルがファイル一覧をカーネルから受け取って、良い感じに整形して出力してる…ってことにしかならなさそうだけど。 pic.twitter.com/qR1hlIHJXi
2020-04-20 21:24:03このモデルが妥当だとすると、肝心のシェルが止まっちゃったら、処理も先に進まない ( カーネルの仕事が終わってもユーザに情報が届かない ) ってことになるよね。
2020-04-20 21:25:43じゃあ、ちょっとなんか試してみるか。 すぐ終わるコマンドだとよく分かんないから、top あたりがいいか。シェル自身のPIDを指定してモニタしてみましょう。 ( 適宜ヘッダは表示を切ってます ) pic.twitter.com/3ztAx1qQHB
2020-04-20 21:28:03で、top ってシグナルを送る機能があって、STOPシグナル送るとシェルを止めることができますね。k 入力後、こんな感じで指定します。 pic.twitter.com/TFOU506kyH
2020-04-20 21:29:51で、S欄がT になって、シェルはめでたく停止してるんだけど、top は以前出力内容を更新してる ( 左上の時刻とかで分かる )。そりゃそうで、シェルが出力内容の中継なんかしてないから。シェルの停止で出力が止まることはない。 pic.twitter.com/sWetZI4kZ0
2020-04-20 21:32:26ちなみに、( シェルに限らず ) アプリとカーネルとの連携は「システムコール」( アプリからカーネルへの処理依頼のAPI ) を追うことで、簡単に見ることができる。Linuxなら strace ( 昔のUNIX系だと truss とかだったけど )
2020-04-20 21:37:08例えば、mv コマンドでファイル移動するようなケースだと ( 状況によって違うけど ) rename というシステムコールが関係する。 pic.twitter.com/Mjq2gRK9dl
2020-04-20 21:38:45なので、strace してみれば、誰が何を担当してるかは見ることができる。で、じゃあ、こういうモデルなのでしょうか? と。 pic.twitter.com/qJHdTPRedP
2020-04-20 21:41:58これは慣れてないと読みづらいだろうから、ちょっと抜粋。 pic.twitter.com/Lc6S6bLHuu
2020-04-20 22:02:03で、赤字にしてるのが mv という「アプリ」がカーネルに依頼して処理を実現しているところ。シェルがなにかやってるわけではなくて、シェルはアプリを起動するところ、mv が実現した処理そのもの。役割分担になっている。 pic.twitter.com/ep967YqWOz
2020-04-20 22:06:40