Kacam.net

コンピュータシステム

一次内存读,硬件走了几步

一次普通的内存读,硬件到底走了几步?

プロンプトをコピーして、どれか一つを選んでください。答えを並べるのではなく、面接官として場面ごとに問い詰めてきます。

アプリを入れたスマートフォンなら、そのままアプリが開きます。WeChat の中では外部アプリを開けないので、先にブラウザで開いてください。

コピーした文章の末尾には採点用の答えが付いています。自分で先に読まないこと —— 自分で導き出せたかどうかが肝心です。

这一份的分水岭是一问:翻译缓存没命中,和一个页根本不在内存里,是同一件事吗? 两者差三到四个数量级,一个纯硬件几十周期,一个要陷进内核 —— 分不清这两个,线上看到 fault 数飙升时就不知道该往哪查。

前面几幕会逼你自己算出「一张页表要 4MB、每个进程一张」,然后自己推出为什么必须分级、为什么必须有那个缓存。

顺带回答一个很多人记反的问题:虚拟内存的主要目的到底是不是「内存不够时拿磁盘顶上」。

★★★★☆ · 約 35 分 · 問われるのは:多级页表为什么存在、TLB 与缺页的区别、四个数量级

この一本が鍛えるもの

ページングとアドレス変換 キャッシュとキャッシュライン 遅延の桁

この問題はやったか

ログインすると「この問題はやった」を記録できます。次に来たとき、いつやったか分かります。

やった人の手記

まだ誰も書いていません。やり終えたら、そのやり取りで何が出てきたか書いてください —— どの場面で詰まったか、あとで変えた結論はどれか。

ログインすると手記を書けます。

使い方

この一群は学習型です:答えられなくなるまで追い込むのではなく、導きます。詰まったらまず「どの層で詰まったか」を聞き(聞いたことがない/知っているがなぜかは分からない/分かるが使えない)、それから何を渡すか決めます。同じ点で二度導いても通じなければ初めて答えを言い、そのあと自分の言葉で言い直させます。

ずっと数を求めてきます:「オーバーヘッドがある」「速い」と答えると止められます。桁を言えない結論は暗記した結論 —— この一群が鍛えるのはまさにそこです。

始め方

  1. 一本選んで開き、プロンプトをコピーします。
  2. 新しい空の会話に貼り、何も言わずに最初の質問を待ちます。
  3. 桁を聞かれる覚悟を:何ナノ秒、何マイクロ秒、何倍違うか。分からなければそう言えば、記録して先へ進みます。

途中でいつでも使える四つの合図

  • 跳过 すぐ次の場面へ
  • 换个说法 ここを別の角度でもう一度説明してもらう
  • 直说吧 答えを全部聞き、そのあと自分で言い直す
  • 复盘 すぐ締めに飛んで、振り返りカードを出してもらう

三つの落とし穴

  • 末尾の手札を先に読まないこと —— あの「よくある思い違い」の欄が、そのまま各問の答えです。
  • 用語に飛びつかないこと。「これは TLB ミス」と言うのは簡単で、ページフォルトより何桁速いかを言えて初めて分かったことになります。
  • 褒め始めたら「褒めないで」の鉄則を見るように言ってください。導くことは甘やかすことではありません。

桁の感覚を作りたいならランダム読みと最初の 1 バイトから。障害調査に効くのは malloc・TCP の詰まり・コンテキストスイッチ。並行コードを書くなら並べ替えと偽共有を。