Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

程序如何变成进程

复习

  • 操作系统是什么:操作系统是资源的管理者和抽象提供者
  • 内核态与用户态:为什么普通程序不能随意执行危险操作
  • 系统调用:用户程序怎样安全地请求内核服务

TL;DR

  • 程序是磁盘上的静态文件;进程是正在运行的程序
  • 同一份程序可以被加载很多次,变成多个互不相同的进程
  • 进程 = 程序 + 运行状态 + 占用的资源
  • 内核负责把一个静态程序“变成”一个活生生的进程

正文

  你双击一个程序,它就跑起来了。可仔细想想:磁盘上的那个文件,从头到尾一个字都没变,它怎么就“跑起来”了?

  这里要区分两个概念。

静态与动态

  • 程序(program):躺在磁盘上的可执行文件,是一堆静态的指令和数据。它不会自己动。
  • 进程(process):程序被装进内存、正在执行的那一份,是动态的、活着的。

  好比菜谱和做菜:菜谱印在纸上,永远是那几行字;照着菜谱下厨,才会有切菜、翻炒、出锅这些正在发生的事。菜谱是程序,那个正在进行的“做菜过程”是进程。

  同一个程序可以同时对应多个进程。比如你打开两个文本编辑器,用的是一模一样的可执行文件,却是两个独立进程——各自的文档、光标位置、改动,互不干扰。

内核要记住什么

  一旦程序开始运行,内核就得把它“管起来”。为此,它要为这个进程记下不少东西:

  • 程序被放在内存的哪里
  • 现在执行到哪条指令(PC 是多少)
  • 各个寄存器里是什么值
  • 占用了哪些资源(内存、打开的文件、设备)
  • 现在是什么状态(正在跑,还是在等)

  这些信息加起来,才构成一个完整的“正在运行的程序”。而它们,都会记在一个专门的数据结构里——下一章会细讲。

内核怎样“制造”一个进程

  把一个静态程序变成进程,内核大致要做这几件事:

  1. 把程序的代码和数据装入内存
  2. 为它建立起一片属于自己的地址空间
  3. 准备好运行所需的栈和初始寄存器
  4. 把 PC 指向程序的入口
  5. 把它标记为“就绪”,等着被调度上 CPU

  做完这些,程序就有了“生命”,成了一个进程。接下来,它就可以和别的进程一起,轮流使用 CPU。

  那么,一个进程又是从哪里来的?是凭空冒出来的,还是由别的进程“生”出来的?下一章,我们看进程的出生与死亡。

思考题

  同一份可执行文件,被运行了三次,产生了几个进程?它们之间会不会互相影响各自的变量和文件?为什么?

小结

知识点

  • 程序是静态文件,进程是正在运行的程序
  • 同一程序可以有多个进程
  • 进程 = 程序 + 运行状态 + 占用的资源
  • 内核把静态程序装入内存、建立地址空间、准备运行环境

参考资料

  1. Wikipedia(zh):进程:进程的概念
  2. Wikipedia(zh):程序:程序与进程的区别

思考题答案(仅供参考)

  产生三个进程。它们虽然来自同一个文件,却各自拥有独立的运行状态和资源:各自的内存空间、各自的变量、各自的寄存器值。一个进程改动自己的变量或文件,不会直接改变另外两个。也正因如此,同一程序才能被安全地同时运行多份。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