5章Goでのメモリリソースの使用方法

第4章 では、現代のコンピューターの中身を覗くことから始めました。 CPUリソースを使用する際の効率面について説明しました。 CPUの命令を効率的に実行することは重要ですが、その命令を実行する唯一の目的は、データを変更することです。 残念ながら、データを変更する経路は、必ずしも些細なことではありません。 たとえば、 第4章 では、フォン・ノイマン型アーキテクチャ( 図 4-1 で図示)において、主記憶装置(RAM)からデータにアクセスする際に、CPUとメモリウォール問題が発生することを学びました。

このような課題を克服するために、業界では、メモリ安全性や大容量メモリの確保など、数多くの技術や最適化レイヤーを発明してきました。 それらの発明の結果、RAMからCPUのレジスタに8バイトをアクセスすることは、単純な MOVQ <アドレスXYZ> <相手先レジスタ> 命令で表現できるかもしれません。 しかし、CPUがそのバイトを格納している物理チップから情報を取得するために行う実際の処理は、非常に複雑です。 階層型キャッシュシステムなどの仕組みを説明しましたが、それ以外にも多くの仕組みがあります。

ある意味、そういった仕組みはプログラマーからできる限り抽象化されています。 たとえば、Goのコードで変数を定義するとき、どこにどれだけのメモリを確保しなければならないか、Lキャッシュに何個収めなければならないか、ということを考える必要はないわけです。しかし、大量のデータを処理する必要がある場合、驚かされることがあります。 そのような場合、メモリリソースに対する機械的なシンパシー、TFBOフローの最適化( 「3.6 効率性を考慮した開発フロー」 )、そして優れたツール類を復活させる必要があります。 ...