参考文献:Linuxプログラムインターフェース
6章 プロセス
プロセス仮想メモリ空間のレイアウトおよびセグメント
プロセスとはプログラムの実行中の姿
プログラムとプロセスの違いを明確にする。
プログラムとは実行時にどのようにプロセスを作成するかを記したファイル
プログラムの情報
・バイナリ形式種別
・機械語命令
・実行開始アドレス
・データ
・シンボル・リロケーションテーブル
・共有ライブラリ、ダイナミックリンク情報
・その他
これが全部説明されていくのか。凄いなあ。
6.3 プロセスのメモリレイアウト
いきなり感があるが、基礎概念と繋がっており、基礎概念の記載をみたが、ここでも
メモリレイアウトは当然のごとく書かれいていた。
メモリに割り当てるのはごく当然のごとく書かれているが、そこはなんかせっかく
この本なんだからその辺がわかるのを期待してしまう。
(ところでプロセスが出てきたんならプログラムのメモリレイアウトはどうなんだって思う。 )
先にメモリ割り当てをみてみる
7章メモリ割り当て
いきなりヒープが出てくる。
スレッド、ヒープ
プロセスのレイアウトに行き着く
(ヒープ)
実行時にダイナミックに割り当てられた領域。この領域の上端をプログラムブレークという。
さっぱりわからない。よく聞くがイメージがわかない。
ダイナミックという言葉を使いすぎ。
基礎概念をみてみる。
(プロセスメモリレイアウト)
プロセスは論理的に次の部分に分割される。それぞれをセグメントという。
・テキストセグメント
実行コード
・データセグメント
スタティック(静的)変数
・ヒープセグメント
ダイナミック(動的)に割り当てるメモリ
・スタックセグメント
関数のコール、リターン時に拡張/縮小し、関数のローカル変数や関数のコールリンケージ情報をおく
わからん・・・
プロセスとはなんとぞになるのか?
プロセスはプログラムにつながる
プログラム→プロセス→ヒープ→メモリ
ヒープからメモリの説明がやっぱりないぞ。
もう百歩譲って、プロセスがメモリに割り当てられ、ヒープというセグメントがあるという理解でいいだろう。
こんな理解が通用するのは情報処理の試験くらいで、何も生み出せないのだが・・・。
C言語のプログラムの変数がどのセグメントに置かれるかの絵があった。
結構具体的で驚いた。知識になればいいのだが。
6.4 仮想メモリ管理
局所性から、プロセスアドレス空間の一部のみがRAMに存在していれば、プログラムは実行可能。
仮想メモリ方式は、プログラムが使用するメモリを、ページという固定サイズの小さな単位に分割する。
対してRAMも同じサイズのページフレームに分割する。プログラムの一部ページは物理メモリページフレーム内に常時存在する必要があり、
このページを常駐メモリという。
プログラムの未使用ページはスワップ領域に置かれ、必要になったら物理メモリへロードされる。
仮想メモリの実現にはページメモリ管理ユニット(PMMU)というハードウェアが必要。
PMMUは仮想メモリアドレスを物理メモリアドレスへ変換し、そのメモリページがRAM上に存在しない場合はページフォルによりカーネルに通知する。
プロセス仮想アドレス空間が出てくるが、いきなり感がある。こういうのが多すぎる。
そもそもなんで仮想なの?
せめて仮想アドレス空間の説明がないのか、どこかに書いてあると思うが。
主記憶装置とか、仮想記憶という言葉がこの本にはないぞ。大丈夫か。
もう仮想アドレス空間は暗黙に理解してということ?、説明しろよ!
スタックとスタックフレーム
コマンドラインパラメータ
コマンドラインパラメータは、シェルが解析/分割してできるもの。
実際に具体的にハードウェアからどう動いているかみたいのに全然出てこないじゃないか。
本当に整理されているのか。
環境変数
プロセスは環境リストという文字列配列をもつ。
わかって書いているんだと思うが、読んでもわからん。
6.8グローバルジャンプ:setjmp()とlongjmp()
本当に流れになっているのか?。なんか実は話繋がってないんじゃないのか。
そもそもどうやってこのプログラムとかを実行するの?
ちょっとこの学習からやったほうがいいか。
6.10 演習
わからん。とりあえずコンパイルして実行することからやってみる。
コンパイルしたら動いた。
しかしながらわからん。
実行形式が小さい理由なんてどこに書いてるの?