Table of Contents
Linuxカーネル
Linuxカーネルとは一言で表すとコンピュータの「脳」のようなものです。
カーネルの役割はソフトウェアとハードウェアの間で仲介役を果たします。

もう少し具体的に表現すると以下となります。
- アプリケーションからの要求に応えること
- ハードウェアからの応答をアプリケーションに伝えること
システムコール
アプリケーションからの要求に応えること、についてもう少し具体的に説明します。
アプリケーションがハードウェアリソースを利用するためには、カーネルに対して要求をする必要があります。
この要求をシステムコールと呼ばれるインターフェースを通じて行われます。
ファイルの読み書き
例えばアプリケーションがファイルの読み書きをする場合、テキストエディタでファイルを開く場合に、open(), read(), write(), close()などのシステムコールが発行され、ディスクからファイルを読み取ります。
メモリの確保
アプリケーションがメモリを必要とする場合、プログラムが新しいデータを保存するためにカーネルが物理メモリを割り当てます。
アプリケーションがメモリと必要とする場合、malloc()やmmap()などのシステムコールが使われます。
メモリの空き容量などメモリ関連の情報を確認するには以下のコマンドで確認することができます。
grep MemToctal /proc/meminfo
MemTotal: 2020392 kB
grep VmallocTotal /proc/meminfo
VmallocTotal: 34359738367 kB
上記のコマンドの意味はそれぞれ以下の通りです。
grep MemToctal /proc/meminfo
システムの総物理メモリ量を確認しています。
/proc/meminfo
: システムのメモリ使用状況を詳細に記録した仮想ファイルです。
MemTotal
: システムに搭載されている物理メモリの総量を表します。
出力結果から2020392 kB(約2GB)の物理メモリの総量ということです。
grep VmallocTotal /proc/meminfo
vmallocTotal
: カーネルが使用する仮想メモリ領域(vmalloc領域)の総量を表します。
vmalloc領域とは、カーネルが連続した物理メモリを必要としない場合に使用される仮想メモリ領域です。
出力結果から34359738367 KB(約32TB)の仮想メモリ領域があるということです。
プロセスの作成
プロセスを生成するシステムコールはfork()
であり、プログラムをロードするシステムコールがexec()となります。
プログラムをロードするとは、実行可能ファイルをメモリに読み込むことを指します。
実行可能ファイルをメモリに読み込むこととは:
- 実行可能なファイルをディスクから読み取ります
- ファイルの内容にはプログラムのコードなどが含まれます
- 読み取った内容をプロセスの仮想メモリ空間にマッピングします
- マッピングすることにより、プログラムのコードがメモリ上に配置されます
プロセスとは: 実行中のプログラム。プロセスは単位で区切られるので(独立したメモリアドレス空間)、あるプロセスが暴走したとしても、他のプロセスに影響は及ぼさない。
Windowsのタスクマネージャを見てもらうとわかりやすいのですが、以下はGooglechromeのプロセスです。
Googlechromeの一つのブラウザタブで一つのプロセスという単位になっています。

スレッドとは: プロセスの実行単位。1つのプロセスの内部に含まれている論理的な並列処理の単位。
図で表すと以下のようなイメージです。

CPUは基本的に1つのコアで1つの処理しか実行することができません。
つまり、2コア、4コアとなってくると同時に2つ、4つのことを処理することが可能です。その単位がスレッドと呼ばれます。(OSのスケジューラは、複数のスレッドを時間的に切り替えて実行するため、見かけ上は2つ以上のスレッドが平行して動作しているようにみえるだけ)
スレッドには以下2つの種類があります。
- シングルスレッドプロセス
- 1つしかスレッドを持たないプロセス
- マルチスレッドプロセス
- 複数スレッドを持つプロセス
具体例
2コアのCPUでのプロセスとスレッドの関係
プロセス内に「画面描画」をするスレッドと「ネットワーク通信」をする2つのスレッドが作成されます。
CPUコアでの実行は
コア1: 画面描画
コア2: ネットワーク通信
のように同時に実行されます。

