update: 突然想起来这学期要学计算机系统基础的, 我这么早学了这学期干嘛捏?QwQ 吼滴, 那就先开始下一个专题, 这个开学再认真更 (好吧, 其实是我深入理解计算机系统这本书没带回来(╯▽╰)
关于这一节: 进程这一个概念其实设计了很多软件设计领域的高级思想, 比方说抽象, 虚拟化以及隔离等等
1. 进程
实际上, 操作系统是以进程为单位去分配空间和执行的, 在操作系统中执行的程序, 都以进程的方式运行在更低的权限之中. 您可能会混淆进程与程序的概念, 那么它们有什么区别呢?
- 程序是一组指令的集合, 比如说你的源代码编译后生成了一个二进制的可执行文件, 那么它就叫做程序, 它是"没有生命的", 它静态存储于你的磁盘之中
- 当你的程序通过加载器加载进内存中被操作系统执行时, 操作系统会为它分配它执行时需要的一些资源, 比如堆和栈等, 并在逻辑上产生一个独立的实例, 后面会讲到, 这个是通过虚拟内存的概念实现的, 这就叫做一个进程.
打个比方, 程序如果是武林秘籍的话, 那么进程就是按照武林秘籍习武之人.
通常一个进程运行一个程序, 但是对于进程来说, 加载并运行新的进程也是可以的
2. 隔离
当你设计了一个有多个组件的系统时, 最好将这几个组件彼此隔离, 这样某个组件改变之后对另外一个组件就不会产生影响, 这个也叫做松耦合.
操作系统最重要的目标之一就是将每个进程与其他的进程隔离起来, 提供这种隔离的软件对象叫做进程.
就想象一下如果许多人在一起练功会相互影响, 比如撞到一起了, 进程也一样, 如果不隔离的话, 可能一个进程会访问另一个进程的内存空间, 产生错误.
进程正是包含以下数据的对象:
- 程序文本, 通常是机器指令的序列
- 程序相关的数据: 包括编译时分配的静态数据(如全局变量), 和运行时分配的动态数据
- 任何等待中的IO状态: 例如, 进程正在等待从磁盘中读取的数据
- 程序的硬件状态: 如寄存器中的数据
大多数操作系统提供了隔离进程的基本功能:
- 多任务:大多数操作系统有能力在几乎任何时候中断一个进程,保存它的硬件状态,并且在以后恢复它。通常,程序员不需要考虑这些中断。程序的行为就像在一个专用的处理器上持续运行,除了两条指令之间的时间是不可预测的。
- 虚拟内存:大多数操作系统会创建幻象,每个进程看似拥有独立内存片并且孤立于其他进程。同样,程序员通常也不需要考虑虚拟内存如何工作,他们可以当做每个程序都拥有专用的内存片来处理。
- 设备抽象:运行于同一台计算机的进程共享磁盘、网络接口、显卡和其它硬件。如果进程直接和这些硬件交互而不加协调,就一定会产生混乱。例如,一个进程预期的网络数据可能会被另一个进程读取。或者多个进程可能尝试在磁盘的相同位置储存数据。操作系统负责通过提供合适的抽象来维持秩序。