『Linuxシステムプログラミング』を読んだ
シルバーウィークの3連休を使って、『Linuxシステムプログラミング』を読みました。当初は、『Linuxプログラミングインタフェース』(1600ページ以上ある) の読破にでも挑戦してみようかと考えていました。しかし、まずは『Linuxシステムプログラミング』(400ページ程度) から入ったほうが良いという投稿を見かけたので、それに従いました。
結論として、私にとって『Linuxシステムプログラミング』を読んだことは正解でした。そして、私以外のソフトウェアエンジニアに対しても、本書を読むことを自信を持っておすすめできます。
なお、正確には英語版の『Linux System Programming, 2nd Edition』を読みました。平易な英語で書かれていて、原著も読みやすいです。
本書の内容
本書の内容は、「ファイルシステムの仕組み」「プロセス管理の仕組み」「メモリ管理の仕組み」の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