Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ゆるかわLinux

tdak
May 13, 2013

 ゆるかわLinux

2012/10/13に行われた「ゆるかわPHPの会#1」で発表した資料です。
Linuxカーネルについてゆるく話しました。
間違いやツッコミなどありましたらご連絡いただけると嬉しいです。

tdak

May 13, 2013
Tweet

More Decks by tdak

Other Decks in Technology

Transcript

  1. ゆるかわLinux

    View Slide

  2. 今日話したいこと。

    View Slide

  3. 今日話したいこと
    「LL で Web アプリ作るよ!」
    っていう Web エンジニア
    LL でコードさえ書ければOK!
    という雰囲気でもない...

    View Slide

  4. 今日話したいこと
    知っておきたいこと
    * サーバのこと
    * ネットワークのこと
    * データベースのこと
    * フロント、デザインのこと
    ...いろいろ

    View Slide

  5. 今日話したいこと
    PHP × Web アプリケーション
    よくある開発環境
    L AMP とか
    L APP とか...

    View Slide

  6. 今日話したいこと
    Linux についても知っておきたい
    Linux とはどんなものか?
    裏でどんなことしてる?

    View Slide

  7. 今日話したいこと
    Linux...
    Linux カーネル?

    View Slide

  8. ということで、今日は
    Linux カーネルのお仕事を
    中心に話したいと思います。

    View Slide

  9. カーネルのバージョンは
    2.6.x ですごめんなさい

    View Slide

  10. Linux カーネルって?
    OSの中で核となるプログラム。
    アプリケーションが動作するための
    基本環境を提供。

    View Slide

  11. Linux カーネルがやってること。
    * ハードウェアの制御
    * プロセス管理
    * メモリ管理
    * ファイルシステム
    * ネットワーク
            ...など
    Linux カーネルって?

    View Slide

  12. まずは基本機能について。

    View Slide

  13. Linux カーネル内では様々な処理が
    非同期に動作する。
    この動作を制御するため、
    Linux カーネルは
    次のような機能を持っている。
    カーネルの基本機能

    View Slide

  14. * システムコール
    * プロセススケジューラ
    * 割り込み
    * 同期と排他
    * 時計
    カーネルの基本機能

    View Slide

  15. システムコールとは
    プロセスがカーネルに対して
    要求を行うためのインタフェース。
    システムコール

    View Slide

  16. カーネルの機能(関数)は
    プロセスから直接呼び出せない。
    システムコールを通して呼び出す。
    システムコール

    View Slide

  17. カーネルの機能を呼び出す際に
    システムコールを通すことで、
    ほかのプロセスや
    カーネル本体の動作が
    不安定にならないよう保護できる。
    システムコール

    View Slide

  18. たくさんのプロセスが同時に走る。
    処理を行うCPUの数は限られている。
    カーネルはプロセスの中から
    もっとも動作させるにふさわしい
    プロセスに実行権限を与える。
    プロセススケジューラ

    View Slide

  19. ハードウェアやネットワークからの
    シグナルを受け取るしくみ。
    割り込み

    View Slide

  20. たくさんのプロセスが同時に走る。
    なので、共有しているメモリの内容が
    書き換えられてしまう可能性が...
    排他制御が必要!
    シングルコアでもマルチコアでも!
    同期と排他

    View Slide

  21. 時計。
    時計

    View Slide

  22. ファイルシステムは OS の中心機能。
    ファイルシステムは記憶装置上のデー
    タに対して「ファイル」という形式を
    通して一貫したアクセス手順(開く、
    読む、書く、閉じる)を提供する。
    ファイルシステム

    View Slide

  23. ファイルシステムのおかげで、
    カーネルはファイル内のデータ型を
    意識する必要がない。
    そんなのは利用する
    アプリケーション側が
    意識すればいいよ!
    ファイルシステム

    View Slide

  24. プロセス管理について。

    View Slide

  25. そもそもプロセスって?
    プログラムが動いている状態のこと。
    OSが管理する処理の単位。
    ( OS によってはタスクと呼ばれる )

    View Slide

  26. そもそもプロセスって?
    Linux だと ps コマンドで
    プロセスの状態を確認できる。
    * ps … process status
    pid(各プロセスが持つ固有のID)とか
    プロセスの名前とか…

    View Slide

  27. そもそもプロセスって?
    それぞれのプロセスは
    固有のコンテキストを持つ。
    ...コンテキスト?

    View Slide

  28. そもそもプロセスって?
    コンテキストとは...
    * 一連の処理の流れ
    * 動作するために必要なプロセス空間
    * 動作するためのレジスタ値

    View Slide

  29. プロセスは fork システムコールを
    呼ぶことで生成される。
    ...誰がプロセスを生成(fork)する?
    プロセスの生成

    View Slide

  30. プロセスには親子関係がある。
    プロセスを生成したときに、
    生成した側が親になり、
    生成された側が子になる。
    プロセスの生成

    View Slide

  31. プロセスは複数の子プロセスを
    持つことができる。
    また、その子がさらに子を
    持つことができる。
    プロセスの生成

    View Slide

  32. Linux プロセスは
    fork システムコールを発行した
    プロセスの子として生成される。
    このとき親プロセスが保有する情報は
    子プロセスにそっくりコピーされる。
    プロセスの一生

    View Slide

  33. 親プロセスの fork システムコールに
    より発行された子プロセスは...
    * exec システムコールで目的の処理
    を実行開始。
    * 処理終了時に exit システムコール
    を発行する。
    プロセスの一生

    View Slide

  34. 子プロセスが exit したとき...
    * 親プロセスは wait システムコール
    で子プロセスの終了を待ち合わせる
    ことができる。
    * 親プロセスで wait システムコール
    が発行されない場合、子プロセスは
    保留状態(ZOMBIE)となる。
    プロセスの一生

    View Slide

  35. プロセスの一生
    (1) 親プロセスが wait したとき
    (2) 親プロセスが wait しなかったとき
    親プロセスが先に死んだとき

    View Slide

  36. 特殊なプロセス
    init プロセス
    プロセス ID が 1 のプロセス。
    すべてのプロセスの先祖。
    親プロセスを失った
    子プロセスの親にもなる。

    View Slide

  37. 特殊なプロセス
    idle プロセス
    実行できるプロセスが何もないときに
    実行されるプロセス。
    プロセス ID が 0 で CPU の分だけ
    生成される。
    ps 等で見ることはできない。

    View Slide

  38. 特殊なプロセス
    カーネルスレッド
    カーネルだけで動作して
    ユーザーコードを実行しない
    特別なプロセス。
    これも init プロセスの子プロセス。

    View Slide

  39. たくさんのプロセスが同時に走る。
    処理を行うCPUの数は限られている。
    カーネルはプロセスの中から
    もっとも動作させるにふさわしい
    プロセスに実行権限を与える。
    プロセス切り替え処理

    View Slide

  40. プロセスディスパッチャ
    プロセス切り替えを行う機能。
    プロセス切り替え処理

    View Slide

  41. プロセススケジューラ
    実行可能なプロセスを監視し、
    どのプロセスに実行権を与えるか
    判断して、プロセスディスパッチャに
    切り替え要求を出す機能。
    プロセス切り替え処理

    View Slide

  42. ※イメージ図
    プロセス切り替え処理
    実行待ちプロセス
    待機状態プロセス
    実行可能プロセス

    View Slide

  43. * ユーザ側から実行されるプロセス
    * ハードウェア、ネットワーク
      からの割り込み
    割り込みの方が優先度高い!
    プロセス切り替え処理

    View Slide

  44. メモリ管理について。

    View Slide

  45. ふたつのメモリ管理
    Linux カーネルは
    2種類のメモリ管理を行う。
    * 実メモリ管理
    * 仮想記憶

    View Slide

  46. ふたつのメモリ管理
    仮想記憶は高価で容量が少ない
    実メモリを効率よく管理できるよう、
    もともとUNIXで実装されていた手法。
    しかし最近は実メモリも容量が
    大きくなってきたので、
    この辺のメモリ管理機能も
    変わる可能性があるとかないとか。

    View Slide

  47. 実メモリ管理
    RAMチップ内のメモリ領域
    (実メモリ)を管理すること。

    View Slide

  48. 実メモリ管理
    Linux カーネルは実メモリを
    「ページ」という単位で管理する。
    ページは仮想メモリを利用したときに
    CPUがサポートする
    メモリ管理の最小単位。

    View Slide

  49. 仮想記憶
    アプリケーション(プロセス)から
    参照するメモリアドレスは実メモリの
    アドレスではなく、
    仮想的な領域のアドレスとなる。

    View Slide

  50. 仮想記憶
    物理的に分散したページを集めて
    仮想的に連続したアドレス空間を
    作るのもカーネルのしごと。

    View Slide

  51. 仮想記憶
    (1) プロセスが「メモリほしい!」と
      要求する。
    (2) カーネルがメモリに空いてる
      アドレスを確認する。
    (3) メモリが空いてるアドレスを返す。
    (4) プロセスにアドレスを返す。

    View Slide

  52. 仮想記憶
    ※イメージです

    View Slide

  53. 仮想記憶
    アドレス空間はプロセスごとに
    割りつけられるので、各プロセスは
    自分のアドレス空間を自由に利用す
    ることができる。

    View Slide

  54. 仮想記憶
    アプリケーション側で意識しなくちゃ
    いけないことが減る。
    * ほかのプロセスとメモリが競合しな
    いか、とか
    * メモリのアドレスがどこから始まる
    のか、とか

    View Slide

  55. スワップ
    最近アクセスされた仮想ページのみを
    実メモリに置いておき、
    ほかは2次記憶装置に退避しておく
    ことで、実際に搭載されている
    実メモリよりも大きなメモリを使用し
    ているように見せることができる。

    View Slide

  56. スワップ
    これがスワップ。

    View Slide

  57. スワップ
    とは言っても2次記憶装置。
    メモリに比べると速度は遅い。
    あまり発生させたくない。
    スワップ必要なの?

    View Slide

  58. ある日のカーネルさん。

    View Slide

  59. カーネルさんの仕事

    View Slide

  60. カーネルさんの仕事

    View Slide

  61. カーネルさんの仕事

    View Slide

  62. カーネルさんの仕事
     _人人人人人人人人人_
     > 突然のOOM Killer <
      ̄^Y^Y^Y^Y^Y^Y^Y^ ̄

    View Slide

  63. Out of Memory Killer
    Linux カーネルには
    メモリが確保できなくなったとき、
    無作為に選んだプロセスを殺す
    素敵な機能がある。

    View Slide

  64. Out of Memory Killer
    Malloc で実メモリ+スワップ
    よりも多くメモリ確保できる

    実際メモリを確保しようとして失敗

    _人人人人人人人人人人人人人人人人人人人_
    > OOM Killer or カーネルパニック <
     ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

    View Slide

  65. Out of Memory Killer
    大事なプロセスを殺されたり、
    カーネルパニックで全滅するより
    スワップした方がましなことも
    ありますよね。

    View Slide

  66. Out of Memory Killer
    大事なプロセスは殺さないよう
    設定可能だったりもするけど、
    やっぱりチューニング大事!
    * Apache の Max Clients とか
    * MySQL の buffer_pool_size とか

    View Slide

  67. で、これ結局何の役に立つの?

    View Slide

  68. 役立ちそうなこと
    きっとたぶんいろいろある!
    * パフォーマンスを意識した
      Web アプリケーションづくり
    * パフォーマンスチューニング
    * トラブル対応
    * ミドルウェア選定

    View Slide

  69. 役立ちそうなこと
    たとえば Web サーバを選ぶとき...
    * apache? nginx?
    * prefork? worker?
    「要件に向いているのはどれか」
    「なぜそれを選ぶのか」
    選ぶ理由はパフォーマンスだけじゃないけど...

    View Slide

  70. 参考書籍など。

    View Slide

  71. Linux のしくみ的なところ
    Linuxカーネル解読室
    高橋浩和・小田逸郎・山幡為佐久
    /ソフトバンククリエイティブ
    プロのためのLinuxシステム
    構築・運用技術
    中井悦司/技術評論社

    View Slide

  72. ソースコード読みたい人向け
    Linuxカーネル解析入門
    [増補版]
    平田豊/工学社
    デーモン君のソース探検
    BSDのソースコードを探る
    冒険者たちのための手引き書
    氷山素子/アスキー

    View Slide

  73. もっと詳しく知りたい
    がっつり詳しく仕様を知りたい人には
    「詳解 Linuxカーネル」がよさそう。
    安心のオライリー。

    View Slide

  74. まとめ。

    View Slide

  75. Linux もかわいいけど
    FreeBSD もかわいいよ!

    View Slide

  76. ありがとうございました。

    View Slide