<深入理解计算机系统(第三版)》第一章
第一章 计算机系统漫游
计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序.
1.1 信息就是位+上下文
源程序实际上就是由一个值0和1组成的位(bit)序列,8个位被组织成一组,称为字节.每个字节表示程序中某个文本字符.
大部分现代系统都是有ASCII标准表示文本字符,只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件.
系统中所有的信息—–包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的.区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文.比如:在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令.
1.2 程序被其他程序翻译成不同的格式
此例子为书中所写的hello.c的例子,从其生命周期分析系统的执行过程
在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:
unix>gcc -o hello hello.c
执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统.
1,预处理阶段.预处理器(cpp)根据以字符#开头,修改原始的C程序.
2,编译阶段.编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序.
3,链接阶段.目标文件合并到我们的hello.o程序中,链接器就处理这种合并.得到hello文件,一个可执行目标文件,可以被加载到内存中,由系统执行.
1.3 了解编译系统如何工作是大有益处的
有一些重要的原因是促使程序员必须知道编译系统是如何工作的,其原因如下:
①优化程序性能:现代编译器都是成熟的工具,通常可以生成很好的代码.但是,为了在C程序中做出好的编码选择.我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式.例如:while循环比for循环更有效吗?
②理解链接时出现的错误.一些最令人困扰的程序错误往往都与链接器操作有关.例如:为什么有些链接错误直到运行时才会出现?
③避免安全漏洞.缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因.学习安全的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果.
1.4 处理器读并解释存储在存储器中的指令
在图中:CPU:中央处理单元 ALU:算术/逻辑单元 PC:程序计数器 USB:通用串行总线
程序运行全过程:
1.外壳程序将字符逐一读入寄存器,再把它存放到存储器中.
2.外壳执行一系列指令来加载可执行的文件,将目标文件中的代码和数据从磁盘复制到主存.
3.目标文件中的代码和数据被加载到主存,处理器开始执行程序的main程序中的机器语言指令.这些指令将字符串的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上.
1.5 高速缓存至关重要
高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。
1.6 存储设备形成层次结构
1.7 操作系统管理硬件
进程:它是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
线程:它有时被称为轻量进程,是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。此外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
虚拟内存:它是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。
文件:它就是字节序列,每个I/O设备,包括磁盘、键盘、显示器、网络等,都可以看成是文件。
1.8 系统之间利用网络通信
如果系统视为一个孤立的硬件和软件的集合体,那么网络可以视为一个I/O设备.
当系统从主存将一串字符串复制到网络适配器时,数据流经过网络达到另一台机器上.
系统可以读取从其他机器发送来的数据,并将数据复制到自己的主存.
总结:
通过对计算机系统的整体了解,更深的认识到系统的运行机制,更有利于个人对整个系统的了解与掌握,真正的去从设计系统的角度看待整个系统的运行方式,从而可以更加清晰的明白每个程序是如何在系统中运行的。