关于算法:你该不会拿-CSAPP-垫显示器吧

58次阅读

共计 3028 个字符,预计需要花费 8 分钟才能阅读完成。

一个程序员,到底须要对计算机的硬件理解到什么水平呢?🤔

如果你是零碎级软件开发工程师,想必这本书是你的案(垫)头(显)必(示)备(器);

如果你是应用软件工程师,或者不须要太多底层常识也能够使用高级语言设计程序。不过,只有你和计算机打交道,这本书中的内容你早晚都会遇到……

《深刻了解计算机系统》(简称 CSAPP),CMU 计算机导论教材,豆瓣评分 9.8,被誉为计算机领域的 「神书」

这本书的诞生能够回溯到 1998 年秋季 CMU 开设的计算机系统导论(ICS)课程。课程传授 Randal 和 David 意识到,「学生中简直没有人会亲自结构一个计算机系统,但大多数学生都日常应用计算机编写程序」。因而,他们筛选了主题,排除了手写汇编语言、总线设计这样的内容,重点关注:C 语言编译器是如何将 C 语言翻译成机器代码的?编译器是如何翻译指针、循环、过程调用语句的?因而,这门课、这本书的主旨是 从程序员的角度 来解说零碎,把硬件、零碎、软件系统地联合起来,形成一整个框架,这对学生而言更实用也更具体。

不少国内学校都以这本书作为参考教材,所有想通过学习计算机系统的外在运作、从而写出更好程序的人,都应该认真浏览此书并实现课后作业 📒。

这本书中的不少内容针对 C 语言个性(包含指针、显式的动态内存调配、格式化的 I/O),对于 C 语言背景单薄的读者,这本书中有一些专门的正文帮忙突出 C 语言中重要的个性。

如果你感觉这本书对你有些艰难,但又渴望理解计算机体系结构,能够从《编码:隐匿在计算机软硬件背地的语言》这本小书动手,也能够参考本文第三局部 「如何浏览这本书」 辅助学习。

你将从这本书中取得:

  • 理解编译系统如何工作,帮忙优化程序性能、了解链接时呈现的谬误、防止安全漏洞
  • 零碎级了解计算机的实质概念,以及这些概念如何实实在在地影响应用程序的正确性、性能和实用性

二进制炸弹 💣

CSAPP 这本书十分激励你 入手尝试,每章都带有练习题与参考答案,还有相应的实验课(Lab)与试验的主动评分零碎。

