《深入理解计算机系统》 第一章读书笔记

最近开始啃CSAPP,买了英文版,看得比较慢。只有先理解系统才能在更多方面学的更明其实质



Chapter1:

* 一份hello.c代码的编译分为四个阶段:1.Pre-processor:编译预处理,就是把#include后面的库代码加入到程序中,生成hello.i的文件。 2.Complier:用编译器把hello.i的C代码翻译成汇编语言,并生成:hello.s文件。(汇编语言是高级语言转为机器码的一个中间过程) 3.Assembler:汇编机把汇编语言翻译成机器二进制代码,生成hello.o文件。 4.Linker:把自己的hello.o和库函数的printf.o连接起来,生成Executable object program.

* adapter和controller都是连接总线和硬件设备的一个转换器,不同之处是adapter通常是插在motherboard上的插槽上的(显卡,声卡),而controller是motherboard集成的。

* CPU执行程序的原理:CPU都有一套属于自己的指令集(Instrctions set),指令集里面规定了读取那一条指令就做什么操作。而程序就是一个顺序特定的指令集合,存储在内存中(Main memory),CPU里的progrm counter(PC),总是指在内存的某一条指令上,CPU就会读取当前指令并执行对应的操作,并调整到下一个指令,且这些指令不是在内存上的连续区域,是一种类链表是方式散布在内存。

* hello.c程序在计算机里执行过程概览:首先UNIX计算机处于shell模式,CPU的PC指向内存中某一个指令。然后人从键盘输入“hello”并按回车,这个“hello”就经键盘controller生成并有I/O总线到达I/O桥,再由系统总线到达CPU里的register file里面。register只是暂时存储,分析之后CPU会将这个名字经系统总线、I/O桥、内存总线转移到内存里存下。然后CPU会根据内存中存下的这个程序名字去disk中寻找该程序的实际机器码,并把它经I/O总线,I/O桥、内存总线不经过CPU直接搬运到内存中去(DMA技术)。搬运到内存中的程序其实是一系列特定顺序的指令,CPU读取这些指令并依次执行,直到读到输出”hello world”字符串的指令,这个字符串在内存中被当做数据储存着,CPU将这个数据读取到register中来,然后再经总线运到图形adapter处,图形adapter解码这些数据并显示出来。

* 高速缓存(cache):CPU的处理速度,大于从内存中读写数据的速度,这就产生了processor-memory gap,为了解决这个效率低下的gap,就有了cache memories。cache memories 通常是有两到三个cache层级组成,其中第一次容量最小(但比register大),速度最快(但比register小),然后后来的两个cache性能依照层级变化。运行程序的时候把常用的指令放在cache而不是内存里,这样就会提高数据读写传输速度,解决processor-memory gap。

* 存储层级系统:计算机系统,由一个存储层级系统构成,其中顶层速度最快,容量最小,每字节成本最高的register,往下是几个级别的cache,内存,外存,其他系统的存储……整个系统的存在是为了在最小的成本下,让CPU的性能和存储系统的性能相匹配。

* OS是应用程序和底层硬件之间的过度层,他将复杂繁琐的底层抽象出来展现给应用程序。

* 进程的概念:进程是OS当前执行的程序的抽象。当一个进程要转换到另一个进程的时候,会先保持当前经常的所有状态信息,然后读取另一个进程的状态信息,运行另一个程序。

* 多线程(Multi-threading)是非常高效率的并发运行技术。

* 虚拟内存:程序运行时往往不是实际的内存地址,是操作系统分配的虚拟内存区域。这个虚拟内存区域既包括内存(main memory)又包括disk。然后OS赋予其一个虚拟的连续地址,由高到低,在地址上严格的分层次。其中最低层次的是程序本身的代码和数据,然后是堆(heap),然后是库文件的程序和数据,再然后是用户栈(stack),最顶端是操作系统的核心代码区域。

* 文件:Unix哲学的精华就是一切皆文件。其实文件就是一系列的位(byte)组成的。所有的I/O设备都可以看做是文件,操作一个设备其实就是向它的缓冲区读取或写入文件。这个思维大大简化了,程序员的使用难度!我们不需要去理解其深层次硬件是如何与软件衔接的,只需要向操作文件一样去操作它就是了。

* 并发(concurrency)和并(parallelism)的概念区别:并发就是指计算机同时处理多个进程。而进程是指运用并发的手段让计算机运转更快。

* 线程级别的并行:一个CPU由多个核心组成,而一个核心同常可以同时执行两个线程,这些线程的一二级高速缓存是独立的,但是它们共用第三级高速缓存,以实现线程级别的并行处理,大大提升效率。而要利用CPU的多线程就要使用多线程来大大提升程序的执行速度,就要采用多线程的方法。

* 指令级别的并行:就是一个时钟周期由于CPU在同时执行多个指令,所以均摊下来每个时钟周期就相当于执行了几条指令,而不采取并发技术的话,每个时钟周期只能执行一个指令的其中一步。

* SIMD并行:指的是Single Instructoin,Multiple Dates.就是一条指令执行多个操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 10:30:56

《深入理解计算机系统》 第一章读书笔记的相关文章

《内核设计与实现》第一章读书笔记

