什么是进程?
进程 (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。
对于操作系统来说,进程就是一个程序运行的描述,通过这个描述,操作系统可以进行程序的调度运行管理。
进程不仅仅包含了正在运行的代码,还包括了运行代码所需要的各种资源。内核中使用进程控制块PCB(process control block)管理一个进程的数据结构,每个进程都有一个PCB。在Linux下是一个task_struct结构体,如下图。
通过程序的运行描述,操作系统就可以调度哪个程序可以占用CPU去运行指令。要运行哪个程序,则操作系统找到对应程序的PCB,在PCB取出程序的运行所需信息并加载到CPU上,CPU就开始运行这个程序了,如下图所示。
Linux中的进程状态:
-
运行态( R ):正在运行或者轮转到时间片则能够运行统称为运行态;
-
可中断休眠态(S):可以被中断的休眠状态(满足唤醒条件,或者休眠被中断则进入运行态);
-
不可中断休眠态(D):不能被中断的休眠状态(满足唤醒条件之后才会进入运行态);
-
停止态(T):程序停止运行的状态(依然会被调度,但什么都不做);
-
僵尸态(Z):进程已经退出不再调度了,但是这个进程的资源还没有完全释放,等待处理的一种状态;
僵尸进程:处于僵尸态的进程,是一种退出了,但是资源没有被完全释放的进程。
产生原因:子进程先于父进程退出,但父进程未关注到子进程的退出,因此系统不会完全释放子进程的资源,这个子进程进入僵尸状态。(子进程退出后,在进程PCB中保存了自己的退出返回值,在父进程未关注处理的情况下,PCB资源不会被释放)