你能够从官网上找到九个试验(http://csapp.cs.cmu.edu/3e/la…)包含:数据试验、二进制炸弹试验、缓冲区溢出试验、体系结构试验、性能试验、cache 试验、shell 试验、malloc 试验、代理试验。这些配套试验不仅有趣风趣,而且能训练你学到的内容,加强调试程序的能力,让你 一生受害

让咱们一起来看看赫赫有名的「二进制炸弹」吧!

邪恶博士在咱们的班级机器上搁置了大量的「二进制炸弹」。二进制炸弹是由六个环节组成的程序。每个环节,你都要输出一个特定的字符串。只有输出正确的字符串能力拆除炸弹,进入下个关卡。否则,炸弹会爆炸💥!在解决本程序时,不得穿戴防弹衣。

有太多炸弹要咱们解决,所以咱们给每个学生一个炸弹来拆除。这是你的工作,你别无选择,只能承受,就是在截止工夫前拆除你的炸弹。祝你好运,欢送退出拆弹小组!

这个试验能训练到哪些能力?

比方,想要破解第一个炸弹,须要执行以下步骤:

  • 设置调用函数断点
  • 运行至断点处并调试
  • 进入函数外部进一步察看
  • 剖析代码得出答案

残缺拆除六个炸弹,你就能够相熟 GDB 调试工具、彻底了解函数调用的栈帧、相熟罕用寄存器的用处、相熟 AT&T 汇编语法。

在小编看来,写程序这件事件有一个极大的妙处:当你学到了什么新货色,你能够马上试验并看到运行后果。你不须要看残缺本书就能明确某件事情,我只须要学到能够本人能入手尝试并纠错就够了。

在计算机底层,数组是如何存储的?

让咱们来看下方两个函数,这两个函数都是对一个二维数组的各个元素求和,区别在于循环的优先程序不同:


int sumarrayrows(int a[M][N]) {
    int i, j, sum = 0;
    for (i = 0; i < M; i++) {for(j = 0; j < N; j++) {sum += a[i][j];
        }
    }
    return sum;
}
// 后行后列

int sumarraycols(int a[M][N]) {
    int i, j, sum = 0;
    for (j = 0; j < N; j++) {for(i = 0; i < M; i++) {sum += a[i][j];
        }
    }
    return sum;
}
// 先列后行

编译运行,看看运行耗时差了多少?后行后列 先列后行 快了 25 倍!

这到底是为什么呢?答案就藏在这本书的封面中:

存储器零碎为 CPU 寄存指令和数据。实际上,存储器零碎并不是一个线性构造,而是具备不同容量、老本和拜访工夫的层次结构。封面中的储存器山,展现了读吞吐量,是工夫和空间局部性的函数。须要留神的是,L1 山脊的最高点(此处 CPU 读取率为 14GB/s)与主存山脊的最低点(此处 CPU 读取率为 900MB/s)之间的差异有 整整一个数量级

C 语言以 行优先 顺序存储数组,所以替换扫描程序看似无伤大雅,却导致对高速缓存变得不敌对。在列扫描中,如果整个数组都在高速缓存中,内存援用不命中率(miss rate)为 1/4;而在大多数状况下,数组超出高速缓存,那么每次对 a[i][j] 的拜访都会不命中,显著影响了运行工夫。

这本书的第六章具体介绍了存储器的层次结构。作为一个程序员,如果你了解存储器层次结构,留神程序中的局部性,将会大大提高程序性能

如何浏览这本书?

在知乎上,小编看到了不少发问:

「如何浏览《深刻了解计算机系统》这本书?」

「《深刻了解计算机系统》这本书须要什么程度能看懂?」

……

很多同学都示意内容太难,读不上来 🤮

自底向上的内容着实有些干燥,小编整顿了一些官网材料与集体读者的笔记,心愿能助你一臂之力。

官网资源:

  • 网课(中文字幕版):

    https://www.bilibili.com/vide…

  • 课件地址:

    http://www.cs.cmu.edu/afs/cs/…

  • Lab 地址:

    http://csapp.cs.cmu.edu/3e/la…

集体我的项目:

导读网站:https://fengmuzi2003.gitbook….

@fengmuzi2003 制作了一个 CSAPP 导读网站,不仅对每一章都进行了介绍,而且举荐了一些不错的资源、学习形式、视频解读。比方,ta 给出了学习门路上的倡议:

学完第 06 章之后间接学习第 09 章(实质上它们属于同一主题),而后再学习第 05 章(因为外面的一部分优化内容与第 06 章介绍的 CPU 缓存有关联),书中解说系统软件的局部不太残缺,比方 IPC 等内容没有波及,倡议大家本人参考《UNIX 环境高级编程》,或者《LINUX 编程接口》……

电子书资源:https://hansimov.gitbook.io/c…

@hansimov 主导整顿了 CSAPP 的电子书资源和试验资料(包含 Hints),不便浏览。

如果切实读不上来,无妨劳动一下,读读这些好玩的换换脑子:

AI 收藏夹 Vol.001:当你的语音助手不再温柔

AI 收藏夹 Vol.002:被 AI 阻止的又一次他杀

AI 收藏夹 Vol.003:AI 能听懂阴阳怪气吗?

积攒代码量很重要,

读书、读好书也很重要。

「Zilliz 好书举荐」栏目,

旨在与你分享技术成长相干的书籍,

与你一起先把书读厚,再把书读薄。

Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。

Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。

正文完
 0