本文阐述操作系统的核心概念之一:进程(Process),主要内容:
- 什么是进程
- 进程的创建(Creation)
- 进程的终止(Termination)
- 进程的状态(State)
一、什么是进程
1.1 基本信息
进程是执行程序的一个实例,是对正在运行的程序的抽象(Abstraction),包含当前运行程序的所有程序计数器(PC),寄存器以及变量:程序运行所需要的指令和数据。
如果说程序是一个菜谱,那么进程就是做菜的过程。
我当前系统运行的进程实例(windows 10)
如果一个程序同时运行多次,操作系统会创建多个进程(互不影响),对于操作系统来说就是有多个进程恰好在运行相同的程序而已。上图的Google Chrome就是一个例子(多个实例,互不影响,但是消耗内存资源。。)
1.2 Why Process
为什么操作系统要引入进程的概念?上面提到了隔离,但是隔离不是进程引入的首要驱动力,引入进程的首要驱动力是:增加系统的响应时间。
CPU同一个时间只能做一件事情,只能有一个进程运行在CPU上,但是为什么我们感觉电脑在同时作者很多事情呢?我们一遍在Word中打字,一遍右下角收到邮件通知。
- Word是一个进程(当然,打开多个则是多个进程)
- 邮件是一个进程
操作系采用自己的调度策略让CPU在Word和Email之间切换,由于切换的非常快,所以用户感觉CPU同时在作者很多事情,从而达到了增加系统响应的效果。
用户感觉
a、b、c进程在同时执行
实际执行
a、b、c同一时间只有一个在执行
1.3 进程调度
用一个例子说明:有一个爸爸准备给儿子做一个蛋糕,他有一份做蛋糕的菜谱,他正在按照食谱做着蛋糕,突然他儿子进来对他说:“爸爸,我要喝牛奶”。这位爸爸停下手中正在做的蛋糕,去给儿子倒牛奶,然后在微波炉加热,最后把牛奶给了儿子。最终这位爸爸又回到原来做蛋糕的地方,继续完成蛋糕。
- 蛋糕菜谱: 是程序,先做什么,后做什么
- 做蛋糕的过程:是进程A
- 给儿子热牛奶的过程:是进程B
- 这位爸爸:CPU
- 儿子突然要喝牛奶:中断
CPU根据现有的情况(策略)在进程A、B之间切换。上面爸爸倒完牛奶后继续做蛋糕。这里的继续其实就是CPU在进程之间切换之前先保存当前进程的状态,当再次切换到这个进程时,会从之前保存的状态处进行运行(由此也能看出进程切换的开销)。
二、进程的创建(Creation)
2.1 进程创建时机
- 在系统启动时创建进程(boot)。这个时候创建的都是系统运行必须的进程,有些用于和UI进行交互,有些属于后台进程,比如Email接受进程
- 由现有的进程通过调用系统的Create Call进行创建。比如在一个web系统中,可以另外创建一个excel进程完成数据导入到excel的功能
- 当用户发起一个请求时进行创建,比如当用户点击鼠标,在command中输入时会创建相应的进程对用户的请求进行响应
2.2 创建过程
以上的所说的三种创建进程的时机最终创建进程的方式是一致的:由一个已有的进程跳过一个系统调用完成进程的创建。
- Unix:Fork
- Windows:CreateProcess
该系统调用会告知操作系统去创建一个进程。
发起系统调用的进程为父进程,被创建的进程为子进程,父子进程之间是相互独立的,他们的地址空间完全不同。
2.3 进程的层级关系(Hierarchy)
上面做了阐述,新的进程是已有进程通过像OS发送创建进程的call而完成的。被创建的进程暂且叫child process。这个child process接下来可能也会再次给os发请求创建子进程。。。。。以此类推,将会有一个进程继承链。
上面这种成为一个链的进程在unix中会作为一个进程组而存在。但是在Windows中,这些进程其实是完全独立的。继承关系在进程中不是很重要。
三、进程的终止(termination)
一个进程创建后最终都会终止的,进程会在以下几种条件下被终止,相对比较好理解:
- 正常终止:当进程完成自己的事情之后告诉操作系统(System Call)终止进程
- 出现错误的时候终止。当进程发现错误时,比如资源不存在或者所运行的程序有bug。比如被0除。
- 被其他进程Kill。比如在windows下可以通过任务管理器直接Kill系统的进程
在有些操作系统中当一个进程终止时,有其创建的进程也会被Kill 掉。
四、进程的状态(State)
4.1 状态
进程被创建后有三个状态:
- Running(运行中)
- Blocked(被阻塞)
- Ready(就绪)
Blocked是指进程在等待外部的刺激(与CPU无关),比如Console程序,一直在等待用户输入。
Ready是指进程可以运行,没有等待任何资源,但是CPU被其他进程占用,没有CPU资源
4.2 状态切换
如图:
Running-》Blocked:进程在运行过程中需要其他外部资源。
Blocked-》Ready:进程需要的资源得到了满足
Ready-》Running:由CPU的Scheduler决定,CPU可以给当前进程使用
Running-》Ready:由CPU的Scheduler决定,CPU分配给其他进程使用(比如上面的例子,爸爸停下正在做的蛋糕去给儿子热牛奶,这时候蛋糕处于ready状态)