男「OSの話をしよう」(48)
#亀進行です
女「唐突に何を言い出すかと思えば」
男「ここに新品のパソコンがあります」
女「はい」
男「最初にすることといえば?」
女「使うための初期設定」
男「その通り。しかしそれより先にやることがある」
女「何をすればいいの?」
男「あなたとarch、今すぐインストール」
女「なにそれ、archって?」
男「気にするな、言ってみたかっただけだ」
男「それはさておき、一番始めにやるのは、『電源ボタンを押す』だろう?」
女「そっかぁ、確かに」
男「次に、初期設定画面がでて、いろいろ設定するわけだな」
女「うん」カチャカチャ
男「そもそも、電源をつけるだけでパソコンが使えるなんて、凄いと思わないか?」
女「うん」カチカチ
男「そこで、まず電源をつけてからパソコンが使えるようになるまでを説明しようと思う」
女「うん」ピボン
男「話聞いてる?」
女「うん」テッテレー
男「聞いてないだろ」
女「だって、また面倒くさい話が続くんでしょ?」
男「う…なるべく簡単にするから」
女「よろしい」
期待
男「よし、じゃあ電源ボタンからだな。電源ボタンといってもそんな難しい訳じゃない、用は押してる間だけ通電するスイッチだ。わかるな?」
女「通電って電気が流れるって事だよね?」
男「その通り。電化製品は電気がなきゃ動かないからね」
女「電気が流れるとどうなるの?」
男「CPUに電気が流れ始めて、周辺機器、つまりCDドライブとかHDDとかディスプレイとの接続が始まる」
男「まあ、ここら辺は難しいし、電気回路の話になってくるから飛ばす。俺もよくわかってないし」
女「ここら辺は難しいって、ここからも難しいくせに」
男「簡単にするからー」
男「なんやかんやあって、記憶装置、つまりHDDとかCDとかUSBメモリだな、それが見つかったとしよう」
男「ここまではわかるな?」
女「まあなんとなく」
男「よし。次からが難しいんだが、CPUは次に実行する命令をここで見つかった記憶装置の先頭から読み出すんだ」
女「うーん…つまり?」
男「そうだな、普通のパソコンに最初に付いてるのはHDDしかないから、HDDが見つかったとしよう」
女「ふんふん。このパソコンもそのタイプだね」
男「CPUには今実行している命令がどこにあるかを指し示すものが内蔵されてて、それの指し示す先をHDDの先頭にしたって事だな」
女「質問でーす、HDDに先頭も最後もあるんですか?」
男「ふむ。あるんだよ、といってもわからないだろうから例を挙げて説明するか」
男「HDDというのはページ数の書かれたノートみたいなもので、最初のページと途中のページと最後のページがあって、自由に書き込める」
男「で、CPUが実行する命令が1ページ目の1行目に書かれてて、そこに合わせるんだ。わかった?」
女「つまり、本を読むような感じだね」
男「まあ、ニュアンスはそんな感じだな」
ガラケのバッテリーがないからここまで
参考書籍は
30日でできるOS自作入門
12ステップで作る組み込みOS
などです
まだOSの話に行ってないというね
>>10
その通りです
HDDのページ==本のページは我ながら上手い例えだと思いました
あと話すのは本当にあっさりとしたOSの概念だけなのでページングとか知っているようであれば得る物はないかもしれません
なにより話そうとすると時間が足りない
>>12
(時間はいくらかかっても)ええんやで
この前のコンピューターの話の人かな?
男「で、1ページの1行目に書かれてる命令を実行するわけだが、HDDは非常に遅い」
女「それは前聞いたね」
#聞いてないという人は今すぐ
#男「コンピュータの話をしよう」
#にGO!
男「だから、HDDのデータをメモリにコピーする。HDDが本ならメモリはkindleみたいな電子ペーパーだな。違いはアクセスにかかる速度と、メモリは電源を切ると内容が消えることくらいか」
男「OSはHDDに保存されてるから、何とかしてメモリ上にコピーしなきゃいけない。それをするのが最初の命令だ」
女「紙の本をkindleで読めるようにするわけね」
男「そうだな。1ページから10ページにOSが保存されてるとすると『この本の1ページの最初から10ページの最後までkindleの3ページから13ページにコピーしろ。次にkindleの3ページ目にある最初の命令を実行しろ』と書いてあるわけだ」
女「なんで3ページ目からなの?」
男「聞かないでくれ…それを説明しようとするとBIOSとかブートローダとかメモリマップとかを説明しなきゃならないんだ」
女「うわっ、知らない単語がたくさん出てきた。でも男なら易しく説明してくれるんでしょ?」ジー
男「そんな目で俺を見るな」
男「いいか…(省略)
女「なるほどー。これでやっとOSが実行されるんだ」
男「ふう、やっと本編だ。ところで今パソコンで何してる?」
女「んっとー、インターネット開いてわかんない単語調べてる」
男「どれどれ、今開いてるのはIEとメモ帳、マインスイーパか」
女「マインスイーパ面白いよね」
男「余り得意じゃないんだよな…。とにかく、目に見えるソフトだけでも今3つのソフトが動いてるな」
女「それがどうかしたの?」
男「どうかしたのじゃないよ、凄いことなんだよこれは!」
女「そんな興奮しないでー。でも何がどう凄いの?」
男「説明しよう」
男「前にも説明したけど、CPUは基本一度に一つの命令しか実行できない。ということは?」
#今すぐ
#男「コンピューターの話をしよう」
#(ry
女「うーん……その心は?」
男「基本的に、一つのプログラムしか動かせない。ここではプログラム=ソフトだと思ってくれ」
女「でも実際動かせてるじゃん」
男「そこだよ」ビシッ
女「うわっ」
バッテリーがないので終わり
凄くはしょってるからわかりづらいと思います
切りが悪くてごめんなさい
今気づいたけどIDわりとすごいな
おすすめのウィンドウマネージャはxmomadです
なのでみんな使いましょう
>>21
xmonad使ってるけどghcのコンパイルが重い
Gentoo使いなので慣れてはいるが
いつかHaskell勉強する
こんなところにGentoo民Haskell使いの溜まり場があるとは
画面2つでxmonadが快適すぎる
男「なぜ複数のプログラムが同時に実行できるかというと、OSが頑張ってるからなんだよ」
女「OSが頑張ってるって、どういうこと?」
男「うん、実はOSも数あるプログラムの一つにすぎないんだ。NHKで、基本ソフトって言っているのを聞いたことないか?」
女「あー、あるかもしれない」
男「基本ソフトって言うのは、つまりOSの事で、ソフトって言うからにはプログラムの一種。だけどちょっと…いや、かなり特別だから、わざわざ基本ってつけてる」
女「どこが特別なの?」
男「OSは、『複数のプログラムを同時に実行する』プログラムなんだよ。だから、いろいろなことが同時に出来るんだ」
女「ふーん、だからインターネットとメモ帳とマインスイーパが出来るんだ」
#あなたとarch、今すぐインストール
男「そうだな、CPUはまず基本ソフトであるOSを実行する。そしてOSがユーザーからの要求によってプログラムを実行したり終了したりするんだ」
女「私がメモ帳のアイコンをクリックして、OSにメモ帳を使いたいって要求するんだね!」
男「そのとおり。終了するときは、まあなんでもいいんだけど右上のxボタンをクリックするよな。そうするとOSが、あ、これはもう使わないんだな、って認識して終了させるんだ」
女「そういう仕組みだったのかー」
男「ここで疑問に思うことがあるだろ?」
女「ないよ?」
男「あるの!OSを実行してるはずのCPUがどうして別のプログラムを実行できるのか、とか、プログラムをたくさん実行したらどうなるのか、とか」
女「そんなこと知らなくても困らないもーん」
男「まあ、そういうもんだよな…。では、OSが別のプログラムを実行する仕組みを説明したいと思います」
女「なるべく簡単にね」
男「そういうと思って、例のノートとkindleでの説明を考えてきた」
女「HDDとメモリの例だね」
男「そうだ。今、kindleのページにOSがコピーされてる。そしてユーザーからメモ帳を起動しなさいという要求が来たとしよう」
男「ここで質問。例えば、ノートの30ページの20行目から、32ページの10行目までメモ帳のプログラムがあったとして、OSはそれをそのまま実行するでしょうか?」
女「kindleのページ上にOSがあるんだから、メモ帳のプログラムもkindleにコピーするんじゃない?」
男「凄い、よくわかったな」
女「ふふん」
男「まず、OSはノートに書かれてあるプログラムをkindleにコピーする。あとはそれを実行するだけ…と思いきや、実は違う。問題は何かわかるか?」
女「kindleのページのどこら辺にコピーすればいいのかわからない、とか?」
男「それもあるな。じゃあ、kindleの100ページの1行目にコピーしました。そして、実行する命令を示す番号、ここだと100ページの1行目ね、を変えました。どうなるでしょう?」
女「えー、わかんないよ」
男「ヒント。単純に実行するだけだと逆にOSのプログラムが実行できない」
女「もうちょっと欲しいなー」
男「ヒント2。メモ帳を実行するのもOSだけど終了させるのもOSの仕事」
女「わかった!メモ帳を終了させるOSがメモ帳のせいで実行されてない!」
男「そう!だからOSは、OSのプログラムを実行して、メモ帳のプログラムも実行する必要が出てくる」
男「どう実現するのかというと、あらかじめ、『一定時間プログラム○○の実行を再開して、その後○○の状態を保存するプログラム』をOSが持っていて、○○にメモ帳を入れる。これはOSの機能の一部なので、余った時間でOSがちゃんと実行される」
女「一定時間ってどのくらい?」
男「とにかく凄く短い時間だ。俺もOSのソースを読まないとわからん」
男「同じ機能を使ってプログラムA、B、Cと順番に実行させることが出来る。これをつかってたくさんのプログラムが一見同時に動いてるように見える」
女「複数のプログラムを同時に動かしてたわけじゃなくて、凄い早さでプログラムを切り替えてたんだね」
男「そういうこと」
ここまで
毎回はしょっててごめんなさい
明日か明後日にはリソース管理の話をしたい
Linuxスレを期待したら少し違った
でも期待
やるならOSのセキュリティ機構とかの話までやって欲しいな
>>32
(セキュアなシステムを作ろうクラスで勉強しても)ええんやで?
男「ここで、新たな問題が出てくる」
女「まだあるの?」
男「さっきは適当に100ページって決めたけど、実際にはどこにコピーされるかなんて簡単には決められない。間違って別のプログラムを上書きしたりしたら大変だろ?最悪OSが壊れちまう」
女「確かに。メモ帳を使おうと思ったら、いきなり壊れたなんて怖すぎるよ」
男「だから、OSはプログラムをコピーしたページを20ページとかにメモっておく。新たにプログラムを実行するときは、そこを見てまだ使われてないページを確認する。空きがあったらそこにページ番号を追加して、kindleにコピーする」
女「これで上書きの心配はなくなったね」
男「さっきのプログラムを順次実行していくやつも、これを使えば簡単に実現できる。20ページは言わば現在実行されているプログラムのリストだから、このリストにのってるページを順番に実行していくだけでいい」
女「終了するときはリストから対応する番号を削除すればいいんだね!」
男「そうだな。新たに別のプログラムがそこを使うかもしれないが、すでに終了してるから安全にそのプログラムをコピーできる」
男「ところで、これはプログラムを管理するリストだが、OSがメモってるのはこれだけじゃない」
女「他にどんなリストがあるの?」
男「考えてみよう。OSはプログラムを順次実行していくが、一時停止するときにプログラムの状態を保存しなきゃならないってことは前に言ったよな。どこに保存すればいいと思う?」
女「そっか。保存するときにコピーするページを適当に決めちゃったら、さっきみたいな問題が起きるもんね」
男「だから、20ページに状態を保存するページ番号も同時にメモっとく」
男「さらに、メモ帳ではテキストファイルを編集するだろ?編集するファイルの内容もノートからkindleにコピーしてくる必要がある」
女「それも20ページに書いておくの?」
男「いや、違う。プログラムの名前や状態は、事前に一つのプログラムにつき必要になる行数がわかってて、大体一定なんだが、編集するファイルがkindleのページをどのくらい使うかはわからないだろ?」
男「とりあえず3ページくらいでいいだろ、と思って3ページしかリストにメモしてなかったけど、編集するうちに足りなくなった、とかじゃOSとして成り立たないからな」
女「じゃあどこにメモするのよ?」
男「OSの機能として、『空いてるページをまとめて記録しておいて、必要になったら必要な分だけプログラムに貸す』っていう機能があるんだ。この機能があるから、効率的にkindleのページを使える」
男「用意したページが足りない、なんてことも起こらないし、実際に使うページが予想より少なくて、ページが無駄だ、なんて事も起こらないようにしてる」
眠いのでここまで
全然進んでないな…
余りにも大雑把すぎるかな
#タスクっていう言葉を紹介するタイミング逃して後悔してるのは秘密
そもそもノートの例えのまま進むんじゃなかったかな
ノートの例えはあまり上手くない
さらっと流すべきだったな
今のところは違和感なく読めてるのはosに関する知識が足らないからか
>>37
必要な分だけってのはCのmallocとかで使うスタック領域(って言うんだっけ?)のことで合ってる?
>>41
mallocで確保するのはヒープ領域だね
まぁイメージとしてはそんな感じ
>>42
スタック領域は保存レジスタとかだった・・
サンクス
>>1です
これ以上OSの詳細を対話形式でやるには>>1の文才が無さすぎるので、これで終わりにします
尻切れトンボですみません
自分としては、普段インターネットとゲームしかパソコン使わないよ~っていう人にもわかってもらえる話を目指したつもりです
超初歩的なことだけで終わりにして本当にすみません
補足です
>>29に関して
このようなシステムをマルチタスクといいます
どうやって時間を計るかというと、CPUの機能であるタイマ割り込みを使います
タスクスケジューラというものがタスクを管理していますが、実装はただのリスト構造に割り込みを足した程度の物です
しかし、ほとんどのOSはタスクに関して優先度が設定できるのでリストが複雑になっています
タスクを実行するときには仮想メモリを用意してその上で実行します
実行時の話はローダ/動的リンク/遅延ロードなどが絡んできます
>>37
実際はメモリを割り当てるだけではなく、キーボードやマウス、ディスプレイ、主記憶装置のI/Oも管理しています
もちろん、リソースに応じてキュー、配列などでの適切なデータ構造で管理します
更に補足
コンテキストスイッチ
(ノン)プリエンプティブ
待機/実行中/実行待ち
内部/外部割り込み
割り込みコントローラ
割り込み禁止/許可命令
割り込みベクタ
ブートローダ
リンカ/ローダ
このあたりをググれば宜しいかと
乙
情報系の解説ssがもっと流行りますように
読みやすくて良い
このSSまとめへのコメント
このSSまとめにはまだコメントがありません