ちなみにLinuxでps l
コマンドを実行した結果は以下のような出力がされます。
~$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 1000 527 526 20 0 2616 260 pipe_r Ss+ pts/0 0:00 sh
4 1000 934 528 20 0 9464 2700 core_s S+ pts/1 0:00 -bash
4 1000 1637 1632 20 0 9576 5120 do_wai Ss pts/4 0:00 -bash
0 1000 1699 1637 20 0 9848 1132 - R+ pts/4 0:00 ps l
UID: User ID。プロセスを生成した利用者の識別子
PID: Process ID。Uniqueに割り当てた番号
PPID: Parent PID。親プロセスのPID
STAT: State。状態を表す
STATの状態コード
状態コード | 内容 |
---|---|
S(Sleeping) | プロセスがスリープ状態(待機状態)を表す |
R(Running) | プロセスが実行中または実行可能状態にあることを表す |
D(Uninterruptible Sleep) | プロセスが割り込み不可のスリープ状態であることを表す |
T(Stopped) | プロセスが停止状態にあることを表す |
Z(Zombie) | プロセスがゾンビ状態にあることを表す |
X(Dead) | プロセスが完全泉終了していることを示す |
追加の修飾子
状態コード | 内容 |
---|---|
<(High Priority) | プロセスが高い優先度で実行されていることを示す |
N(Low Priority) | プロセスが低い優先度で実行されていることを示す |
s(Session Leader) | プロセスがセッションリーダーであることを示す |
l(Multi-threaded) | プロセスがマルチスレッドであることを示す |
+(Foreground Process Group) | プロセスがフォアグランドプロセスグループに属していることを示す |
Linuxのプロセスの状態遷移は以下のようになります。

ネットワーク通信
Linuxのネットワークスタックはネットワーク通信を実現するために、TCP/IP、UDPなどのプロトコルを管理とデータの送受信を担当します。
ネットワーク通信はパケットという小さな塊を送受信することで行われ、パケットには、送信元と宛先の情報、実際のデータが含まれています。
主なハードウェアデバイスにはNIC (Network Interface Card)などがあります。
プロトコルはTCP (ステートフル通信)とUDP(ステートレス通信)によって通信を行います。
TCPは通信開始前に3ウェイハンドシェイクによる通信開始前にコネクションを確立します。
そのため、データの到達を保証し、パケットが失われた場合には再送します。
対してUDPはステートレス通信のため、通信の状態を管理しません。
ただし、3ウェイハンドシェイクのようにコネクションを確立せずにデータを送信するため、パケットが失われても再送を行いません。
3ウェイハンドシェイクについては以下の記事がわかりやすいかと思います。
デバイス制御
デバイスドライバはPCに接続されている周辺装置をカーネルが制御するためのプログラムです。
Linuxのデバイスの種類は以下のように分類されています。
キャラクタデバイス
バイト単位で読み書きする。キーボード、マウス、シリアルポートなど。
ブロックデバイス
ブロック単位(512バイトなど)でデータを読み書きする。HDD、SSD、USBなど。
ネットワークデバイス
ネットワークパケットを送受信する。イーサネット、Wi-Fiアダプタなど。
Linuxではデバイスをデバイスファイルとして扱います。
デバイスファイルは/dev
ディレクトリに存在します。
/dev/sda
, /dev/sdbなどのハードディスクのファイルが存在します。
LinuxではHDDやUSBメモリなどの装置を/dev/sda
などのデバイスファイルとして管理します。
wsl2
の環境で以下コマンドを実行した結果です。
ls /dev/sd*
/dev/sda /dev/sdb /dev/sdc /dev/sdd /dev/sde
sda
, sdb
, sdc
などが存在します。
この例ではsda
~ sde
までのディスクを示すファイルが存在することになります。