PID:进程的ID,进程中止后PID被系


  PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID。进程中止后PID被系统回收,可能会被继续分配给新运行的程序。
  PID一列代表了各进程的进程ID,也就是说,PID就是各进程的身份标识。
  ==========
  PID一列代表了各进程的进程ID,也就是说,PID就是各进程的身份标识。 
  只要运行一程序,系统会自动分配一个标识!! 1. 
  是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。 
  只要没有成功运行其他程序,这个pid会继续分配给当前要运行的程序!! 
  如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个pid!!

 因为这里我是讲进程的ID管理,所以下面我们着重关注PID命名空间。命名空间的出现,增加了PID管理的复杂性,但是却能极大提高管理的效率。PID命名空间是按照层次组织的,当我们在新复制一个进程时,都会设置是否新建一个命名空间的标志位。新建的命名空间中的所有PID对父命名空间都是可见的,但是子命名空间却无法看到父命名空间。为什么会这样呢,原来在建立新的命名空间的时候,新命名空间的所有PID都会在父命名空间建立一个它的映射,有了这个映射,父命名空间就可以看到子命名空间的PID啦。父子命名空间的层次结构图如下:

 由于有了这种父子命名空间的出现,所以也就有了PID命名空间的所属层级了,由上图可知处在最高位的是level 0,然后下面的命名空间level会逐级增加。同时由于这种层级的出现,也便有了全局ID和局部ID之分。

 1.  全局ID:处于层级顶层的ID,也就是level为0的命名空间中的ID,全局ID具有唯一性。

 2.  局部ID:只属于一个命名空间,其局部ID也只有在该命名空间里面有效。

全局ID保存在task_struct结构体的pid变量中(除此还有TGID也是直接保存在task_struct中)。

PID的管理

核中,不光定义有PID,还有一些其它类型的ID,通过这些类型的ID能更加好的管理我们的进程。除了PID,主要的ID还有:

TGID:在一个进程中,如果以CLONE_THREAD标志来调用clone建立的进程就是该进程的一个线程(因为这种进程没有独立的地址空间,与他的父进程共享一个地址空间,在Linux内核中没有明显区分进程与线程。所以我们所有自己独立的地址空间就叫进程,与别的进程共享地址空间就叫线程。),它们处于一个线程组,该线程组的ID叫做TGID。处于相同的线程组中的所有进程都有相同的TGID;线程组组长的TGID与其PID相同;一个进程没有使用线程,则其TGID与PID也相同。 PGID:另外,独立的进程可以组成进程组(使用setpgrp系统调用),进程组可以简化向所有组内进程发送信号的操作,例如用管道连接的进程处在同一进程组内。进程组ID叫做PGID,进程组内的所有进程都有相同的PGID,等于该组组长的PID。 SID:几个进程组可以合并成一个会话组(使用setsid系统调用),可以用于终端程序设计。会话组中所有进程都有相同的SID。

有了这多类型的进程ID,那么内核肯定需要找到一种方法用来管理所有的命名空间以及不同类型的进程ID(这也是Linux内核最管理进程最为核心的地方,也是比较难理解的地方

相关内容

    暂无相关文章