我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作。大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程,这样就可以关闭卡死的程序,所以我们知道进程就是程序执行所产生的,但是我们对进程没有很清楚的认识。什么是进程?进程在程序的执行过程中到底起了什么样的作用?我们在toyix平台上来对进程进行研究学习。
一、什么是toyix?Toyix是王爽老师为了进行操作系统基础理论教学而开发的一个系统。它的特点是既能提供良好的编程体验,又不太复杂。Toyix小巧简单,安装包只有几百kb,解压即可使用;兼容Dos的大多数命令,使用的是tc的编译器。系统部分与UNIX、标准c库函数兼容,具有很好兼容性的编程接口。
二、什么是进程?进程是程序在计算机上的一次执行活动,当运行一个程序,就启动了一个进程。程序运行活动可以用一个进程模型来描述。就是说进程是我们对程序执行过程的描述,举个例子,程序就像是一台音响,进程就是播放音乐这个动作过程。程序是储存在存储空间中的二进制文件,就像音响一样,是看得见、摸得着的,而进程是一个动作、一个过程,是我们只能想象、只能感受和想象的。我们在任务管理器里停止了进程,只是停止了程序的执行,程序本身并没有被删除,这是因为程序是静态的,进程是动态的,停止进程并不会删除它所使用的数据,就像停止播放音乐并不会损坏音响一样。
我们在电脑上所能看到的所有文件都是存储在电脑中的,就比如下面这个程序:
执行过程如下:
在命令行输入do 1运行程序,发现这里需要输入一个字符才能继续执行,toyix的进程监视器显示ready的进程是1.
按回车程序继续执行,输出一行字符a,这时进程监视器里的running显示的是1.
最后输出完毕,程序执行完毕,进程监视器里的running显示的是0.
在这个程序的执行过程中,我们可以看到在屏幕上输出a时,进程监视器的running显示的是1,它表示这个程序正在执行中,因为程序里有延时函数delay,所以我们可以很清楚地看到输出a的过程,这就是进程处于执行态。我们可以看到,这个过程是动态的,而且它的状态和结果与程序的代码没有关系,不管它是ready、running,不管程序执行成功还是失败,程序的代码还是在那里,不会有任何改变,因为它是静态的。即进程的状态和结果与程序本身无关。
再输入do 1 1执行两次程序:
这时ready显示1和2两个进程号,它表示现在有两个进程等待执行。
按回车让程序继续执行,发现输出了160个a,在输出a的过程中有时running是1,ready是2,有时running是2,ready是1,这表示这两个进程在交替执行。如果没有延时函数,也就是如果程序执行的很快,我们会感觉到这两个程序是同时执行的,这就是为什么我们用计算机可以一边听歌一边用文档打字,在计算机上可以同时使用不同的程序,因为程序是通过进程来执行的,而进程的执行有并发性。
三、进程的三态模型为什么进程的执行有并发性?因为进程可以交替执行。为什么进程可以交替执行?因为进程有不同的状态,它可以在不同的状态之间转换达到暂停的效果。那么进程有哪几种状态呢?上图中的进程监视器有running、ready、blocked三个字段,它们表示进程的三种执行状态:执行态、就绪态、阻塞态,这三种状态之间的转换关系可以用下图表示: