2020年4月19日

シェル(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
拡大
残りを読む(8)

コメント

angel (as ㌵㌤の猫) @angel_p_57 2020年4月19日
入出力関係で補足を入れてまとめを更新。
0
苺花見に欲をかけたらラッキー7 @adgjmpt_1011110 2020年4月20日
最初の画像のどこがどう間違ってるのか説明しないの?
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
[c7631018] 当然ですけど「相手のレベルに関わらず最初の図だと間違い」という認識なので突っ込んでいるわけで。あとは「厳密にいえばその図も違う」については、具体的な点を挙げて頂けると助かります。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
adgjmpt_1011110 希望があれば説明するのは構いませんけど、既に最初の図と全く違う別の図を提示しているわけで。「間違ってるポイントを挙げて直してもらう」より、「間違ってるので捨てようね」な扱いなので、必要性は薄いかなあ、と。
0
苺花見に欲をかけたらラッキー7 @adgjmpt_1011110 2020年4月20日
「間違ってるから間違ってる」だけでは理解も納得もしにくいな、と思った次第。あと「間違った図」は「間違った解釈」から生じたものだろうから、「正しい図」を示したところで「間違った解釈」は治らないんじゃないかなぁ、と。
2
マサ@撮影依頼、大・大募集中 @kinrei_suzuki 2020年4月20日
シェルがカーネルへの中継役なのは正しい。「TTY/PTY」が基点でシェルは実行結果を返さない(アプリがTTY/PTYに返し、TTY/PTYがターミナルへ表示等する)と正誤の絵から読み取った。 「シェルを実行するとアプリが動き、シェルがアプリの実行結果を受け取ってターミナルに表示する」との認識はユーザなら問題ないが、開発者としては駄目よ、との事かな。 さて「TTY/PTY」が分からないのでググるか……
3
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
adgjmpt_1011110 「納得できない」のは @adgjmpt_1011110 さんのお話ですか? いえ、希望があれば答えますけど。一般論なら、それはその人次第なんじゃないかと。 > 「間違った図」は「間違った解釈」から生じた いや、空想レベルなので、これ。空想に対して「間違ってる理由」って言われても厳しいんですよね。なので、「虎を退治するには、まず虎を追い出してください」位の要求はしますね。 ※というか、これ、自分で考えて作ってる人はもういないでしょう。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
kinrei_suzuki はい。その読解で問題ありません。もう1つ言うと、カーネルとアプリは対立概念なので、「コマンドに応じてアプリを起動する」というシェルの主目的に対して、カーネルだけで完結してるような絵はありえないです。
0
苺花見に欲をかけたらラッキー7 @adgjmpt_1011110 2020年4月20日
angel_p_57 「間違っている理由」ではなく「どこがどう間違っているのか」の説明はしないのか、という話でしたよね。エビデンスを求めるのは割と一般的な話では?
2
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
adgjmpt_1011110 ん? だって、「こっちが合ってますよ」って絵出してますし。まずはそれを見て、じゃないんでしょうか。( 実際ちゃんと見てる人とは続きの話もできるので ) あと、「エビデンス」は、元が同レベルの話の時に意味をなすもので、繰り返しになりますが、もとが「空想」なものに、否定のためのエビデンスを求められても困るんです。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
[c7634168] 「概念図」の妥当性も分からないなら、もうちょっと勉強された方が良いかと。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
[c7634168] あと、そうですね。「蛇足」って故事があるんですけど、検索して調べられることをお勧めします。
0
苺花見に欲をかけたらラッキー7 @adgjmpt_1011110 2020年4月20日
angel_p_57 まとめタイトルに「よくある誤解」ってあるからそこがメインだと思ったんだけど、「図示したからそれでいい」って言われると混乱する。
3
くぁwせdrftgyふじこlp @wickid101 2020年4月20日
そりゃまぁ、厳密な話をすれば必要だけど構成概念で端末制御の話は必要ないしなぁ。抽象概念図なんだから細かいアーキテクチャの話はどうでもいいし...
1
くぁwせdrftgyふじこlp @wickid101 2020年4月20日
後は非Unix系のOSにも適用できるモデルと言うのもあるかな。Kernel(OSコア)-Shell(インターフェース)の概念はいまのところ概ね共通だし。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月20日
検証のデモを追加し、まとめを更新しました。
0
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
angel_p_57 検証お疲れ様です。ただ、モデルの話とは目的がずれていますね、最初のモデルは自由落下における「ただし空気抵抗は無いものとする」と本質的には同じです。現実の実装とは(極論すれば)無関係ですよ。最後に追加されたTweetで自覚されているようですが。
2
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
同じロジックで「Read/Write部分が何をしているのかメモリやプロセスの情報無いから説明できないでしょ?」とか重箱の隅を楊枝でほじくることも可能ですが、あまり意味が無いですね。それと同じです。 まぁ、世のモデル図に反逆するのはご自由にとしか。多分、同じようなこと考えた人も過去にいたと思いますが、構造の説明としては「蛇足」なので廃れたんだと思いますよ。
1
angel (as ㌵㌤の猫) @angel_p_57 2020年4月21日
wickid101 ごめん、それどこの世界のロジックかわらない。 私、すごい単純な話しかしてないんですけど…。「シェルはユーザとの間に立ってコマンド受け取って処理結果返してますよ」「じゃあそれで ls 打って結果が返るの説明できてますか? できてませんね、要約として失敗ですね」ってだけの話をどれだけ難しく考えられてます??
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月21日
[c7636223] あの、教材は提供しましたから、じっくり勉強なさってください。元の絵にそんなに思い入れがあったのなら申し訳ないんですけど、別にあなたが作ったわけでもないでしょうに。プライド捨ててまで拘らなくても…と、思います。
0
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
angel_p_57 なるほど。モデル化=要約 と理解されているからですか。 要約とモデル化は異なる概念なので、その部分を説明する情報自体を目的としていない。が解になるかと思います。 意図的に情報を欠損させている訳ですね。
0
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
angel_p_57うーん... 世の大半の人はその質問でも「そうですね、説明できないですね。でもその話をするのが目的じゃないんで」って返すと思いますよ(モデル図が流通しているので実際にもそうしている)。Kernel-Shell-I/F の関係性のみを説明するのに何ら支障が無いので... もちろん、実際のコマンドの挙動の説明であれば、あなたと似たような説明をするでしょうね。
0
angel (as ㌵㌤の猫) @angel_p_57 2020年4月21日
wickid101 そこらへん、「抑えて言っておけば全然ウソじゃない」「自身の無理解を棚に上げた言い訳」と言うのを既に挙げているので、これ以上申し上げることはないような。もはや言葉遊びの領域に入られてるように感じます。
0
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
angel_p_57 抽象化はそう言う行為なので言葉遊びだと理解されているならそれでもいい気もしますが、多分理解できる人が極小かと... 不思議なのはシステムコールの情報を含めているのに、メモリの概念が欠けているのはスルーしていますよね。その辺りはどのように整合性が取られているんですか?
0
くぁwせdrftgyふじこlp @wickid101 2020年4月21日
(「電流の向き」とかも納得できなさそうな人だな...)
0