什么是进程?
进程定义:
从定义上来说的话,进程就是一个正在执行的程序、计算机中正在运行的程序的一个实体
其实进程可以看作是由三部分组成的分别是:
- 一段可以执行的程序(运行中的程序)
- 程序所需要的相关数据(变量、工作空间、缓冲区等)
- 程序的执行上下文
这最后一部分是根本。执行上下文也被叫做进程状态,是操作系统用来管理和控制进程所需的内部数据。这中内部信息和进程是分开的,因为操作系统不允许被进程直接访问。上下文中包括操作系统管理进程及处理器正确执行进程所需要的所有信息。
操作系统为每个进程分配了一块存储器区域,并且在由操作系统建立和维护的进程表中进行记录。进程表中包含记录每个进程的表项,表项内容包括指向包含进程的存储地址的指针和进程的执行上下文。程序计数器寄存器通过指向该进程中下一条待执行的指令。
系统通过PCB对进程进行管理和调度,而进程中的PCB用一个名为task_struct的结构体来表示,每创建一个进程便在内存中申请一个空的task_struct结构,填入所需信息,同时将结构体加入到刚刚说的那个进程表task[]中去。(通过ps或pstree可以查看当前系统中的进程)
因此,可以说进程就是由程序代码和相关数据还有进程控制块组成的。对于单处理器计算机,在任何时间,最多都只能有一个进程执行,正在运行的进程的状态为运行态。
Linux进程状态
- R(TASK_RUNNING),可执行状态。
只有该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的tash_struct结构被放入对应的CPU可执行队列中。
调度器就是从各个CPU的可执行队列中分别选择一个进程在CPU上运行。
S(TASK_INTERRUPTIBLE),可中断的睡眠状态
处于这个状态的进程因为等待某件事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct被放入对应事件的等待队列中。当这些时间发生时(由外部中断触发、或其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。
D(TASK_UNINTERRUPTIBLE),不可中断的睡眠状态
与S状态相似,进程处于睡眠状态,但是此刻进程是可不中断的。指的是进程不响应异步信号。- T(TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态
给进程发送一个SIGSTOP信号,它就会因响应该信号而进入此状态,发送SIGCONT信号,可以让其恢复TASK_RUNNING状态
当进程被跟踪时,跟踪状态也就进程暂停下来,等待跟踪它的进程对他进行下一步操作。比如gdb的打的断点 Z(TASK_DEAD-EXIT_ZOMBIE),退出状态–进程成为僵尸进程
进程在退出的过程中,处于TASK_DEAD状态。
在这个推出过程中,进程占有的所以资源将被回收,除了task_struct结构以外。于是进程就只剩下task_struct这么个空壳,所以成为僵尸。
例如父进程没有电泳wait/waitpid,如果子进程先于父进程退出,则该子进程将成为僵尸进程。X(TASK_DEAD-EXIT_DEAD),退出状态,进程即将被销毁。