深入理解计算机原理
信息就是位+上下文
系统中的所有信息(包括磁盘文件、存储器中的程序、存储器中存放的数据、网络传送数据)都是由一串比特表示
区分不同数据对象的唯一方法是读到这些数据对象时的上下文
程序被其他程序翻译成不同的格式
hello.c –> 预处理器(cpp) —hello.i—–> 编译器 —hello.s—-> 汇编器 —hello.o—-> 链接器 –> hello可执行
- 预处理阶段:预处理器根据以#开头的命令,修改原始的C程序(以.i为扩展名)
- 编译阶段:将文本文件hello.i 翻译成文本文件hello.s(包含一个汇编语言程序)
- 汇编阶段:汇编器把 hello.s 翻译成机器语言指令,把这些指令打包成一种叫 可重定位目标程序的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令
- 链接阶段:每个C编译器都提供printf函数存在于printf.o的单独预编译目标文件中,链接器负责这个文件接入hello.o程序中。可执行文件加载到存储器后,系统负责执行
编译系统如何工作
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
处理器读并解释储存在存储器中的指令
- 系统硬件组成
- 总线:贯穿整个系统的一组电子管道,携带字节信息在各个组件间传递
- I/O设备:系统与外界的联系通道。(用户输入的键盘、鼠标、输出的显示器、数据存储的磁盘)。最开始可执行程序hello放在磁盘上
- 控制器:主办上的芯片组
- 适配器:插在主板插槽的卡
- 主存:临时存储设备。程序执行时,用来存放程序和程序处理的数据
- 处理器(CPU):执行存储在主存中指令的引擎.核心:程序计数器(PC)的字长大小的存储设备
shell输入命令,指令将hello文件中的代码和数据从磁盘拷贝到主存,加载文件后输出
高速缓存
- 高速缓存:用来作为暂时的集结区域
形成层次结构
- 存储器分层结构是一个层次上的存储器作为下一层次上的存储器的高速缓存,本地磁盘是其他系统中磁盘上被存储数据的高速缓存
操作系统管理硬件
- 所有应用程序对硬件的操作尝试都必须通过操作系统
- 操作系统有两个功能:防止硬件被失控的应用程序滥用;在控制复杂而又通常广泛不同的低级硬件设备,为应用程序提供简单一致的方法
进程
- 进程是操作系统对运行程序的一种抽象。一个系统可以同时运行多个进程,每个进程都好像独自占地使用硬件,成为并发运行
- 一个进程的指令和另一个进程的指令是交错执行的,执行机制成为上下文切换
- 操作系统保存进程运行所需的所有状态信息,这种状态就是上下文
线程
- 一个线程可以由多个线程执行单元组成,每个线程运行在进程的上下文中,共享代码和全局数据
- 多线程之间比多进程之间更容易共享数据,线程一般逗逼进程更高效
虚拟存储器
抽象概念,为每个进程提供一个假象,好像每个进程都在独占地使用主存
每个进程看到的存储器都是一致的,称为虚拟地址空间
程序代码和数据:代码是从同一固定地址开始,代码和数据区是由可执行目标文件直接初始化的
堆:代码和数据区在进程一旦开始运行就被指定了大小,堆可以在运行时动态地扩展和收缩
共享库:共享代码和数据的区域
栈:虚拟地址空间顶部,编译器用它来实现函数调用,和堆一样,在程序执行期间可以动态扩展和收缩
内核虚拟存储器:地址空间顶部的四分之一部分,应用程序不允许读写这个区域的内容或直接调用内核代码定义的函数