<内核设计与实现>第一章读书笔记 第一章:Linux内核简介 1.1 Unix的历史 Unix强大的特点 A.简洁,几百个系统调用,明确的设计目的 B.文件对待所有东西 C.移植性强(C语言) D.进程创建快,使用fork()系统调用. E.进程间通信元语,进程间通信机制 1.2 linux的简介 Linux系统的基础是内核.C库.工具库和系统的基本工具. 1.3 操作系统和内核简介 内核:管理者,操作系统的核心 通常一个内核由负责响应中断的中断服务程序和网络.进程间通信等系统服务共同组成.

《现代前端技术解析》第一章读书笔记(未完成)

今天是2017年6月26日,星期一,开始从第一章看起.第一章主要讲的是前端技术的发展概况以及一些必须掌握的浏览器基础知识与常用开发技术. 页面内容多而复杂,为了保证开发效率,我们可以借助符合特定场景的前端框架来提高开发效率,例如使用JQuery丶MVVM等开发框架,对常用的 HTML DOM 操作进行高效封装,大大简化开发工作量,提高效率. 前端项目代码越来越多丶结构越来越复杂,我们必须考虑用模块化和组件化的思路来管理.所谓的模块化和组件化是指采用代码管理中分治的思想,将复杂的代码结构拆分成多个

《构建之法》第一章读书笔记

工程有了一个初步的了解.介绍了软件工程里的一些基本概念,软件开发的几个阶段.软件工程的特殊性.目标以及软件工程与计算机科学之间的联系与区别.    软件工程作为一门新兴的学科,是连接计算机硬件和传统机械工程的一个桥梁.起先,我所认为的软件工程单纯的只是编程,通过算法实现正确的输出而已.但在构建之法的第一章中,我认识到会写程序只是一个合格的软件工程师最基本的素质.一个完整的项目,应该在需求分析,软件构架设计.代码实现.程序测试.软件发布运营及维护每个阶段都尽职尽责,并结合用户体验去完善软件的每一个

&lt;java编程思想&gt;第一章读书笔记二

7.伴随多态的可互换对象 前面说了继承,我们知道继承中存在基类(父类)以及导出类(子类),不知道大家有没有遇到过这种情况?就是在向一个方法中传递一个对象作为参数时,我们往往会选择传递一个基类而不是一个子类,为什么要这么做呢?其实原因也很简单,说的高大上一点就是这样做有利于代码的健壮性和可扩展性,说的详细还是有利于代码的健壮性和可扩展性,更重要的也就是可扩展性. 还拿喝可乐的例子来说,如果你传递的参数对象是可乐,那么不管你是给我百事可乐还是可口可乐我都可以接受啊,但是如果你传递的参数仅仅是百事可乐

Android系统移植与驱动开发第一章读书笔记

最近,认真学习了Android深度探索的第一章内容——Android系统移植与驱动开发概述,了解了Android是基于Linux内核的.这一章作为学习Linux驱动的基础,对Android以及Linux驱动做了总体的介绍,为之后的学习打下良好的基础. Android作为优秀的嵌入式操作系统,其系统架构可分为四层,通过学习,清楚的明白了每一层的作用以及功能.Android移植可分为两部分:应用移植和系统移植.应用移植是指将应用程序移植到某一个特定硬件平台上.系统移植是指让Android操作系统在某

《CSS那些事儿》第一章读书笔记

css语法结构: selector{property:value:} 属性值名称过长且带有空格,要用引号包含,如"sans serif" css中的注释: /*this is a comment*/ css中的简写: 颜色  十六进制形式#RRGGBB RGB函数值形式RGB(x,x,x) x可为0-255数值,也可以是0-100%百分数(但是与255乘积必须是整数) 直接写颜色名,如 red yellow等 用户系统色盘值 当数值为0的时候,单位可省略: border属性简写:wid

第一章读书笔记--关于View

Chapter1 Views Chapter1 Views The Window Experimenting With Views Subview and SuperView 可见性和透明度Visibility and Opacity Frame Bounds and Center 窗口坐标和屏幕坐标 Transform Trait Collection and Size Classes Layout 1 Autoresizing 2 AutoLayout 21 Constraints 22 A

Android深度探索--HAL与驱动开发----第一章读书笔记

1.1   Android拥有非常完善的系统构架可以分为四层: 第一层:Linux内核.主要包括驱动程序以及管理内存.进程.电源等资源的程序 第二层:C/C++代码库.主要包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:android SDK API 直接面向应用程序的Java APK 第四层:应用程序.直接面向最终用户的Java应用程序 1.2  Android系统移植的主要工作 Android移植可以分为应用移植和系统移植两个部分.(本书对移植没有太多的介绍) Andr

第一章读书笔记

ndroid系统移植的主要工作 系统移植:让android操作系统在某一个特定平台上运行,条件是 操作系统支持硬件平台的CPU架构.移植linux驱动.移植HAL(HAL位于第二层,android SDK通过HAL直接访问linux驱动),后两个是android系统移植的主要工作. 应用移植:第四层的应用程序一直到一个特定平台上,由于硬件平台之间有差异,android SDK API有可能存在差异,需要对源代码进行修改,并不涉及驱动和HAL程序库. 说到 Android 驱动是离不开 Linux