码迷,mamicode.com
首页 > 其他好文 > 详细

task_struct知多少

时间:2016-06-06 01:25:23      阅读:458      评论:0      收藏:0      [点我收藏+]

标签:task_struct 进程

学习Linux网络编程就不得不提到一个概念——进程。我觉得简单来说进程就是程序的一个执行实例。task_struct则是进程描述符。操作系统通过task_struct感知进程的存在。因此这个结构体就显得至关重要了。现在就对这个结构体进行一个剖析。

struct task_struct { 
       volatile long state;

     该字段描述的是进程的状态。看到volatile关键字,很容易就想到了防止编译时的优化。因为编译器有一个缓存优化的习惯,比如说,第一次在内存取数,编译器发现后面还要用这个变量,于是把这个变量的值就放在寄存器中。这个关键词就是要求编译器不要优化,每次都让CPU去内存取数。以确保状态的变化能及时地反映上来。

struct list_head tasks;


该字段用来把系统中的PCB通过双向循环链表链接起来。可以写了几种形式的内核模块来遍历这个链表。

小贴士为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。

struct mm_struct *mm;

该字段是进程的内存描述符。比如current是当前进程的描述符,则current->mm是指向内存的指针。mm是指向struct mm_struct的指针。

int exit_code;

当一个进程通过exit()结束进程后,会变成一个僵尸进程,我们知道僵尸进程的PCB没有释放,其中PCB中的这个字段就是记录退出的退出码。

 pid_t pid; 
 pid_t tgid;

进程的标识信息,pid表示进程ID,tgid是便是线程组的ID,其实,我们调用getpid()这个系统调用的时候返回的是tgid。这样的目的是为了兼顾POSIX标准,为了兼顾POSIX标准,linux引入了线程组的概念。当进程中没有多线程时,这两个值一样,当有多个线程时,tgid记录主线程的id,pid记录各个线程自己独有的id,这样就可以保证进程中每个线程getpid()返回出来的值一样了。

 struct list_head thread_group;

该字段就是在用户态写一个多线程的程序,然后通过该字段遍历线程组中所有线程的PCB,这个字段将一个进程(也就是一个线程组)中的所有线程的PCB通过链表链接起来。

char comm[TASK_COMM_LEN];

该字段就是就是一个字符数组记录这个进程的名字。

PS:查看这个结构可以在./include/linux/sched.h


本文出自 “七月朔风” 博客,请务必保留此出处http://luminous.blog.51cto.com/10797288/1786401

task_struct知多少

标签:task_struct 进程

原文地址:http://luminous.blog.51cto.com/10797288/1786401

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!