计算机系统是由硬件和系统软件组成的。

系统的具体实现在变,但系统内在的概念没有变。

所有的系统都有相似的硬件,相似的软件组件,它们执行着相似的功能。

这些组件是如何工作的?这些组件是如何影响程序的正确性和性能的?本书予以解答。

K&R的hello程序要完成运行,系统的每个组成部分都需要协调工作。本书就是告诉你在系统上运行hello程序时,系统发生了什么以及为什么会这样。

1.1 信息就是位+上下文

图1-2真的是hello.c的ASCII码表示,除了可见的字符外,不可见的是sp和\n,从第一个到最后一个完整的表示出来。这就是文本文件。

“\n”是在每一行的结尾处,或者说有“\n"才有一行的结束,其表现就是光标到了下一行,另起一行。

这里说ASCII字符构成的文件称为文本文件,所有其他文件都是二进制文件,我想有点不对,应该是所有由编码字符构成了文件是文本文件,其他是二进制文件。编码字符不止ASCII,还有UTF-8等等,ASCII不可以表示中文。

系统的所有信息都是一串位,区分这些位表示什么信息的方法,唯一方法,是读到这些位时候的上下文。

这个上下文既然是从位的角度讲的,那么至少也是在汇编语言级别去解释,比如mov,是movb还是movw,这种就应该算是上下文,更底层的机器语言就看不懂了。c语言也不是,c的表达方式就已经在文本级别了,与位其实有一定的差距了。(这句话的理解也不知道对不对,暂且不管)

c语言是系统级编程的首选,同时也非常适用于应用级程序的编写。c++和java是应用级程序的新的程序设计语言。

1.2 程序被其他程序翻译成不同的格式

可执行目标文件是二进制文件,是按照一种格式打包起来的,这个格式称为可执行目标程序,打包的对象是从每条c语句转化出来的低级机器语言指令。

编译器驱动程序完成从源文件到可执行目标文件的转化。这里有驱动两个字。

转化的过程有4个阶段,分别用到预处理器,编译器,汇编器,链接器。

  • 预处理器处理的是以字符#开头的命令,也就是说#开头的就是预处理命令,会经过预处理器处理。
  • 编译器为不同的高级语言的不同的编译器提供了通用的输出语言—汇编语言。
  • 汇编器也会打包,按照可重定位目标程序的格式来打包。二进制文件的字节编码是机器语言指令而不是字符。
  • 链接器,每个程序不可避免的会使用到一些标准库里的函数什么的,每个编译器都包含了c的标准库,存放在可重定位目标程序格式打包的文件中(我认为),将这个文件和汇编器产生的文件合并,就是链接器的作用。然后,结果是得到了可执行目标文件,打包格式为可执行目标程序。

1.3 了解编译系统如何工作是大有益处的

优化程序性能-我们确实需要了解一些机器代码以及编译器将不同的c语句转化为机器代码的方式。

两种机器语言:IA32和X86-64,3章学习这个,机器语言,说的是机器语言还是汇编,应该是一样的,汇编和机器是一一对应的。所以就是机器语言。

3章学习这两个语言,5章学习如何优化程序性能,6章学习存储器系统

3章还将学习堆栈原理和缓冲区溢出错误,这是大多数安全漏洞的主要原因。

1.4 处理器读并解释存储在存储器中的指令

shell是一个命令行解释器。

所有系统都有的相同外观和特性:总线,字长是一个基本的系统参数,4字长就是32位。I/O设备,每个I/O设备都通过一个控制器或者适配器与I/O总线相连;控制器是芯片组,或在主板上或在I/O设备本身上;适配器是插在主板插槽上的卡。

处理器的核心是程序存储器(PC),是一个字长的存储设备,或者说寄存器。PC中始终存着某条指令的地址。这说明一个事情:地址是一个字长的。(至少表面上看是这样的)。

寄存器文件是由一些1字长的寄存器组成的。ALU计算新的数据和地址。

CPU执行:

  • 加载——把一个字节或者一个字从主存复制到寄存器。
  • 存储——把一个字节或者一个字从寄存器复制到主存。
  • 操作——两个寄存器的内容复制给ALU,ALU算术运算,并将结果存放到一个寄存器中
  • 跳转——从指令本身中抽取一个字,并复制到PC中。

3章介绍指令集结构(每条指令的效果),4章介绍微体系结构(处理器的实现)。

1.5 高速缓存至关重要

意识到高速缓存存在的应用程序员可以利用高速缓存将他们程序的性能提高一个数量级。6章将介绍。

1.6 存储设备形成层次结构

每个计算机系统中的存储设备都被组织成了一个存储器层次结构。

1.7 操作系统管理硬件

操作系统有两个基本功能:1防止硬件被失控的应用程序滥用,2应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。

操作系统通过几个基本的抽象概念来实现这两个功能:进程,虚拟存储系统,文件。文件抽象I/O设备,虚拟存储器抽象文件和主存,进程抽象虚拟存储器和处理器。

系统上只有一个程序的假象,是通过进程的概念来实现的。

