第一章 计算机系统漫游
1.1 信息就是上下文
对于电脑来说,信息都是二进制。在不同的上下文中,同样的字节序列可能表示整数、浮点数、字符串或者机器指令。
一切都是比特,到了二进制级别,一切都没有区别了。计算机也必须又上层告诉它一串代码到底是什么东西。这就是所谓上下文。
1.2 程序被其他程序翻译成不同的格式
编译流程
源程序 -》预处理器 -》被修改的源程序 -》编译器 -》汇编程序-》汇编器 -》.o文件,可重定位的目标程序 -》 连接器 -》可执行程序。
- 预处理阶段 预处理器(cpp)处理include,宏等,得到.i中间文本文件
- 编译阶段 编译器(ccl)将.i文件翻译成汇编程序,得到.s文本文件
- 汇编阶段 汇编器(as)将.s文件翻译成机器语言指令,得到.o二进制文件
- 链接阶段 链接器(ld)链接其他需要的.o文件,得到可执行目标二进制文件
使用gcc编译单个文件,可以设置不同的参数,得到中间文件。 gcc参数
gcc -E hello.c > ttt.txt 只激活预处理,需要手动重定向
gcc -E hello.c | more
gcc -S hello.c 生成.s文件
gcc -c hello.c 生成.o
gcc -o hello.exe hello.c -o指定输出文件
gcc -o hello.asm -S hello.c
1.3 了解编译系统如何工作是大有益处的
-
优化程序性能
如果知道一些编译知识,就可以有针对性的对代码做一些调整,以便编译器做出更好的优化。
-
理解链接时出现的错误
-
避免安全漏洞 例如缓冲区溢出
1.4 系统的硬件构成
-
总线 总线宽度决定字长
总线宽度可以理解为有多少根细小的电线,一个电线可以表达一个位,所以总线宽度就是系统一次能传送的最大数据量。所以数据最好都是总线宽度的倍数。
-
I/O设备 包括鼠标、键盘、显示器、磁盘
-
主存 即内存。
-
处理器 即CPU。处理器的核心是一个被称为*程序计数器(PC)*的字长大小的存储设备(寄存器)。
1.5 高速缓存
一个程序运行,系统首先要从硬盘读取数据到内存中,然后CPU逐条执行指令,不断的跟主存进行交互。系统花费大量时间在数据的拷贝上,所以系统需要使这些拷贝动作尽可能的快。
根据机械原理,较大的存储设备要比较小的存储设备运行的慢。为了解决处理器与磁盘读取之间速度鸿沟,于是出现了“高速缓存存储器”。
本书的重要课题之一就是帮助程序员理解高速缓存存储器的机理,并利用这些知识极大的提高程序的性能。见第六章。
空间越大的设备,物理体积可能越大?所以物理上来看读取的物理指针要花费更多的时间来移动?
###1.6 形成层次结构的存储设备
在处理器和一个较大较慢的设备之间插入一个较小的,更快的存储设备的想法成为一个普遍的观念。实际上,每个计算机系统中的存储设备都被组织成一个存储器层次结构。
思考:这个设计想法可以在很多方面精心应用,增加多一级别的缓存,提高查询效率,再实现一套替换规则,是否已经有类似现成的功能。
例如:Node查询,使用一个小型缓存结构。增加这种结构的问题是产生了冗余数据,更新node的时候需要同时更新缓存结构。适合一个管理器内部自己实现,不暴露给外部。内部自己维护好数据。
为什么计算机存储设备没有这个问题?高速缓存中的数据会不会变成脏数据?
因为各种缓存及主存对系统来说,统一构成了一个完整的虚拟存储器,实际上一份数据并不会冗余的存储在多个地方。
1.7 操作系统管理硬件
操作系统有两个主要用途:
- 防止硬件被失控的应用滥用
- 为应用程序提供简单一致的方法来访问控制复杂及各部相同的硬件。
操作系统使用进程、虚拟存储器和文件等抽象概念来实现这两个功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIzMQhP1-1598882793582)(文件虚拟概念.jpg)]
1.7.1 进程
进程是计算机科学中最重要和最成功的概念之一。进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件。我们称之为并发运行,实际上是一个进程的指令和另个进程的指令交错执行的,操作系统的这种交错机制称为上下文切换。上下文就是进程运行所需的所有状态信息。
1.7.2 线程
每个线程都运行在进程的上下文中,并共享相同的代码和全局数据。多线程之间比多进程更容易共享数据。线程一般都比进程更高效。
1.7.3. 虚拟存储器
一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。
- 程序代码和数据。代码都是从同一固定地址开始的,即 0x08048000。紧接着是C全局变量的数据区。
- 堆。运行时堆,即new申请内存的地方。
- 共享库。标准库等。
- 栈。编译器用它来实现函数调用,在程序执行期间可以动态的扩展和收缩。
- 内核虚拟存储器。内核预留。应用程序不允许读写这个区域的内容或者调用相关函数。
对于win32程序来说,默认情况下只能处理2G的内存区间,可以通过editbin /largeadressaware exepath来让程序可以支持超过2G的内存地址。在32位机器上,开启了这个设置也没啥用,还得开启系统的3G选项。在64位机器上则可以直接使用到4G的内存空间。
1.7.4 文件
文件只不过是字节序列。每个I/O设备,包括磁盘、键盘、显示器,甚至于网络,都可以被当成是文件。文件这个简单而精致的概念异常的强大,它使得应用程序能够统一的看待系统中可能含有的各式各样的I/O设备。
1.10 小结
- 计算机系统是有硬件和系统软件组成的,他们共同协作以运行应用程序。
- 操作系统内核是应用程序和硬件之间的媒介。它提供三个基本概念:
- 文件 是对I/O设备的抽象
- 虚拟存储器是对主存和磁盘的抽象概念
- 进程是处理器、主存和I/O设备的抽象概念
通过本章的学习,我们对计算机的组成有了初步的了解。计算机的主要组成部分,存储器的层次结构,编译的几个步骤,文件系统的抽象,进程线程等等。这些基本概念对后续的学习和认知都举足轻重。