01_计算机系统漫游
计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序。系统中所有的信息--包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是读到这些数据对象时的上下文。
编译系统
一个C程序 hello.c,在Unix系统上,从源文件到目标文件的转化是由 编译器驱动程序 完成的。
gcc -o hello hello.c
- 预处理阶段。预处理器(cpp)根据以字符 # 开头的命令修改C程序,结果得到另一个C程序,通常以 .i 作为文件扩展名。
- 编译阶段。编译器(ccl)将文本文件 hello.i 翻译成文本文件 hello.s,包含一个汇编语言程序。
- 汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,把这些命令打包成一种叫 可重定位目标程序(relocatable object program) 的格式,并将结果保存在目标文件 hello.o 的二进制文件中。
- 链接阶段。hello程序调用printf函数,此函数存放在 printf.o 的目标文件中。链接器(ld)负责将文件合并到 hello.o 程序中。结果得到hello文件,是一个 可执行目标文件 ,可以被加载到内存中,由系统执行。
程序运行
- 当我们在shell程序输入 "./hello" 命令后,shell程序将字符逐一读入寄存器,再把它放到内存中。
- 当我们敲入回车键时,shell执行指令加载可执行的 hello 文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存储器。
- 此时处理器开始执行hello程序中的main方法,将"hello.world\n"字符串从主存复制到寄存器,再从寄存器复制到显示设备,最终显示在屏幕上。
操作系统
可以把操作系统看成是应用程序和硬件之间插入的一层软件,主要有两个基本功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
操作系统通过几个基本的抽象概念来实现这两个功能:
- 进程 是操作系统对一个正在运行的程序的一种抽象,每个进程都好像单独拥有硬件
- 线程 一个进程实际上可以由多个线程组成,每个线程都运行再进程的上下文中,并共享同样的代码和全局数据。
- 虚拟内存 是一个抽象概念,为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为 虚拟地址空间。
抽象
抽象是计算机科学中最为重要的概念之一。文件是对 I/O 设备的抽象,虚拟内存是对程序存储器的抽象,进程是对一个正在运行的程序的抽象,虚拟机是对整个计算机的抽象。