进程是操作系统对正在运行的程序的一种抽象。操作系统进行的抽象。

一个cpu看上去像是在并发的执行多个进程,这时通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制是上下文切换。

上下文是操作系统保持跟踪进程运行所需的所有状态信息。包括:PC和寄存器文件的当前值,主存的内容。

单处理器系统在任何时候都只能执行一个进程的代码。

shell是一个进程,hello是一个进程。8章介绍进程的实现。

每个线程都运行在进程的上下文中,并共享同样的代码和全局变量。12章学习写线程化的程序。

虚拟存储器为进程提供了一个假象,即每个进程都在独占地使用主存。

每个进程看到的是一致的存储器,称为虚拟地址空间。一致的,就是说一样的。

在linux中,每个进程看到的虚拟地址空间由大量准确定义的区组成。空间从底部向上地址不断增加。

  • 对于所有的进程来说,代码是从同意固定地址开始,就是程序的代码(这里应该是编译后的机器代码了)从确定的位置开始。也就是虚拟地址空间的底部都具有相同的地址,从这个地址开始首先存放的是代码,然后是c全局变量。这两者是按照可执行目标文件的内容初始化的。7章会学到更多有关地址空间的内容。
  • 在代码和数据后是堆,运行时堆,代码和数据区在进程开始的时候就规定了大小,这是正常的,因为代码和全局变量是不会变化的。堆会动态的扩展和收缩,c中使用malloc和free这两标准库函数就会有这种效果。9章更详细的研究堆。
  • 大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样共享库的代码和数据的区域。也是代码和数据的区域。7章将学习共享库是如何工作的。
  • 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。也会收缩和扩展,调用一个函数时就增长,从一个函数返回时就收缩。这里的栈是在顶部,用户虚拟地址空间的顶部,上面还有内核虚拟存储器,这个不管,在用户虚拟地址空间的顶部说明栈是向下增长的,而堆紧靠着代码和数据区说明堆是向上增长的,两者中间是共享库区,好理解。3章学习编译器是如何使用栈的。
  • 内核总是驻留在内存中的,是操作系统的一部分,地址空间顶部的区域(不是用户虚拟地址空间,而是虚拟地址空间)是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。应用程序只能使用操作系统提供的统一的接口吧,这些接口既然不在内核中(因为不能使用内核代码),所以应该在共享库中。

9章将详细解释虚拟存储器系统如何工作。

文件就是字节序列,仅次而已。I/O设备可以视为文件。

系统中所有输入和输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的。

这里有个概念,I/O就是输入和输出,I/O设备就是可以输入和输出的设备。而文件可以读和写,读和写又可以看作是输出和输入。所以,I/O设备与文件具有核心的共性。所以可以抽象。10章介绍Unix I/O。

1.8 系统之间利用网络通信

网络可以视为一个I/O设备,适配器就是网络适配器(网卡,有线的或者无线的),而网络就是一个I/O设备。11章讲学到如何构造网络应用程序,并利用这些知识创建一个简单的web服务器。

1.9 重要主题

系统是硬件和软件相互交织的集合体。系统又是硬件和应用程序之间的一层软件。系统可以有很多名字。

在此再次强调几个贯穿计算机系统所有方面的重要概念:

并发(concurrency)指同时具有多个活动的系统。并行指用并发使系统更快。并行可以在计算机系统的多个抽象层次上运用。从高到低的三个层次:

线程级并发:单处理器系统--只有一个处理器的系统,这种系统也是可并发的,因为比如奔4的单核系统就可以变听歌边上网。但这种并发是模拟出来的,是的,这就是模拟出来了,是单处理器在不同进程之间不断切换来实现的,这种就叫模拟出来的并发。

多处理器系统分两种:多处理器和超线程。

  • 多处理器是一个集成电路芯片上有多个核(cpu),一个核完整的应该是计算单元,寄存器文件,L1高速缓存(L2高速缓存);这称为一个核,一个cpu。
  • 超线程是指一个核执行多个控制流的技术,事实上,一个进程中多个控制流就指多个线程。这个时候的核可以只有一个计算单元,但是寄存器文件和L1高速缓存可能就有多组,由于内存中共用虚拟地址空间(一个进程吗)所以几组寄存器和L1高速缓存就可以有几组线程。常规的处理器需要大约20000个时钟周期来做不同线程间的切换,而这种超线程技术的处理器之用一个周期。

这种多处理器系统才可以说是真的做到了并发吧。

指令级并行;这个微机原理中其实讲的比较清楚,就是取指令和处理指令其实是分开的,多条指令的不同步骤可以同时的进行,这个就是指令级并行,4章研究流水线的使用,5章介绍超标量处理器的高级模型。

单指令/多数据并行:一条指令可以产生多个可以并行执行的操作。上面的是多个指令并行的执行,这个是一个指令的不同部分并行的执行。SIMD并行。

最高级别是线程级并发,其实多核就是进程级的并发了,超线程是线程级的并发。再往上,就没有了。进程已经到顶了。

