This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -285,7 +285,7 @@ wrappedWillStop()
<p>然后我们来说说求对数,求对数也是没有指令的。因为对数是指数的逆运算,当然我们可以利用乘法运算一点点尝试。比如计算 log_210我们可以先尝试 32再尝试 3.12 等等,一直找到以 2 为底 10 的对数。这其实是个近似算法。</p>
<p>另外,在这个问题上聪明的数学家提出了很多近似算法,提升了计算效率。具体这里比较超纲,面试通常只考到有没有求对数的指令,感兴趣的同学可以学习泰勒级数、牛顿迭代法等。</p>
<p>比如下面这个泰勒级数可以用来求以<code>e</code>为底的对数,可以进行相似运算。</p>
<p><img src="assets/Ciqc1F9twiuAbp_aAAAe6lkGtXY531.png" alt="Drawing 0.png" /></p>
<p><img src="assets/Ciqc1F9twiuAbp_aAAAe6lkGtXY531.png" alt="png" /></p>
<p><strong>【补充内容】1 位的 CPU 能操作多大的内存空间?</strong></p>
<p>在 03 课时程序的执行中,有个问题我讲的不是很明白,在这里我们再讨论一下。</p>
<p>之前提到过 32 位机器只能操作小于 32 位的地址总线,这里其实讲的不太清晰,历史上出现过 32 位操作 40 位地址总线的情况。</p>
@@ -330,7 +330,7 @@ wrappedWillStop()
<h4>05 | 存储器分级 SSD、内存和 L1 Cache 相比速度差多少倍?</h4>
<p><strong>【问题】</strong> 假设有一个二维数组,总共有 1M 个条目,如果我们要遍历这个二维数组,应该逐行遍历还是逐列遍历?</p>
<p><strong>【解析】</strong> 二维数组本质还是 1 维数组。只不过进行了脚标运算。比如说一个 N 行 M 列的数组,第 y 行第 x 列的坐标是: x + y*M。因此当行坐标增加时内存空间是跳跃的。列坐标增加时内存空间是连续的。</p>
<p><img src="assets/Ciqc1F9twnCAUTt4AACDLWAQvC4277.png" alt="Lark20200925-181059.png" /></p>
<p><img src="assets/Ciqc1F9twnCAUTt4AACDLWAQvC4277.png" alt="png" /></p>
<p>当 CPU 遍历二维数组的时候,会先从 CPU 缓存中取数据。</p>
<p>关键因素在于现在的 CPU 设计不是每次读取一个内存地址,而是读取每次读取相邻的多个内存地址(内存速度 200300 CPU 周期,预读提升效率)。所以这相当于机器和人的约定,如果程序员不按照这个约定,就无法利用预读的优势。</p>
<p>另一方面当读取内存地址跳跃较大的时候,会触发内存的页面置换,这个知识在“<strong>模块五:内存管理</strong>”中学习。</p>