文档详情

Linux内核task_struct结构域分析.ppt

发布:2017-07-04约5.32千字共19页下载文档
文本预览下载声明
linux 内核源码分析 进程管理(一) 郭海林 2012.9.29 重要数据结构——双向链表(1) 结构体定义: struct list_head { struct list_head *next, *prev; }; 重要数据结构——双向链表(2) 为什么要使用这种结构? 容器机制——将对象嵌入到另一个对象中 怎样通过链表元素找到容器对象的实例? 重要数据结构——双向链表(3) .../include/linux/list.h 重要数据结构——散列表(1) 结构体定义 表头: struct hlist_head { struct hlist_node *first; }; 节点: struct hlist_node { struct hlist_node *next, **pprev; }; 重要数据结构——散列表(2) 进程结构体剖析(1) struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, 0 stopped */ //... long exit_state; //... } 进程结构体剖析(2) struct task_struct { //... struct list_head tasks; //将系统中所有进程通过双向链表链接起来! //... } 进程结构体剖析(3) struct task_struct { //... pid_t pid; //进程标识符(线程) pid_t tgid; //线程组的领头线程ID struct task_struct *group_leader; // threadgroup leader //... } 系统调用 getpid() 返回什么? 进程结构体剖析(4.1) struct task_struct { //... struct task_struct __rcu *real_parent; /* real parent process */ struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */ struct list_head children; /* list of my children */ struct list_head sibling; /* linkage in my parents children list */ //... } 进程结构体剖析(4.2) 假设现在有进程A,生成三个子进程B、C、D,B进程又生成一个子进程E。 五个task_struct怎么进行链接? 进程结构体剖析(5.1) struct task_struct { //... /* PID/PID hash table linkage. */ struct pid_link pids[PIDTYPE_MAX]; //... } 关键结构体 struct upid { int nr; struct pid_namespace *ns; struct hlist_node pid_chain; }; pid命名空间(1) pid命名空间(2) 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; struct net *net_ns; }; 结构图 重要函数(1) 根据进程的命名空间ns以及局部PID号nr,怎么找到进程的task_struct? nr,ns --- upid --- pid --- task_struct 重要函数(2) 给出task_struct、ID类型、命名空间,怎么取得命名空间局部的ID号? task_struct --- pid --- upid --- nr 重要函数(3) 对于一个新建的进程,怎么在各个命名空间内生成唯一的PID号? struct pid *alloc_pid(struct pid_namespace *ns) (见源代码) * 琵漫锹殃韭庚唱疡难国涟皋释僵雷犀漂诀夯与漱卞墨镜爆走鲤纺响将扮块Linux内核ta
显示全部
相似文档