7/29/2015

キャッシュの話

昔、キャッシュで苦労したことを思い出して、記事にしようと思い立つ。

まず、キャッシュとは何ぞやという話から。

今日のコンピュータシステム、PCやスマホも含め、各々役割を持ったチップ間のデータ転送によって動いています。このうち、根幹を成す構成部品としてはCPU、メモリ、ストレージ(SSDやハードディスク)があり、例えば、特定のアプリケーションを実行しようとした場合、ストレージに沢山保存されているアプリケーションプログラムやデータの中から、必要なものをメモリにロードし、CPUがメモリからその瞬間に処理すべきコードを逐次読み込み、実行するという階層構造になっています。

つまり、ストレージは動作が遅いけども、プログラムやファイル等のデータを沢山保存できる。メモリはストレージほど沢山データを蓄えることはできないが、ストレージよりも高速に動作します。しかし電源を切ると内容は消えてしまう一時的な作業場のようなものです。CPUは高速にプログラムを実行したりデータを計算したりしますが、その瞬間に扱う位の小さなデータしか保持していられない。
この一連の流れを料理に例えるなら、ストレージは食材を保存しておく冷蔵庫、メモリは食材を調理するためのまな板、CPUはコックさんという感じです。


というわけで、CPU、メモリ、ストレージ間で、階層的なデータのやり取りがあるわけですが、その間には著しい動作速度の差があり、コンピュータシステム全体のパフォーマンスに大きく影響しています。どんなにCPUが高性能でもストレージが遅ければ、そこがボトルネックになってしまうわけです。

で、コンピュータは、これだけではなく、様々な速度差のある半導体の集合から成っており、各々の速度差を緩和しようという仕組みがキャッシュなわけです。具体的には、速度差をある程度、吸収する小さな一時記憶を設けるのです。

で、このキャッシュ。動作の仕方に大きく分けて2つの方式があり、今回はこれをまとめておこうという話です。


1. ライトスルー(Write Through)

データを転送する場合、書き込みと読み込みの2方向が発生します。この方式では、よく読み込まれるデータをより高速な記憶媒体に置き、書き込み方向の動作はキャッシュしません。キャッシュはキャッシュラインという単位で扱われ、一度アクセスがあったデータをキャッシュ領域に保持し、同じデータの読み込みがあったらキャッシュ領域から読み込むことで読み込みを高速化します。しかし、キャッシュ領域はより小さいので、使われないデータほど入れ替わっていきます。この入れ替わり方にもいくつかの方式があるのですが、それはまた今度まとめます。


2.ライトバック(Write Back)

この方式では、ライトスルーの動作に加え、書き込みもキャッシュされます。キャッシュラインに書き込み、どっかのタイミング(実装による)で非同期的に、実際の記憶域に書き込みが行われます。パフォーマンス的にはライトスルーよりも良いのですが、これが結構複雑な問題を生みます。つまり、書き込んだ側は、書き込みが終わったと思って処理を進めますが、書き込まれた側は、一時的に記憶しているだけです。実際の記憶域とのデータに差が生まれます。一対多の通信の場合、別の装置が同じ場所のデータを読み込んだ場合に不整合を処理する機構が必要になったり、(これをコヒーレンシとか言う)実際の記憶域に書き込む前に接続が切れたり、電源が落ちた場合に、データに不整合が生じます。なので、話はライトスルーよりも格段に複雑になり、トラブルも起こりやすいです。


今回は、こんなとこです。あと、インテルチップでライトコンバインとかのキャッシュ動作もあったりします。グラフィック系のデータで、一画面分とか、かなりまとまったデータを扱う場合に有効とかなんとか。次はもうちょっと突っ込んだ話を書きたいと思っています。





7/17/2015

aptコマンド小ネタ

LinuxでUbuntuやLinuxMint、Debian等のaptがパッケージマネージャのディストリビューションで便利なネタのメモ

apt-get update

で、システムに登録されているパッケージ情報を更新し、

apt-get install software-name

とすると、ソフトウェアパッケージをネットからダウンロードしてきてインストールできるわけですが、一字一句違わず正確なパッケージ名が分からないとインストールできないわけです。

そこで、便利なのが、apt-cacheというコマンド

apt-cache search keyword

とすると、その文字列を含むパッケージ名を検索できます。また、何かコードを書いて、ビルドしようとしたり、サンプルソースコードをビルドしようとしてヘッダーやライブラリが無くてエラーということはよくある話です。そんな時は、apt-fileが便利です。

apt-file update
apt-file search "file-name"

とやると、そのファイルが含まれるパッケージが検索できます。


あと、ディスク容量を節約するのに以下が役に立ちます。

apt-get clean

とすると、過去にインストールするためにダウンロードされたパッケージのキャッシュをクリアできます。一度インストールしてしまえば、再インストールするとき意外、不要なので、積極的にクリアしても問題ないです。再インストールするときは、キャッシュが無ければ再ダウンロードされるだけで、同じパッケージを何回もインストールし直すこと自体あまり無いことなので、このキャッシュが活躍することはあまり無いと思われます。

それから

apt-get auto-remove

とやると、使われていないパッケージを一括削除できます。aptパッケージマネージャでは、一つのアプリケーションをインストールする際、そのアプリケーションを動作させるのに必要な依存パッケージを芋づる式にインストールしてくれて便利なのですが、パッケージを削除したり更新したりしていると、そうした芋づるインストールされたパッケージが、実は今はもう使っていないということがよくあります。ですが、自動的にインストールされたものは何に使われているのか判断が難しいという問題があり、このコマンドがそのあたりをうまいことやってくれます。



今回はこのへんで。