- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け
- Nginx受け口
- アプリ処理今ここ
- DB保存
前回、キャッシュがメインメモリの遅さを埋めていることを見ました。今回はその埋められる側、メインメモリ自体の中身を覗きます。
まず結論
メインメモリ(DRAM)は、極小のコンデンサに電荷があるかないかで1ビットを覚えています。電荷は自然に抜けていくので、定期的に読み直して書き戻す必要があります。これがリフレッシュです。
ただし「リフレッシュがあるからDRAMは遅い」というよく見る説明は、因果を取り違えています。1回の読み出しの時間を決めているのは、行を開けて微小な電荷を長い配線越しに増幅すること、読むと失われる電荷を書き戻すこと、行を閉じて次に備えることです。リフレッシュはそれとは別の損失で、小さくはなく、大容量化で増えています。
DRAMが SRAM(キャッシュに使われる)より遅い、主な原因は何でしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
1ビットを覚えるのに、部品は2つだけ
前回、メインメモリが遅いせいでCPUが200〜400サイクルも待つことを見ました。では、そのメインメモリの中身はどうなっているのでしょうか。
DRAMの1ビットは、驚くほど単純です。トランジスタ1個とコンデンサ1個、それだけです。
コンデンサというのは電気を溜める小さな入れ物です。電荷が溜まっていれば1、空なら0。トランジスタは、そのコンデンサへの出入口を開け閉めするスイッチの役割をします。
部品が2つしかないので、非常に小さく作れます。だから1枚のチップに何十億ビットも詰め込めて、16GBのメモリが手頃な価格で買えるのです。
一方、キャッシュに使われるSRAMは、1ビットにトランジスタ6個を使います。回路が値を能動的に保持し続けるので高速ですが、面積を食います。前回「L1は32KBしかない」と書いたのは、この面積の制約が理由です。
2種類の記憶素子を並べて比べる
DRAM SRAM1ビットの構成 トランジスタ1 + コンデンサ1 トランジスタ6密度 高い(安く大容量) 低い(高価)速度 遅い(約100 ns) 速い(約1 ns)電荷の保持 漏れる → リフレッシュ必要 電源がある限り保持使われる場所 メインメモリ CPUのキャッシュ
この表の「1ビットの構成」の行が、他のすべての違いを生んでいます。部品2つなら小さく作れるので大容量・低価格になり、部品6個なら大きくなるので小容量・高価格になる。構造の違いが、そのまま用途の違いになっています。
なぜキャッシュにDRAMを使わず、高価なSRAMを使うのでしょうか。
電荷は、放っておくと抜ける
コンデンサに溜めた電荷は、時間とともに漏れていきます。水を入れたバケツにごく小さな穴が開いているようなもので、放置すれば必ず空になります。
空になれば、1が0に化けます。データが勝手に壊れるわけです。
そこでDRAMは、中身を定期的に読み直して、同じ値を書き戻すという作業を延々と続けています。これがリフレッシュです。DRAMの D は Dynamic(動的)の意味で、「何もしなくても保つ静的(Static)なSRAM」に対して、動き続けないと保てないという性質を表しています。
保持時間(85℃以下) 64 ミリ秒保持時間(85℃超) 32 ミリ秒(高温では倍速で実施)DDR4のリフレッシュ間隔 約 7.8 マイクロ秒(64ms ÷ 8192回 = 7.8µs ごとに1回)
64ミリ秒というのは人間には一瞬ですが、ナノ秒で動くCPUにとっては永遠のような時間です。その間に全領域を読み直しています。
ここで、よくある誤りを一つ潰しておく
DRAMについて調べると、次の説明に非常によく出会います。
「DRAMはリフレッシュが必要なため、SRAMより遅い」
これは因果の取り違えです。 リフレッシュと重ならない読み出しでも、DRAMは遅いままです。1回の読み出しの時間を決めているのは、次の3つの手順です。
- ・リフレッシュはこれとは別の損失。小さくはなく、大容量化で増えている
- ・「リフレッシュのせい」は解説サイトで非常に多い誤り
SRAMにはこのどれも必要ありません。回路が能動的に値を保持しているので、読んでも消えず、増幅も要らず、行を開ける手順もありません。だから速いのです。
ただし逆に「リフレッシュは無視できる」と言い切るのも誤りです。リフレッシュ中はバンクの一部が要求に応えられないので、全体の性能は下がります。8コアのシミュレーションでは、32Gbのチップで平均16.6%の性能低下が出ており、大容量化するほど重くなっています。
DRAMで「読み出すと電荷が失われる」ことを何と呼び、どう対処しますか。
「アドレス」はDRAM上の座標ではない
最後に、次回への橋渡しとなる重要な点を押さえます。
プログラムを書いていると「メモリのアドレス」という言葉が出てきます。これを**「DRAMチップ上の物理的な場所を指す番号」**だと理解していると、次回の仮想メモリで確実に混乱します。
実際には、CPUが扱っているアドレスからDRAMのセルに届くまでに、2段階の変換があります。
- ・プログラムが見ているアドレスは、DRAM上の位置を直接指していない
- ・この2段階を意識しておくと、次回の仮想メモリが理解しやすい
つまり**アドレスとは「バイト単位で振られた通し番号」**であって、物理的な座標ではありません。この区別が、次回の主題になります。
この章のまとめ
- DRAMの1ビットはトランジスタ1個+コンデンサ1個。部品が少ないので高密度・低価格に作れる。
- SRAM(キャッシュ用)はトランジスタ6個。速い代わりに面積とコストがかかる。
- コンデンサの電荷は漏れるので、定期的に読み直して書き戻すリフレッシュが必要(85℃以下で64ミリ秒周期)。
- 「リフレッシュがあるから遅い」は因果の取り違え。 1回の読み出しの時間は、微小電荷の増幅・書き戻し・行の開け閉めで決まる。リフレッシュの損失は別にあり、小さくはない。
- プログラムが扱うアドレスは、DRAM上の座標ではない。2段階の変換を経て初めてセルに届く。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
DRAMの1ビットは、物理的に何で構成されていますか。
用語集(5語)
- DRAM (Dynamic RAM)
- メインメモリに使われる記憶素子。トランジスタ1個とコンデンサ1個で1ビットを保持する。高密度で安価だが、電荷が抜けるため定期的なリフレッシュが必要。
- SRAM (Static RAM)
- キャッシュに使われる記憶素子。トランジスタ6個で1ビットを保持する。電源がある限り値が保たれ高速だが、面積とコストがかかる。
- リフレッシュ
- DRAMのコンデンサから漏れた電荷を、読み直して書き戻すことで復元する動作。標準的な保持時間は85℃以下で64ミリ秒。
- 破壊読み出し
- DRAMでは読み出すとコンデンサの電荷が失われるため、読んだ直後に必ず書き戻す必要がある。書き戻しが終わるまでその行を閉じられない。
- センスアンプ
- DRAMセルの微小な電荷を増幅して0か1かを判定する回路。配線が長く容量が大きいほど、電荷が配線に移って判定できるまでに時間がかかる。