重学操作系统(二) 进程

172 阅读3分钟
update: 突然想起来这学期要学计算机系统基础的, 我这么早学了这学期干嘛捏?QwQ 吼滴, 那就先开始下一个专题, 这个开学再认真更 (好吧, 其实是我深入理解计算机系统这本书没带回来(╯▽╰)
关于这一节: 进程这一个概念其实设计了很多软件设计领域的高级思想, 比方说抽象, 虚拟化以及隔离等等

1. 进程

实际上, 操作系统是以进程为单位去分配空间和执行的, 在操作系统中执行的程序, 都以进程的方式运行在更低的权限之中. 您可能会混淆进程与程序的概念, 那么它们有什么区别呢?

  • 程序是一组指令的集合, 比如说你的源代码编译后生成了一个二进制的可执行文件, 那么它就叫做程序, 它是"没有生命的", 它静态存储于你的磁盘之中
  • 当你的程序通过加载器加载进内存中被操作系统执行时, 操作系统会为它分配它执行时需要的一些资源, 比如堆和栈等, 并在逻辑上产生一个独立的实例, 后面会讲到, 这个是通过虚拟内存的概念实现的, 这就叫做一个进程.

打个比方, 程序如果是武林秘籍的话, 那么进程就是按照武林秘籍习武之人.

通常一个进程运行一个程序, 但是对于进程来说, 加载并运行新的进程也是可以的

2. 隔离

当你设计了一个有多个组件的系统时, 最好将这几个组件彼此隔离, 这样某个组件改变之后对另外一个组件就不会产生影响, 这个也叫做松耦合.

操作系统最重要的目标之一就是将每个进程与其他的进程隔离起来, 提供这种隔离的软件对象叫做进程.

就想象一下如果许多人在一起练功会相互影响, 比如撞到一起了, 进程也一样, 如果不隔离的话, 可能一个进程会访问另一个进程的内存空间, 产生错误.

进程正是包含以下数据的对象:

  • 程序文本, 通常是机器指令的序列
  • 程序相关的数据: 包括编译时分配的静态数据(如全局变量), 和运行时分配的动态数据
  • 任何等待中的IO状态: 例如, 进程正在等待从磁盘中读取的数据
  • 程序的硬件状态: 如寄存器中的数据

大多数操作系统提供了隔离进程的基本功能:

  • 多任务:大多数操作系统有能力在几乎任何时候中断一个进程,保存它的硬件状态,并且在以后恢复它。通常,程序员不需要考虑这些中断。程序的行为就像在一个专用的处理器上持续运行,除了两条指令之间的时间是不可预测的。
  • 虚拟内存:大多数操作系统会创建幻象,每个进程看似拥有独立内存片并且孤立于其他进程。同样,程序员通常也不需要考虑虚拟内存如何工作,他们可以当做每个程序都拥有专用的内存片来处理。
  • 设备抽象:运行于同一台计算机的进程共享磁盘、网络接口、显卡和其它硬件。如果进程直接和这些硬件交互而不加协调,就一定会产生混乱。例如,一个进程预期的网络数据可能会被另一个进程读取。或者多个进程可能尝试在磁盘的相同位置储存数据。操作系统负责通过提供合适的抽象来维持秩序。
今天有点水QwQ