目录
一、进程状态
进程就是运行中的程序,而运行中的程序也是有着多种状态的。进程状态的作用就是告诉操作系统怎样去调度进程可以让程序更好的运行,可以更充分的利用系统的资源。
在了解进程状态前首先要明白:程序在运行时是需要各种资源的,比如输入输出设备等资源。如果这些资源没有准备到位,这个进程就不能继续往下执行,就需要等待资源的到来。
比如我需要打印一份资料,打印机就是一种资源,但此时打印机正在被其他程序使用,所以我就要等其他程序使用完我才可以使用。
1.简单分类
传统的操作系统概念对于进程状态的分类较为简单,分为三类。:
- 运行态
- 就绪态
- 阻塞态
运行态:
这个状态的进程正在CPU上运行。
就绪态:
进程此时已经将自己需要的资源都拿到手了,现在只需要等待时间片的到来,拿到时间片就可以直接运行。
阻塞态:
这个进程如果处于阻塞态,代表不可以被调度运行。通常是由于资源准备不充分,所以进入阻塞态。比如上文提到的打印机:我需要打印机资源,可是此时打印机被占用了,因此我的资源准备不充分,就会陷入阻塞状态。
2.详细分类
与传统的操作系统定义不同,Linux对于进程的状态划分的更细致,主要分为五种状态:
- 运行态
- 休眠态
- 可中断休眠态
- 不可中断休眠态
- 停止状态
- 死亡状态
- 僵死状态
(1)运行态
Linux的运行态包含了传统定义中的运行态和就绪态。也就是说,在Linux中这两类进程都属于运行态:
- 正在CPU上运行的进程
- 资源准备充足,等待时间片的进程
(2)休眠态
Linux的休眠状态是指,进程需要等待某个事件发生后才可以继续运行,在等待的这段时间,进程干不了其他的事,因此需要休眠。
要等待的某个事件其实就包括了我们之前提到过的资源。我需要使用打印机,但此时打印机资源被别人使用,因此我就需要先休眠,等到打印机资源空闲了,我再醒来去打印。
而休眠态分为可中断休眠态和不可中断休眠态。
[1]可中断休眠态
进程正在休眠,等待某个事件发生后,进程会醒来继续运行,但这个休眠是可以被打断的,遇到一些特别的事件会打断进程的休眠。
比如我们在睡觉时,定了早上八点的闹钟,想着等到闹钟响了才起床。但是五点钟就有人打电话,打断了我们的休眠。
[2]不可中断休眠态
进程正在休眠,等待某个事件发生后,进程才会醒来继续运行,并且这个休眠是无法被打断的。
比如一个人突然因生病而昏迷,除非是得到医生的救治,否则是醒不过来的。所以这就是不可中断休眠,不可以被打断,除非等到特定事件(医生救治)发生。
(3)停止状态
进程处于停止状态时可以被调度,但什么都不做。
(4)死亡状态
进程已经使用完毕了,所以让进程退出,并且把所进程占用的资源全部释放。(一个人去世后,把他埋葬,处理好他的后事)
(5)僵死状态
进程使用完毕了,并且进程也退出了,但进程占用的资源没有被完全释放。(一个人去世后,没有将他埋葬,没有处理他的后事)
因此处于僵死状态的进程我们称之为僵尸进程。
二、特殊进程
这里简单介绍三种特殊进程:
- 僵尸进程
- 孤儿进程
- 守护进程
1.僵尸进程
(1)什么是僵尸进程?
僵死状态的进程,进程退出了但是它的资源没有被完全释放,是待处理状态。
(2)僵尸进程产生的原因?
一个进程如果退出了,它的pcb不会直接释放,因为进程的pcb保存了这个进程的退出原因,而这个退出原因是要交给父进程的,父进程收到这个退出原因后,就会处理子进程的后事,释放子进程的资源。
因此这个进程退出前会通知父进程,告诉父进程自己要退出了,要记得给自己处理后事。但如果父进程没有收到子进程的通知,这个子进程的资源就一直处于没有完全释放的状态,就成了僵尸进程。
这里注意一点,终端运行的指令或程序,父进程都是shell(命令行解释器)进程,这个进程的子进程一旦退出,就会及时处理。
(3)僵尸进程的危害?
僵尸进程的资源一直没有被回收,就会造成资源泄露,占据的内存没有完全释放,就会占据内存空间。如果僵尸进程过多,占据的资源就会越来越多,系统可能就会崩溃。
(4)怎么处理僵尸进程?
处理正常进程时,我们可以通过杀死进程来退出进程。可是僵尸进程是杀不死的,因为它已经死了,现在我们要做的就是释放它的资源,处理它的后事。
上文提到了,进程之所以退出后不释放资源,是因为要保存退出原因给父进程。那么我们可以通过杀死僵尸进程的父进程来释放僵尸进程的资源。因为父进程都死了,僵尸进程的退出原因就没有必要再保存了,资源自然会被释放掉。
2.孤儿进程
孤儿进程与僵尸进程相反,孤儿进程是父进程先于子进程退出。(父进程退出是不会影响子进程的)这样子进程就成为了孤儿进程,但是总得有个人管它,因此孤儿进程会被1号进程收养。当孤儿进程退出后,1号进程就会处理它的后事。
3.守护进程
守护进程也被称为精灵进程,是一种特殊的孤儿进程,运行在后台(不占据终端),在后台进行任务处理的进程。
三、进程状态相关指令
1.ps-ef
作用:查看进程相关信息
参数含义:
- UID:用户ID
- PID:进程ID
- PPID:父进程ID
- STIME:进程的开始时间
- TTY:终端号
- TIME:进程执行的总时间
- CMD:运行的程序
2.ps-aux
作用:查看进程相关信息
参数含义:
- USER:运行这个程序的用户
- PID:进程ID
- %CPU:CPU使用率
- %MEM:内存使用率
- VSZ:虚拟内存使用
- RSS:物理内存使用
- TTY:终端号
- STAT:进程的状态(如休眠态、运行态、僵死态)
- START:进程的开始时间
- TIME:进程执行的总时间
- COMMAND:运行的程序
查看指定进程的信息:
3.top
作用:查看cpu的使用率
4.kill
- kill 进程ID {作用:杀死此进程}
- kill -9 进程ID {作用:强制杀死该进程}