CSAPP即《Computer System: A Programmer Perspective》的简称,中文名为《深入理解计算机系统》。相信很多程序员都拜读过,之前买的旧版没有读完,如今恰好第二版出版,就入手影印版重读经典。一读果然,经典依然是经典,CMU卡内基梅隆大学的本科教材,堪比另一本SICP的六星佳作啊!

1.A Tour of Computer System


1.1 Programs Are Translated by Other Programs into Different Forms

程序被其他程序翻译成不同的形式。”简单一句话,却道破了本质。
整个过程对于程序员,尤其是C程序员都颇为熟悉:
  • 源文件.c =》 预处理各种#命令.i =》 翻译成汇编.s =》 翻译成机器码.o =》 链接外部文件成最终可执行文件
值得注意的是:汇编语言是如此有用,因为它为不同的编译器提供了公共的输出语言。



1.2 It Pays to Understand How Compilation Systems Work

为什么要知道上面这些编译系统的工作过程呢?
  1. 优化程序性能
  2. 理解链接时错误
  3. 避免安全漏洞
打断一下,说一个有趣的问题:CPU空闲时PC指向哪里?这也是一直困扰我的问题。很早以前电脑还装过一种叫Waterfall的CPU降温软件,当时很流行,而且确实好用。

1.3 Caches Matter

为什么缓存很重要?先来看一个例子,看一下在命令行执行一段简单程序时,在硬件中都发生了什么。
1)首先,在命令行中敲击./hello后(注意:此时还没敲回车),Shell将"hello"字符串通过I/O总线读取到CPU寄存器中,并保存到内存。


2)之后,当我们敲回车后,Shell就开始从磁盘加载程序到内存中了(DMA技术能不通过CPU,直接让磁盘和内存通信)。


3)现在hello文件中包含的代码已加载到内存,CPU开始逐条执行机器码了。最终将代码中的"hello, world"读取到寄存器,最终打印到显示器。


通过这个小例子我们就能看出计算机系统的特点:系统耗费大量时间把数据挪来挪去
于是,为了提高系统性能就有两种策略:
  1. 要么添加缓存,什么CPU的L1/2,磁盘的...
  2. 要么最小化数据移动,如内存计算(in-memory computing)
第二种策略不是本书的主题了,还是说回到缓存吧。所以说缓存很重要!接下来一节看下缓存对并发的影响。

1.4 Thread-Level Concurrency & Instruction-Level Parallelism

下图以Intel Core i7微处理器为例,i7有四核,每个核心都有自己的L1和L2缓存,但共享更高层次的L3缓存。
每个核心都是超线程技术(hyperthreading),即每个核心中有多套PC和寄存器,但只有一个ALU。这样CPU有更好的并发,例如当某个线程在等待一些数据加载时,CPU可以先去执行一个不同的线程。而且无需上下文切换,因为前面提到了CPU的一些硬件单元是有多份的。而管道化技术(pipelining)将一个指令的执行进一步洗分为多步(是不是有点像Tez对Hive的优化,Tez也是将MR任务细分为许多种,从而进行优化),从而将部分指令并行化。


六星经典CSAPP笔记(1)计算机系统巡游的更多相关文章

  1. 六星经典CSAPP笔记系列 - 作者:西代零零发

    六星经典CSAPP笔记(1)计算机系统巡游 六星经典CSAPP笔记(2)信息的操作和表示 六星经典CSAPP-笔记(3)程序的机器级表示

  2. 六星经典CSAPP笔记(2)信息的操作和表示

    2.Representing and Manipulating Information 本章从二进制.字长.字节序,一直讲到布尔代数.位运算,最后无符号.有符号整数.浮点数的表示和运算.诚然有些地方的 ...

  3. 六星经典CSAPP-笔记(11)网络编程

    六星经典CSAPP-笔记(11)网络编程 参照<深入理解计算机系统>简单学习了下Unix/Linux的网络编程基础知识,进一步深入学习Linux网络编程和TCP/IP协议还得参考Steve ...

  4. 六星经典CSAPP-笔记(7)加载与链接(上)

    六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制 ...

  5. 六星经典CSAPP-笔记(12)并发编程(上)

    六星经典CSAPP-笔记(12)并发编程(上) 1.并发(Concurrency) 我们经常在不知不觉间就说到或使用并发,但从未深入思考并发.我们经常能"遇见"并发,因为并发不仅仅 ...

  6. 六星经典CSAPP-笔记(10)系统IO

    六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓 ...

  7. 六星经典CSAPP-笔记(3)程序的机器级表示

    1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...

  8. Java 接口与继承 道至简第六章发表阅读笔记

    一.继承条件下的构造方法调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Creat ...

  9. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

随机推荐

  1. Discuz!X 系列 HTTP_X_FORWARDED_FOR 绕过限制进行密码爆破

    分析有个不对头的地方:http://wooyun.jozxing.cc/static/bugs/wooyun-2014-080211.html 后面再补 这个漏洞比较简单. 我们看到配置文件来./in ...

  2. CodeForces - 724G:Xor-matic Number of the Graph

    两点之间的任意路径都可表示为  随便某一条路径xor任何多个环, 然后可以用线性基来做,这样不会重复的, 另外必须一位一位的处理,xor是不满足结合律的 #include<cstdio> ...

  3. ●BZOJ 2839 集合计数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2839 题解: 容斥原理 真的是神题!!! 定义 f[k] 表示交集大小至少为 k时的方案数怎 ...

  4. bzoj 1217: [HNOI2003]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...

  5. 关于InnoDB的读写锁类型以及加锁方式

    (本文为了方便,英文关键词都都采用小写方式,相关知识点会简单介绍,争取做到可以独立阅读) 文章开始我会先介绍本文需要的知识点如下: innodb的聚簇索引(聚集索引)和非聚簇索引(二级索引.非聚集索引 ...

  6. 某些情况下调用函数为什么要在函数名前加“(void)”

    我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...

  7. java随机生成字符串和校验

    首先定义字符串 String a = "0123456789"; // 数字 String b = "abcdefghijklmnopqrstuvwxyz"; ...

  8. Docker学习笔记【一】

    [本篇学习笔记来源于 Docker 从入门到实践] 1.什么事Docker?[What] Docker在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等,极大的简化了容器的创建和维护 ...

  9. SSM实战

    http://www.07net01.com/2016/07/1607717.html https://github.com/Lutils/MyForum

  10. CentOS6.8虚拟机安装及ORALCE安装记录

    CENTOS6.8安装数据库及设置自启动脚本教程 作者:张欣橙 本文所需要的所有参数均位于文末附录中 一.新建虚拟机 选择下一步 选择下一步 选择稍后安装操作系统 选择LINUX 版本 CentOS ...