Linuxの仕組みを理解 Linuxカーネル

Linuxカーネル

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ウェイハンドシェイクについては以下の記事がわかりやすいかと思います。

TCP 3ウェイハンドシェイク

TCP( 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などが存在します。

この例ではsdasdeまでのディスクを示すファイルが存在することになります。

参考

入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する

AmazonでMichael Hausenblas, 武内 覚, 大岩 尚宏の入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得する。アマゾンならポイント還元本が多数。Michael Hausenblas, 武内 覚, 大岩 尚宏作品ほか、お急ぎ便対象商品は当日お届けも可能。また入門 モダンLinux ―オンプレミスからクラウドまで、幅広い知識を会得するもアマゾン配送商品なら通常配送無料。

システムコール、プロセスと Linux task_struct

Claudia Salzberg Rodriguez, Gordon Fischer, and Steven Smolski: “The Linux Kernel Primer: A Top-Down Approach for x86 and PowerPC Architectures”, Prentice Hall (2005). ISBN-10: 0131181637

Linux – パーティションとファイルシステムの作成

Linux – パーティションとファイルシステムの作成

https://webpia.jp/thread_process/#index_id4

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です