术语:
C标准库进程术语 | 对应的linux内核的进程术语 |
包含多个线程的进程 | 线程组 |
只有一个线程的进程 | 进程或者任务 |
线程 | 共享用户虚拟地址空间的进程 |
结构体描述符task_struct
结构体路径D:\linux4.12\linux-4.12.1\include\linux\sched.h,里面定义的数据比较多,这里就不一一介绍了,
struct nsproxy *nsproxy;
这个是指向命名空间的指针,
结构体定义文件D:\linux4.12\linux-4.12.1\include\linux\nsproxy.h
struct nsproxy {
atomic_t count;
struct uts_namespace *uts_ns;
struct ipc_namespace *ipc_ns;
struct mnt_namespace *mnt_ns;
struct pid_namespace *pid_ns_for_children;
struct net *net_ns;
struct cgroup_namespace *cgroup_ns;
};
为什么要有命名空间呢?
不同的进程不能使用相同的内存资源,那他是怎么隔离的呢?没错,就是通过命名空间,大家可以把命名空间想象成内存分段,每一个段相互不干扰,当然也可以使用相同的段,这就是使用相同的资源。
标识符(struct pid)
进程表示符:进程所属的进程号命名空间到根的每层命名空间,都会给进程分配一个标识符
线程组标识符:线程组中主进程称为组长,组长的pid为整个组的标识符,组内每个进程的tgid等于组长的pid,组内所有进程的group_leader都指向组长的描述符
进程组标识符:多个进程也可以组成进程组,进程组表示符是进程组长的标识符,可以调用setpgid创建或者加入新的进程组,进程组简化了向组内其他进程发送信号的操作。
会话标识符:多个进程组可以组成一个会话,调用setsid创建新的会话,会话标识符是创建该会话的进程标识符,创建会话的进程是会话的首进程,linux登录时创建一个会话,登录shell是会话首进程,使用的终端叫控制终端,shell成为控制进程,shell退出时,所有属于这个会话的进程都会终止
pid是全局进程号
struct pid_link pids[PIDTYPE_MAX];
pids[PIDTYPE_PID].pid指向结构体pid
pids[PIDTYPE_PGID].pid指向进程组组长pid
pids[PIDTYPE_SID].pid指向会话首进程pid
这个是进程标识符结构体
struct pid
{
atomic_t count;
unsigned int level;
/* lists of tasks that use this pid */
struct hlist_head tasks[PIDTYPE_MAX];
struct rcu_head rcu;
struct upid numbers[1];
};
count是引用计数
level命名空间层次
numbers的长度是命名空间+1,
numbers[i].nr存放进程号,
number[i].ns指向进程号命名空间结构体,
numbers[i].pid_chain用来把进程号加入进程号散列表pid_hash。