您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > linux 内核 task_struct 结构体字段分析
linux内核源码分析进程管理(一)郭海林2012.9.29重要数据结构——双向链表(1)结构体定义:structlist_head{structlist_head*next,*prev;};list_headlist_headlist_headlist_headnextprevnextprevnextprevnextprev重要数据结构——双向链表(2)•为什么要使用这种结构?•容器机制——将对象嵌入到另一个对象中•怎样通过链表元素找到容器对象的实例?nextprevtask_structlist_headnextprevtask_structlist_headnextprevtask_structlist_head重要数据结构——双向链表(3).../include/linux/list.hlist_entry(p,t,m)已知类型为t的数据结构包含了一个list_head字段,该字段的名字是m,地址为p,返回类型为t的数据结构地址list_entry(0x.....,structtask_struct,tasks)重要数据结构——散列表(1)•结构体定义表头:structhlist_head{structhlist_node*first;};节点:structhlist_node{structhlist_node*next,**pprev;};重要数据结构——散列表(2)pprevnexthlist_headhlist_nodenullfirstfirstfirsthlist_nodepprevnextpprevnexthlist_nodenull进程结构体剖析(1)structtask_struct{volatilelongstate;/*-1unrunnable,0runnable,0stopped*///...longexit_state;//...}进程的状态宏定义:#defineTASK_RUNNING0#defineTASK_INTERRUPTIBLE1#defineTASK_UNINTERRUPTIBLE2#define__TASK_STOPPED4#define__TASK_TRACED8/*intsk-exit_state*/#defineEXIT_ZOMBIE16#defineEXIT_DEAD32//...进程结构体剖析(2)structtask_struct{//...structlist_headtasks;//将系统中所有进程通过双向链表链接起来!//...}怎样访问所有的进程呢?#definefor_each_process(p)\for(p=&init_task;(p=next_task(p))!=&init_task;)#definenext_task(p)\list_entry_rcu((p)-tasks.next,structtask_struct,tasks)给出全局pid号,怎么找到相应进程的task_struct?进程结构体剖析(3)structtask_struct{//...pid_tpid;//进程标识符(线程)pid_ttgid;//线程组的领头线程IDstructtask_struct*group_leader;//threadgroupleader//...}系统调用getpid()返回什么?进程结构体剖析(4.1)structtask_struct{//...structtask_struct__rcu*real_parent;/*realparentprocess*/structtask_struct__rcu*parent;/*recipientofSIGCHLD,wait4()reports*/structlist_headchildren;/*listofmychildren*/structlist_headsibling;/*linkageinmyparent'schildrenlist*///...}进程之间的关系:父子关系兄弟关系childrensiblingchildrensiblingchildrensiblingchildrensiblingchildrensiblingADCBEPNNPPPNNP进程结构体剖析(4.2)假设现在有进程A,生成三个子进程B、C、D,B进程又生成一个子进程E。五个task_struct怎么进行链接?进程结构体剖析(5.1)structtask_struct{//.../*PID/PIDhashtablelinkage.*/structpid_linkpids[PIDTYPE_MAX];//...}enumpid_type{PIDTYPE_PID,PIDTYPE_PGID,PIDTYPE_SID,PIDTYPE_MAX};//进程PID//线程组领头线程PID//会话领头进程ID//类型个数pids[0]pids[1]pids[2]关键结构体structupid{intnr;structpid_namespace*ns;structhlist_nodepid_chain;};structpid_link{structhlist_nodenode;structpid*pid;};structpid{atomic_tcount;unsignedintlevel;structhlist_headtasks[PIDTYPE_MAX];structrcu_headrcu;structupidnumbers[1];};countlevertask[0]task[1]task[2]nrnodepidnodepidnspid_chain213pid命名空间(1)123456781092131lever0lever1lever2pid命名空间(2)structnsproxy{atomic_tcount;structuts_namespace*uts_ns;structipc_namespace*ipc_ns;structmnt_namespace*mnt_ns;structpid_namespace*pid_ns;structnet*net_ns;};structpid_namespace{//...unsignedintlevel;structpid_namespace*parent;//...};结构图见板书....重要函数(1)•根据进程的命名空间ns以及局部PID号nr,怎么找到进程的task_struct?•nr,ns---upid---pid---task_structstructpid*find_pid_ns(intnr,structpid_namespace*ns)structtask_struct*pid_task(structpid*pid,enumpid_typetype)重要函数(2)•给出task_struct、ID类型、命名空间,怎么取得命名空间局部的ID号?•task_struct---pid---upid---nrstructpid*task_pid(structtask_struct*task)pid_tpid_nr_ns(structpid*pid,structpid_namespace*ns)重要函数(3)•对于一个新建的进程,怎么在各个命名空间内生成唯一的PID号?•structpid*alloc_pid(structpid_namespace*ns)(见源代码)
本文标题:linux 内核 task_struct 结构体字段分析
链接地址:https://www.777doc.com/doc-3442376 .html