📖

『Linuxシステムプログラミング』を読んだ

2024/09/23に公開

シルバーウィークの3連休を使って、『Linuxシステムプログラミング』を読みました。当初は、『Linuxプログラミングインタフェース』(1600ページ以上ある) の読破にでも挑戦してみようかと考えていました。しかし、まずは『Linuxシステムプログラミング』(400ページ程度) から入ったほうが良いという投稿を見かけたので、それに従いました。

結論として、私にとって『Linuxシステムプログラミング』を読んだことは正解でした。そして、私以外のソフトウェアエンジニアに対しても、本書を読むことを自信を持っておすすめできます。

なお、正確には英語版の『Linux System Programming, 2nd Edition』を読みました。平易な英語で書かれていて、原著も読みやすいです。

https://www.oreilly.com/library/view/linux-system-programming/9781449341527/

本書の内容

本書の内容は、「ファイルシステムの仕組み」「プロセス管理の仕組み」「メモリ管理の仕組み」の3つに大別できます。いずれも、2024年現在のソフトウェアエンジニアにとって、必修と言える内容です。

ファイル管理の仕組み

“Everything is a file”と言われるように、ファイルシステムはUNIX系のOSの根幹にあります。ゆえに多くの紙面が割かれており、2-4章ではファイルに対するI/O、8章ではファイル・ディレクトリの仕組みが解説されています。ファイルを操作するライブラリ(例えばjava.io.File) の裏側で何が起きているのかを、より正確にイメージできるようになりました。特に、私はBuffered I/Oの仕組みを知らなかったため、「なぜファイルの読み書きに関わるコードに頻繁にBufferが現れるのか」や「なぜJavaでファイルを読むときにBufferedReaderなるものが使われるのか」といった疑問の解消につながりました。

プロセス管理の仕組み

5, 6章にプロセス管理、7章にスレッド、そして10章にシグナルについて書かれています。

プロセス・スレッドの一般的な仕組みに関しては、岩波書店の『オペレーティングシステム』のようなOSの教科書を読んで、既に知っている内容でした。一方で、実際のLinuxで使用されている、Completely Fair Schedulerというプロセススケジューラについては初めて知りました。また、リアルタイム性を高めるために、FIFOやRRのようなプロセススケジューラを用いることも可能というのも興味深いです。

メモリ管理の仕組み

9章では、メモリ管理について書かれてます。ページングの仕組みや、静的あるいは動的なメモリ割り当ての仕組みが解説されています。

たまにC/C++を書いたりする中で、このあたりは断片的に知っていた領域だったので、より体系的な知識として整理されました。

次に学びたいこと

本書を読んだことで、より深く学びたいと思ったトピックがいくつかあります。

マルチスレッディングの仕組みと利用法

マルチスレッドプログラミングに関しては、本書では軽く触れられているのみであるため、より深く理解したいと思いました。

本書中でも紹介されている『Pthreadsプログラミング』や、『並行コンピューティング技法』などは読んでみたいです。また、以前読んだものの深くは理解できていない『並行プログラミング入門』にも、近いうちに再挑戦したいです。

プロセス間通信 (IPC) の仕組み

本書ではシグナル・共有メモリといったIPCの要素技術には触れられているものの、パイプやソケットを用いたIPCの仕組みに関してはほとんど解説されていないため、別途学びたいと考えています。

Linuxプログラミングインタフェース』では、それらに関する章もありそうです。また、『Advanced Programming in the UNIX Environment』や『UNIX Network Programming』も、ソケットについて学ぶ上では良さそうです。

ハンズオンでシステムプログラミングを学ぶ

システムプログラミングに使われる各種システムコールについては理解が深まったため、ハンズオンでそれらのシステムコールを用いたプログラムを書いてみたいです。『ふつうのLinuxプログラミング』や『Goならわかるシステムプログラミング』が気になっています。

Discussion