一丶进程概念
进程定义
进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。
进程特征
1.进程依赖于程序运行而存在,进程是动态的,程序是静态的。当一个程序被加载到内存当中并执行起来,整个执行的过程就叫做进程,所以进程是动态的,而程序是静态的。
2.进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位)
3.每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响。对于进程的虚拟地址空间,我会在后面详细介绍。
进程的意义
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
二丶进程与程序的区别
- 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。我们自己所编写的代码和数据在没有运行起来的时候就叫做程序,仅仅只是一个代码和数据的集合,而当我们真正运行程序的时候,程序就会加载到内存,由cpu执行我们的代码和指令,这就是进程。
- 程序可以作为一种软件资料长期存在,而进程是有一定生命期的,程序是永久的,而进程是暂时的。程序作为代码和数据的集合可以长期存在我们的计算机,而进程作为程序的执行过程,当这个过程走到结尾,进程的生命周期也结束了。
- 进程是操作系统将程序的代码和数据加载到内存当中,并且由操作系统创建进程控制块(PCB)来对该进程进行管理和控制。即进程实质是程序加载到内存的代码和数据以及对应PCB的集合。
三丶进程状态
一般而言,每一个进程至少应该处于以下三种状态之一:
1、就绪状态:这是指进程已处于准备好运行的状态,即进程已分配到除CPU以外的所有的必要资源后,只要获得CPU,便可立即执行。如果系统中有许多处于就绪状态的进程,通常将它们按一定的策略(如优先级策略)排成一个队列,称该队列为就绪队列。
2、运行状态:这是指进程已获得CPU,其程序正在执行的状态。对任何一个时刻而言,在单处理机系统中,只有一个进程处于执行状态,而在多个处理机系统中,则有多个进程处于执行状态。
3、阻塞状态:这是指正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行时的状态,亦即进程的执行受到阻塞。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。通常系统将处于阻塞状态的进程也排成一个队列,称该队列为阻塞队列。实际上,在较大的系统中,为了减少队列操作的开销,提高系统效率,根据阻塞原因不同,会设置多个阻塞队列。
这里详细解释一下进程的阻塞状态:
进程阻塞:简而言之也可以说是进程因为等待某种资源就绪,而导致进程不推进的一种状态。例如,一个c语言程序调用了scanf,此时运行该程序,该程序的代码和数据被加载到内存,并产生了该程序的pcb/task_struct供操作系统进行管理,因为scanf函数要读取用户键盘的输入,此时如果用户不输入任何数据,那么该进程就会处于阻塞状态,该进程对应的pcb/task_struct,就要被放到等待相应资源的外设中的队列中去(这里的pcb就应该被放到键盘对应的队列中去等待资源),直到需要的资源就绪,才会重新被操作系统调度,cpu才会进行计算。
有别于进程阻塞,有一种特殊状态叫进程阻塞挂起:当内存不足时,操作系统会将一些处于阻塞状态的进程加载到内存中的代码和数据保存到磁盘上,释放掉代码和数据,从而为正在进行的进程腾出空间。
在linux操作系统中,我们通过命令行指令,可以查到每个进程的属性及具体状态。
R:运行状态
进程处于正在执行的状态。
注意:一个状态显示为R状态的进程,不一定正在被CPU调度执行,所有处于CPU执行队列里面的进程的状态都是显示为R状态,表示该进程正在被CPU调度执行,或者正在等待被CPU调度执行。
S:休眠状态
可以中断休眠,本质是一种阻塞状态。
下面是一个实验代码,方便我们更好理解进程的运行和阻塞状态,左边是进程的属性及状态等信息,右边是我们所写的程序:
如果我们没有注释掉执行printf函数这行代码的话,该进程会访问外设,等待显示器的资源就绪(外设的处理速度远小于CPU的处理速度),此时进程会处于阻塞状态,也就是我们所查到的S+状态,而执行查询进程状态时,CPU所花费的时间远远小于等待外设就绪的时间,此时就会查出来进程是休眠状态,而一旦去掉printf函数,进程不再访问外设而在一直运行,那就能查出进程是R+状态,即该进程在CPU的运行队列当中。
而运行队列由操作系统维护,而操作系统也存在内存当中,即该运行队列也在内存中。
D: 磁盘睡眠状态
不可中断休眠,即使是操作系统也无法杀死这个进程。
当服务器压力过大时,OS会通过一定的手段,杀掉一些进程,来起到节省空间的作用!
如果是S状态时,可以被OS杀掉;
如果是D状态时,不能被OS杀掉,OS无法插手,只能等进程自动醒来;
T:暂停状态
kill -17 +pid 暂停进程 显示T状态
kill -18 +pid 继续进程 但进程状态会变为S 即在后台运行的程序,不能被Ctrl+c终止,必须kill -9 +pid 来杀死该进程 调试过程中打断点,本质就是让进程暂停,状态是t,表示追踪时暂停
X:死亡状态
一瞬间的状态,不好查到
Z:僵尸状态
一个进程不会立即退出,而是保持僵尸状态,方便后续父进程(os)读取该子进程退出的退出结果。