TCP/IP と HTTP...ふたつのメモリ管理 仮想記憶は高価で容量が少ない...
Transcript of TCP/IP と HTTP...ふたつのメモリ管理 仮想記憶は高価で容量が少ない...
ゆるかわLinux
今日話したいこと。
今日話したいこと
「LL で Web アプリ作るよ!」っていう Web エンジニア
LL でコードさえ書ければOK!
という雰囲気でもない...
今日話したいこと
知っておきたいこと
* サーバのこと* ネットワークのこと* データベースのこと* フロント、デザインのこと
...いろいろ
今日話したいこと
PHP × Web アプリケーションよくある開発環境
L AMP とか L APP とか...
今日話したいこと
Linux についても知っておきたい
Linux とはどんなものか?
裏でどんなことしてる?
今日話したいこと
Linux...
Linux カーネル?
ということで、今日は
Linux カーネルのお仕事を
中心に話したいと思います。
カーネルのバージョンは
2.6.x ですごめんなさい
Linux カーネルって?
OSの中で核となるプログラム。アプリケーションが動作するための基本環境を提供。
Linux カーネルがやってること。
* ハードウェアの制御* プロセス管理* メモリ管理* ファイルシステム * ネットワーク ...など
Linux カーネルって?
まずは基本機能について。
Linux カーネル内では様々な処理が非同期に動作する。
この動作を制御するため、Linux カーネルは次のような機能を持っている。
カーネルの基本機能
* システムコール* プロセススケジューラ* 割り込み* 同期と排他* 時計
カーネルの基本機能
システムコールとはプロセスがカーネルに対して要求を行うためのインタフェース。
システムコール
カーネルの機能(関数)はプロセスから直接呼び出せない。システムコールを通して呼び出す。
システムコール
カーネルの機能を呼び出す際にシステムコールを通すことで、ほかのプロセスやカーネル本体の動作が不安定にならないよう保護できる。
システムコール
たくさんのプロセスが同時に走る。処理を行うCPUの数は限られている。
カーネルはプロセスの中からもっとも動作させるにふさわしいプロセスに実行権限を与える。
プロセススケジューラ
ハードウェアやネットワークからのシグナルを受け取るしくみ。
割り込み
たくさんのプロセスが同時に走る。なので、共有しているメモリの内容が書き換えられてしまう可能性が...
排他制御が必要!
シングルコアでもマルチコアでも!
同期と排他
時計。
時計
ファイルシステムは OS の中心機能。
ファイルシステムは記憶装置上のデータに対して「ファイル」という形式を通して一貫したアクセス手順(開く、読む、書く、閉じる)を提供する。
ファイルシステム
ファイルシステムのおかげで、カーネルはファイル内のデータ型を意識する必要がない。そんなのは利用するアプリケーション側が意識すればいいよ!
ファイルシステム
プロセス管理について。
そもそもプロセスって?
プログラムが動いている状態のこと。OSが管理する処理の単位。( OS によってはタスクと呼ばれる )
そもそもプロセスって?
Linux だと ps コマンドでプロセスの状態を確認できる。
* ps … process status
pid(各プロセスが持つ固有のID)とかプロセスの名前とか…
そもそもプロセスって?
それぞれのプロセスは固有のコンテキストを持つ。
...コンテキスト?
そもそもプロセスって?
コンテキストとは...
* 一連の処理の流れ* 動作するために必要なプロセス空間* 動作するためのレジスタ値
プロセスは fork システムコールを呼ぶことで生成される。
...誰がプロセスを生成(fork)する?
プロセスの生成
プロセスには親子関係がある。
プロセスを生成したときに、生成した側が親になり、生成された側が子になる。
プロセスの生成
プロセスは複数の子プロセスを持つことができる。また、その子がさらに子を持つことができる。
プロセスの生成
Linux プロセスはfork システムコールを発行したプロセスの子として生成される。このとき親プロセスが保有する情報は子プロセスにそっくりコピーされる。
プロセスの一生
親プロセスの fork システムコールにより発行された子プロセスは...
* exec システムコールで目的の処理を実行開始。
* 処理終了時に exit システムコールを発行する。
プロセスの一生
子プロセスが exit したとき...
* 親プロセスは wait システムコールで子プロセスの終了を待ち合わせることができる。
* 親プロセスで wait システムコールが発行されない場合、子プロセスは保留状態(ZOMBIE)となる。
プロセスの一生
プロセスの一生
(1) 親プロセスが wait したとき(2) 親プロセスが wait しなかったとき 親プロセスが先に死んだとき
特殊なプロセス
init プロセス
プロセス ID が 1 のプロセス。すべてのプロセスの先祖。親プロセスを失った子プロセスの親にもなる。
特殊なプロセス
idle プロセス
実行できるプロセスが何もないときに実行されるプロセス。プロセス ID が 0 で CPU の分だけ生成される。ps 等で見ることはできない。
特殊なプロセス
カーネルスレッド
カーネルだけで動作してユーザーコードを実行しない特別なプロセス。これも init プロセスの子プロセス。
たくさんのプロセスが同時に走る。処理を行うCPUの数は限られている。
カーネルはプロセスの中からもっとも動作させるにふさわしいプロセスに実行権限を与える。
プロセス切り替え処理
プロセスディスパッチャ
プロセス切り替えを行う機能。
プロセス切り替え処理
プロセススケジューラ
実行可能なプロセスを監視し、どのプロセスに実行権を与えるか判断して、プロセスディスパッチャに切り替え要求を出す機能。
プロセス切り替え処理
※イメージ図
プロセス切り替え処理
実行待ちプロセス
待機状態プロセス
実行可能プロセス
* ユーザ側から実行されるプロセス* ハードウェア、ネットワーク からの割り込み
割り込みの方が優先度高い!
プロセス切り替え処理
メモリ管理について。
ふたつのメモリ管理
Linux カーネルは2種類のメモリ管理を行う。
* 実メモリ管理* 仮想記憶
ふたつのメモリ管理
仮想記憶は高価で容量が少ない実メモリを効率よく管理できるよう、もともとUNIXで実装されていた手法。しかし最近は実メモリも容量が大きくなってきたので、この辺のメモリ管理機能も変わる可能性があるとかないとか。
実メモリ管理
RAMチップ内のメモリ領域(実メモリ)を管理すること。
実メモリ管理
Linux カーネルは実メモリを「ページ」という単位で管理する。ページは仮想メモリを利用したときにCPUがサポートするメモリ管理の最小単位。
仮想記憶
アプリケーション(プロセス)から参照するメモリアドレスは実メモリのアドレスではなく、仮想的な領域のアドレスとなる。
仮想記憶
物理的に分散したページを集めて仮想的に連続したアドレス空間を作るのもカーネルのしごと。
仮想記憶
(1) プロセスが「メモリほしい!」と 要求する。(2) カーネルがメモリに空いてる アドレスを確認する。(3) メモリが空いてるアドレスを返す。(4) プロセスにアドレスを返す。
仮想記憶
※イメージです
仮想記憶
アドレス空間はプロセスごとに割りつけられるので、各プロセスは自分のアドレス空間を自由に利用することができる。
仮想記憶
アプリケーション側で意識しなくちゃいけないことが減る。
* ほかのプロセスとメモリが競合しないか、とか
* メモリのアドレスがどこから始まるのか、とか
スワップ
最近アクセスされた仮想ページのみを実メモリに置いておき、ほかは2次記憶装置に退避しておくことで、実際に搭載されている実メモリよりも大きなメモリを使用しているように見せることができる。
スワップ
これがスワップ。
スワップ
とは言っても2次記憶装置。メモリに比べると速度は遅い。あまり発生させたくない。
スワップ必要なの?
ある日のカーネルさん。
カーネルさんの仕事
カーネルさんの仕事
カーネルさんの仕事
カーネルさんの仕事
_人人人人人人人人人_ > 突然のOOM Killer <  ̄^Y^Y^Y^Y^Y^Y^Y^ ̄
Out of Memory Killer
Linux カーネルにはメモリが確保できなくなったとき、無作為に選んだプロセスを殺す素敵な機能がある。
Out of Memory Killer
Malloc で実メモリ+スワップよりも多くメモリ確保できる
↓実際メモリを確保しようとして失敗
↓_人人人人人人人人人人人人人人人人人人人_> OOM Killer or カーネルパニック < ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
Out of Memory Killer
大事なプロセスを殺されたり、カーネルパニックで全滅するよりスワップした方がましなこともありますよね。
Out of Memory Killer
大事なプロセスは殺さないよう設定可能だったりもするけど、やっぱりチューニング大事!
* Apache の Max Clients とか* MySQL の buffer_pool_size とか
で、これ結局何の役に立つの?
役立ちそうなこと
きっとたぶんいろいろある!
* パフォーマンスを意識した Web アプリケーションづくり* パフォーマンスチューニング* トラブル対応* ミドルウェア選定
役立ちそうなこと
たとえば Web サーバを選ぶとき...
* apache? nginx?* prefork? worker?
「要件に向いているのはどれか」「なぜそれを選ぶのか」選ぶ理由はパフォーマンスだけじゃないけど...
参考書籍など。
Linux のしくみ的なところ
Linuxカーネル解読室高橋浩和・小田逸郎・山幡為佐久
/ソフトバンククリエイティブ
プロのためのLinuxシステム構築・運用技術中井悦司/技術評論社
ソースコード読みたい人向け
Linuxカーネル解析入門[増補版]平田豊/工学社
デーモン君のソース探検BSDのソースコードを探る冒険者たちのための手引き書氷山素子/アスキー
もっと詳しく知りたい
がっつり詳しく仕様を知りたい人には「詳解 Linuxカーネル」がよさそう。
安心のオライリー。
まとめ。
Linux もかわいいけど
FreeBSD もかわいいよ!
ありがとうございました。