プロセス(大まかに、かつ不明瞭な説明)

CPU

CPUはプログラムを実行します。CPUが処理を行える言語は機械語です。

機械語はバイト列のある規則体系に基づいて記述されたものです。

CPUの種類によって実行できる命令は異なります。ただし、どのようなCPUでもおおむね次のような命令を理解します。

  • メモリからバイトを読む
  • メモリにバイトを書く
  • 四則演算
  • ビットシフト
  • 原始的な条件分岐

マルチタスク

上記の処理は、CPUとメモリが1対1の場合であれば話は簡単ですが、今やWindowsもMacOSマルチタスクの時代です。
マルチタスクの場合、次のような問題が発生します。

メモリに関する問題
  • 「メモリからバイトを読む、書く」という日本語には大事な言葉が足りません。
  • 「どこに」という場所(アドレス)を指示しないとバイトを読み書きできません。
  • 「どこに」という場所がそれぞれのアプリで重複しないように記述するにはどうすればよいのか?
CPUに関する問題
  • CPUは一定時間毎(周期)に計算を行います。
  • レジスタ、メモリなどから渡されたカルテ*1をそのまま計算するように淡々と仕事をこなします。
  • これを延々と繰り返します。
  • 同時に異なる処理はできません。

仮想

仮想CPU

CPUが足りないなら増やすか、増えたように見せかければよいという発想をします。実行するプロセスを一定時間に切り変えます。
具体的にはCPUは淡々と渡されたカルテ、つまりレジスタやメモリの機械語を計算しているので、その値を一時的に書き換えます。
この処理はプロセススケジューラやらプロセスディスパッチャなどが担当しています*2.

仮想メモリ

メモリのアドレス問題は次のように解決します。

「みんな好きなアドレス指定していいよ。こっち側で空いてるアドレスに適当につっこんでおくから」
「その好きなアドレスで呼び出してくれていいよ。違う場所に置いてあるけどちゃんと持ってくるから」

プロセスから見える論理アドレスと実際のアドレスである物理アドレスという概念です。
各プロセスに用意されるメモリ全体の事をアドレス空間と呼びます。

アドレス空間の構造

Linuxでは次のような領域が存在します

  • テキスト領域
  • データ領域
  • BSS領域
  • ヒープ領域
  • スタック領域

次のコマンドでアドレス空間を確認できます。

% cat /proc/1007/maps

参考文献

  • ふつうのLinuxプログラミング(青木峰郎著)
  • Linuxカーネル解読室2.6(高橋浩和/小田逸朗/山幡為佐久著)

*1:不明瞭な説明だと最初に申し上げている

*2:大まかな説明だと、最初に申し上げている