抽象是计算机科学中最为重要的概念之一。

指令集结构是对实际硬件的抽象,表示的是执行模型。两个处理器的执行模型一样不代表实际硬件的实现方式一样,虽然由于执行模型相同,也就是指令集相同,所有可以执行相同的机器语言代码,但是却有不同的开销和性能。

1.10 小结

(OVER)

转载于:https://www.cnblogs.com/rayhill/archive/2012/04/15/2450641.html

csapp第一章 计算机系统漫游 学习和理解相关推荐

  1. 【深入理解计算机系统-学习笔记】第一章 计算机系统漫游

    第一章 计算机系统漫游 简介: 我们通过跟踪hello程序的生命周期来开始对系统的学习--从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止 我们将沿着这个程序的生命周期,简单得介绍一些逐 ...

  2. 深入理解计算机系统(原书第三版)系列 第一章 计算机系统漫游

    大学学习 计算机操作系统,当时太年轻,没有重视起来,今天 重拾书本,来看看这本传说中的 豆瓣9.9的神书 ,夯实基础,基础是石,敲出希望之火. 第一章 计算机系统漫游

  3. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习-–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  4. 深入理解计算机系统第四版_《深入理解计算机系统》读书笔记 —— 第一章 计算机系统漫游...

    本书第一章沿着一个程序的生命周期,简要地介绍一些逐步出现的关键概念.专业术语和组成部分. 一.信息就是位+上下文 在计算机系统中所有的信息都由一串比特来表示. 一串相同的比特(或者几个相同的字节)可以 ...

  5. 《深入理解计算机系统》第一章-计算机系统漫游

    本系列文章是本人读<深入理解计算机系统>时的摘抄和读书笔记,内容比较精简,可能会有错误,如想展开深入理解请阅读源书 序言 <深入理解计算机系统>适用于想深入理解计算机底层系统以 ...

  6. 读深入理解计算机系统 - 第一章 计算机系统漫游 - 1.1 信息 = 位 + 上下文

    1.1 信息 = 位 + 上下文 先说一下位,计算机的最小单位,一个位可以取两个值1/0(高电平/低电平)代表两种状态(1个位=1bit). 但是世界事物千千万,无法用一个位来表示,怎么办呢? 某不知 ...

  7. 第一章 计算机系统漫游

    这一章应该是全书的导读部分,阐述了这本书将要讲解的知识. 对于从未学过任何计算机基础的小白来说,读这本书还是非常吃力的. 一开始翻开书,大量的新概念,密集的知识,这不是让人头疼的主要原因. 重点是一开 ...

  8. 第1章 计算机系统漫游(深入理解计算机系统)

    1 #include <stdio.h> 2 3 int main() 4 { 5 printf("hello, world\n"); 6 } 1.1 信息就是位+上下 ...

  9. 第一章计算机系统概述答案,1第一章计算机系统概论.ppt

    1第一章计算机系统概论,计算机系统概论,计算机系统概论pdf,计算机系统概论答案,计算机系统概论英文,计算机系统概论下载,计算机系统概论中文,民航概论ppt第一章,饭店概论第一章课件,秘书学概论第一章 ...

最新文章

  1. 中使用js修改变量值_谈一谈css-in-js在React项目中的使用
  2. anaconda如何更改环境配置_Anaconda环境配置2020-08-27
  3. 《金色梦乡》金句摘抄(三)
  4. Java 8中的Base64 –加入乐趣为时不晚
  5. java 纯面向对象_Java到底是不是一种纯面向对象语言?
  6. SQL SERVER 2005 T_SQL新的特性以及解决并发
  7. SpringBoot整合(Elasticserch)
  8. dnn神经网络_【李宏毅机器学习笔记】深度神经网络(DNN)
  9. win10 Abaqus2018 血泪备注
  10. oracle 结果集已耗尽_SQLException:耗尽结果集
  11. Chrome插件实现GitHub代码离线翻译v0.0.4 2018-10-19
  12. SEO和竞价有什么区别?
  13. UIWebView原生跳转界面PUSH POP
  14. DVWA文件包含漏洞
  15. 自动化测试系列(六)--自动化成熟度等级
  16. 副词修饰形容词和副词
  17. 默认构造函数,=default,=delete
  18. Vue2+Vue3教程
  19. 三年级学生写数学用计算机算,三年级小学生数学练习题三篇
  20. JavaScript中什么是数组和数组中的各种方法的使用

热门文章

  1. PAT乙级1034题解
  2. Ubuntu 开机画面
  3. java学习笔记-基础篇
  4. APK瘦身记,如何实现高达53%的压缩效果
  5. SSL/TLS Suffers ‘Bar Mitzvah Attack’漏洞检测方法及修复建议
  6. Qt QNetworkAccessManager请求返回reply内存泄漏
  7. 专升本英语——应试题型突破——完形填空——完形填空概述【学习笔记】
  8. 计划FM为人人网提供首个开源Ruby SDK
  9. 11、OpenGL - 混合(颜色混合)
  10. uniapp手机验证码功能实现