📚

web系エンジニアが『Linuxのしくみ』を読んでみた感想と学びなど

2024/07/30に公開

https://gihyo.jp/book/2022/978-4-297-13148-7
『[試して理解]Linuxのしくみ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】』を読んでみた感想と学びになったことをまとめておきたいと思います。読んだ背景としては、エンジニアとして知識の底上げをしたいなーと思い、OS周りで一冊読んでみようということでわかりやすそうなこちらを選びました。

感想

はじめに読んでみた感想。本当に正直に告白しますと、LinuxがOSの種類の一つだってことすら知らなかったので(エンジニアとして終わてる)、Linuxとは何かといったことに始まり、OSの基本的な挙動をなんとなく理解できたのはよかったと思う。正直細かい挙動や仕組みは個人的にはどーでもよくて(中にはへーおもろっていうのもあった)、どちらかというとたまに聞くワード(カーネル、デーモンetc…)を本書を通してちゃんと理解できたのが特によかったかも。総括としては知識の底上げとしてはまあ読んでよかったかと!

レビュー

  • 図が多く、仕組みや挙動が結構わかりやすい
  • が、そもそもの内容がやや難しい(というか抽象的でイメージしづらい?)のできちんと理解できない部分もあった
  • とはいえ途中で挫折せずに最後まで読めたのでそれだけでかなり読みやすいということだと思う
  • 実験に関しては途中から面倒くて結構飛ばした
  • 5章のプロセス管理(応用編)も飛ばしましたごめんなさい

読了までにかかった時間

週に3章づつくらいをメモ取りながら読み進めて、ちょうど一ヶ月くらいで読み切れました。

環境構築

本書では実験のためのLinux動作環境を構築する必要があり、物理環境を用意するのが難しかったので、Dockerで作成することにしました。
本来なら自分でDockerFile書くとこからやった方が勉強にはなるが、環境構築にあまり時間かけたくなかったので、こちらで作成してくれているものを使用。谢谢。
「[試して理解]Linux のしくみ【増補改訂版】」の実験環境を Docker で作成する方法と詰まったこと(M1Mac)

ざっと学びになったことまとめときます

  • カーネル
    • CPのハードウェアとソフトウェアをつなぐ橋渡し役で、各プロセスの優先順位を決定し、リソースを配分したりしてくれる
  • プロセス
    • 動作中のプログラムのこと
  • デーモン
    • バックグラウンドで動くプログラムのこと
  • 仮想記憶(Virtual Memory)
    • プロセスがメモリにアクセスする際に、仮想アドレスを用いて、間接的に物理メモリにアクセスする機能

CPUの記憶装置の階層

記憶装置 容量 価格 速度
レジスタ CPU内部の超高速メモリ
キャッシュメモリ レジスタとメモリ間のデータを一時保存するメモリ
メモリ 一時的にデータやプログラムを保存する作業領域
ストレージデバイス データを長期間保存する装置(SSD, HDD)

基本的なCPUの動き

  1. 命令を元に、メモリからレジスタにデータを読み出す
  2. レジスタ上のデータを元に計算
  3. 計算結果をメモリに書き戻す

レジスタ上の計算速度に比べて、メモリアクセスは極めて遅く、その問題を解決するためにキャッシュメモリが存在する。キャッシュメモリはへのアクセスはメモリアクセスに比べて高速なので、使ったばかりのデータやよく使うデータはキャッシュメモリに持たせておく。

ダーティ

メモリやキャッシュにおいてデータが更新されたが、永久的なストレージにはまだ書き込まれていない状態

参照の局所性

均等にデータ全体にアクセスすることは珍しく、多くの場合、局所的にアクセスが集中する部分があるよねってこと

  • 時間的局所性
    • 一度アクセスしたメモリは、近い将来に再びアクセスする可能性が高い
  • 空間的局所性
    • メモリアクセスすると、近い将来にその周辺のデータにアクセスする可能性が高い

direct I/O

一度読み書きしたら二度と使わないデータなどの読み書きにキャッシュを使用するのはもったいないので、キャッシュを使わずに直接メモリにデータを読み書きした方が良い。これをdirect I/Oという。

HDD(Hard Disk Drive)

「プラッタ」と呼ばれる円形の磁気ディスクに、「磁気ヘッド」を使ってデータを磁気情報で記録したり、読み出したりする物理ストレージ。(形状としてはレコードプレイヤーみたいなイメージ)

物理的な動作でデータを読み書きするので遅い。

一度に読み書きするデータの位置と順番がいい感じになってないと無駄な動きが多くなりさらに遅い。

ブロック層の基本機能

I/Oスケジューラ

ブロックデバイスへの要求を一定期間溜めておいて、最適化処理をしてからデバイスドライバにI/O要求を発行する機能。連続するセクタへの要求をまとめるマージと、セクタ番号順に並び替えるソートがある。

readhead(先読み)

読み出しの際に、近い将来にアクセスする可能性が高いと推測して、後続領域もページキャッシュに保存しておく機能。

ブロックデバイスの性能指標と測定方法

  • スループット
    • 単位時間あたりのデータ転送
    • 例えば200MiB/sだと、一秒間に200MiB転送できる
    • 大きなファイルをコピーする際などに意識される値
  • レイテンシ
    • 1回あたりのI/Oにかかる時間
    • 例えばレイテンシ10msだと、データが送信されてから届くまでに10msかかる
    • 細かいI/Oがたくさん出るときに意識される値
  • IOPS(I/O per second)
    • 1秒間に処理できるI/Oの

SSD(Solid State Drive)

半導体素子を使ったNAND型フラッシュメモリという、細かく区切られた「セル」と呼ばれる領域にデータを記録するストレージ。物理的な動作がない分HDDより高速。

namespace

コンテナ技術は、カーネルのnamespaceという機能をうまく活用することで実現している
※カーネルに「コンテナ」機能があるわけではない

最後に

直接的に仕事のためにならなくても、言葉や定義を知ることによって共通言語を増やすという意味でも一読する価値があるのではないかなと思います!技術書苦手な自分でも読み切れたので、Linux?OS?何それ状態でコンピュータを扱う仕事をしている方にはお勧めできると思います👍

お次は『「技術書」の読書術』か『UNIXという考え方』あたりを読んでみようかしら。
https://www.shoeisha.co.jp/book/detail/9784798171548
https://www.ohmsha.co.jp/book/9784274064067/

それでは。ここまで読んでくれた方がいればありがとうございましたm(__)m

Discussion