## 1.定义 ##
所有代码都是在进程中执行的,我们通常把一个程序的执行称为一个进程。反过来说,进程用来描述程序的执行过程。因此,程序和进程成为了一对相依相靠的概念,他们分别描述了一个程序的静态形式和动态特征。除此之外,进程还是操作系统进行资源分配的一个基本单位。
## 2.衍生 ##
父进程 子进程
## 3.进程标识 pid##
进程的优先级和状态,虚拟地址以及各种访问权限等等这些详细数据都保存在进程描述符中。其中,进程描述符中保存的pid是进程在操作系统中的唯一标识。pid为非负整数且顺序的编号,pid可以被重复利用,当进程id已达到最大值,内核会从头查找闲置的进程id并使用最先找到的哪一个作为新进程的id。另外描述符中还会包含当前进程的父进程的id(常被称为PPID)
go里面使用标准库中的os提供的api来查看当前进程的pid和ppid:
pid :=os.Getpid()
ppid :=os.Getppid()
pid对内核以外的程序非常有用。内核可以把pid高效的转换为对应进程的描述符。我们可以使用shell命令(kill)来终结某个pid对应的进程。 也可以用类似的方法想某个进程发送信号。
## 4.进程状态 ##
每个进程在不同的时刻会有不同的状态,这些可能的状态共有6个:可运行状态, 可中断的睡眠状态,不可中断的睡眠状态,暂停状态或跟踪状态,僵尸状态,退出状态。
## 可运行状态: ##
TASK_RUNNING,简称为R
进程处在该状态下,那么说明他将要、立刻或者正在cpu上运行。运行的时机是不确定的,这会由调度器进行调度
## 可中断的睡眠状态: ##
TASK_INTERRUPTIBLE,简称为S
当进程等待某个事件的发生时会处于该状态下。这样的进程会被放入对应世间的等待队列中。当事件发生时,等待队列中一个或多个进程会被唤醒。
## 不可中断的睡眠状态: ##
TASK_UNINTTERRUPTIBLE,简称为D
这种状态下的进程不会对任何信号做出响应。更确切的说,发送给该进程的信号直到该进程从此状态下转出才会被传递过去。进程处于该状态下通常是在等待某个特殊事件。比如等待同步的I/O操作(磁盘I/O等)的完成。在这里可以把I/O理解为对输入输出信息的处理
## 暂停状态或跟踪状态: ##
TASK_STOPPED或TASK_TRACED,简称T
向进程发送暂停信号时进程就会转入该状态,除非该进程处于不可中断的睡眠状态下。向正处于暂停的进程发送SIGCONT信号会使该进程转向可运行状态。
处于被跟踪状态的进程会暂停并等待跟踪它的进程对他进行操作。跟踪状态与暂停状态非常类似。但是,向处于暂停的进程发送SIGCONT信号并不会使他被恢复。只有当调试进程进行了相应的系统调用或者退出后,它才能恢复。
## 僵尸状态: ##
TASK_DEAD_EXIT_ZOMBIE 简称为Z
处于此状态下的进程将要结束。该进程占用的大多数资源也都被收回。不过还有一些信息未被删除,比如退出码以及一些统计信息。保留这些信息是考虑到该进程的父进程可能需要他们。由于现在进程主体已被删除而只留下了一个空壳,故此状态被称为僵尸状态。
## 退出状态: ##
TASK_DEAD-EXIT_DEAD,简称为X
在进程退出的过程中,有可能连退出码和统计信息都不需要被保留。造成这种情况的原因可能是显式的让该进程的父进程忽略掉SIGCHLD信号,也可能是该进程已经被分离。分离的含义是指父进程和子进程分别独立运行。分离后的子程序将不会再使用和执行与父进程共享的代码片段中的指令,而是加载一个全新的程序。在这些情况下,该进程在退出时就不会转入僵尸状态,而是直接转入退出状态。处于退出状态的进程会立即被干净利落结束掉。他所占用的资源会被系统自动回收。
## 进程间转化: ##
简单的来说,进程的状态只分为可运行状态和非可运行状态两个,由于暂停状态和跟踪状态不同,所以也可以分为7个状态
![1525933037.jpg](https://static.studygolang.com/180510/e854ca4c148ba5e4b2098b57469930f5.jpg)
有疑问加站长微信联系(非本文作者))