本文是《操作系统:以程序员的角度》第四章,从本章开始将开启第一个重要的主题:进程,彻底理解进程对程序员来说是极为重要、极其关键的,本章就从程序员的角度来讲解到底什么是进程、操作系统是如何实现进程的,以下为本篇目录:
为什么需要进程:多任务处理的关键技术
什么是进程:以烧菜的角度
从程序到进程:程序是如何运行起来的
进程的魔法:CPU虚拟化
多进程同时运行是如何实现的
深入理解进程:从内存和CPU的角度
进程在内存中是什么样子的
进程是如何被CPU执行的
总结
对于程序员来说,进程的重要性怎么讲都不为过,话不多说,让我们从各个方面了解一下进程。
为什么需要进程:多任务处理的关键技术
早期的计算机当中每次只能运行一个程序,当这个程序运行完成后才能继续运行下一个程序,就好比排队买票一样,只有当前一个人买完之后,后一个人才可以继续买票。作为程序员如果让你在早期的计算机上写程序的话,你是没有办法一边写代码一边听音乐的,要么你就写完代码再听音乐,要么就听完音乐再写代码,总之你不能在计算机上同时完成两件事。这对于现代程序员来说几乎是难以想象的,在现代的计算机上同时执行多个程序已经司空见惯了,即使在只有一个CPU的计算机上我们也可以一边写代码一边打开浏览器查资料一边接收邮件可能还有还一边玩着游戏的。现代计算机的这项功能被称为多任务处理(Multitasking),实现多任务的关键技术就是进程。
在现代操作系统中,进程这项技术给我们提供了一种假象,就好像计算机中没有其它程序而只有我们的程序在运行一样,我们的程序看起来独占CPU和内存,而且看起来就好像是连贯的从头开始一直运行到程序结束一样。在这种假象下,程序员无需关心CPU和内存,反正我们的程序独自使用CPU和内存。正是操作系统利用进程这种技术提供的假象才使得在即使只有一个CPU的情况下也能同时运行多个程序。
在这一章中,我们将讲解如何让程序看起来独占CPU,在本书操作系统如何管理内存一章中,我们将讲解如何让程序看起来独占内存。
什么是进程:以烧菜的角度
进程在概念上其实非常简单:
程序运行起来的样子就是进程
这里的程序指的是二进制可执行程序,C/C++语言编写的程序经过编译之后生成二进制可执行程序,Java、Python等语言是由解释器来执行的,解释器通常由C/C++语言编写,因此这些解释器也是二进制可执行程序。二进制可执行程序运行起来后就是进程。待在磁盘里的可执行程序是静态的概念,放在磁盘里的可执行程序除了占用磁盘空间之外没有任何用处。但是当可执行程序运行起来后就不一样了,可执行程序被加载到内存并被CPU开始执行后就叫进程,只有当程序运行起来变为进程后才能真正发挥作用。
对于操作系统初学者而言,可能程序和进程这两个概念比较容易混淆,在这里我们使用一个形象的类比来解释一下程序和进程的区别。
假设你是一个厨艺不错的程序员,平时的爱好就是做饭,周末在家休息的你开始尝试做一道新菜比如西红柿鸡蛋,你已经买好了西红柿以及鸡蛋,而且还有一本菜谱,里面详细的记录了如何做这道菜。有了这些准备工作,你就能一展身手开始做菜啦。在这个例子中,你就好比CPU,菜谱就好比程序,西红柿以及鸡蛋就好比程序的输入,根据菜谱做菜的这个过程就好比进程。如果你做过菜的话对此肯定深有体会。
关于这一部分的知识,请参见之前的文章《程序?进程?傻傻分不清》。
既然程序运行起来后的样子就是进程,那么程序运行起来后是什么样子的呢?关于这个问题,在本篇稍后的“深入理解进程:从内存和CPU的角度”这一小节中你就知道答案啦。