2012/10/13に行われた「ゆるかわPHPの会#1」で発表した資料です。 Linuxカーネルについてゆるく話しました。 間違いやツッコミなどありましたらご連絡いただけると嬉しいです。
ゆるかわLinux
View Slide
今日話したいこと。
今日話したいこと「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 statuspid(各プロセスが持つ固有の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 KillerLinux カーネルにはメモリが確保できなくなったとき、無作為に選んだプロセスを殺す素敵な機能がある。
Out of Memory KillerMalloc で実メモリ+スワップよりも多くメモリ確保できる↓実際メモリを確保しようとして失敗↓_人人人人人人人人人人人人人人人人人人人_> 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 もかわいいよ!
ありがとうございました。