Linux进程描述符:task_struct结构体

来源:互联网 发布:linux保存配置文件 编辑:程序博客网 时间:2024/04/29 23:49

进程是什么?

如果有人问你,进程是什么,你该如何回答呢?

正在执行的程序;程序的执行实例;能分配处理器并由处理器执行的实体。

进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。

那么进程和程序的区别是什么呢?

1、进程在内存上,程序在硬盘上
2、进程比程序多了很多描述信息,其中最重要的是PCB
3、进程是动态的,进程状态可以改变;程序是静态的,处于存储状态

Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中。

那么接下来我们就来认识一下task_struct结构体的成员吧:

1、进程状态:

volatile long state;    int exit_state;

state成员的可能取值如下:

#define TASK_RUNNING        0#define TASK_INTERRUPTIBLE  1#define TASK_UNINTERRUPTIBLE    2#define __TASK_STOPPED      4#define __TASK_TRACED       8/* in tsk->exit_state */#define EXIT_ZOMBIE     16#define EXIT_DEAD       32/* in tsk->state again */#define TASK_DEAD       64#define TASK_WAKEKILL       128#define TASK_WAKING     256
    TASK_RUNNING  //表示进程要么正在执行,要么正要准备执行。    TASK_INTERRUPTIBLE  //表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。    TASK_UNINTERRUPTIBLE  //与TASK_INTERRUPTIBLE类似,除了不能通过接受一个信号来唤醒以外。    __TASK_STOPPED  //表示进程被停止执行。    __TASK_TRACED  //表示进程被debugger等进程监视。    EXIT_ZOMBIE  //表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息。    EXIT_DEAD  //表示进程的最终状态。

2、进程标识符(PID)

    pid_t pid;    pid_t tgid;

Unix系统通过pid来标识进程,linux把不同的pid与系统中每个进程或轻量级线程关联,而unix程序员希望同一组线程具有共同的pid,遵照这个标准linux引入线程组的概念。一个线程组所有线程与领头线程具有相同的pid,存入tgid字段,getpid()返回当前进程的tgid值而不是pid的值。

3、进程内核栈

void *stack; 

进程通过alloc_thread_info函数分配它的内核栈,通过free_thread_info函数释放所分配的内核栈。

4、进程标记

unsigned int flags; /* per process flags, defined below */  

反应进程状态的信息,但不是运行状态,用于内核识别进程当前的状态,以备下一步操作

5、进程调度

int prio, static_prio, normal_prio;unsigned int rt_priority;

static_prio :用于保存静态优先级,可以通过nice系统调用来进行修改
rt_priority: 用于保存实时优先级
normal_prio :的值取决于静态优先级和调度策略
prio: 用于保存动态优先级

6、信号处理

/* signal handlers */struct signal_struct *signal;struct sighand_struct *sighand;1583 sigset_t blocked, real_blocked;sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */struct sigpending pending;1587 unsigned long sas_ss_sp;size_t sas_ss_size;
signal  //指向进程的信号描述符sighand //指向进程的信号处理程序描述符blocked //表示被阻塞信号的掩码,real_blocked表示临时掩码pending //存放私有挂起信号的数据结构sas_ss_sp   //是信号处理程序备用堆栈的地址,sas_ss_size表示堆栈的大小

tast_struct结构体 翻译:

  long state //任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)。  long counter// 任务运行时间计数(递减)(滴答数),运行时间片。  long priority //运行优先数。任务开始运行时counter = priority,越大运行越长。  long signal //信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。  struct sigaction sigaction[32]// 信号执行属性结构,对应信号将要执行的操作和标志信息。  long blocked //进程信号屏蔽码(对应信号位图)。  int exit_code //任务执行停止的退出码,其父进程会取。  unsigned long start_code //代码段地址。  unsigned long end_code //代码长度(字节数)。  unsigned long end_data //代码长度 + 数据长度(字节数)。  unsigned long brk //总长度(字节数)。  unsigned long start_stack //堆栈段地址。  long pid //进程标识号(进程号)。  long father //父进程号。  long pgrp// 父进程组号。  long session //会话号。  long leader //会话首领。  unsigned short uid //用户标识号(用户id)。  unsigned short euid //有效用户id。  unsigned short suid// 保存的用户id。  unsigned short gid //组标识号(组id)。  unsigned short egid //有效组id。  unsigned short sgid //保存的组id。  long alarm //报警定时值(滴答数)。  long utime //用户态运行时间(滴答数)。  long stime //系统态运行时间(滴答数)。  long cutime //子进程用户态运行时间。  long cstime// 子进程系统态运行时间。  long start_time //进程开始运行时刻。  unsigned short used_math //标志:是否使用了协处理器。  int tty //进程使用tty 的子设备号。-1 表示没有使用。  unsigned short umask //文件创建属性屏蔽位。  struct m_inode * pwd //当前工作目录i 节点结构。  struct m_inode * root //根目录i 节点结构。  struct m_inode * executable //执行文件i 节点结构。  unsigned long close_on_exec //执行时关闭文件句柄位图标志。(参见include/fcntl.h)  struct file * filp[NR_OPEN] //进程使用的文件表结构。  struct desc_struct ldt[3] //本任务的局部表描述符。0-空,1-代码段cs,2-数据和堆栈段ds&ss。  struct tss_struct tss //本进程的任务状态段信息结构

本文参考文章:
http://blog.csdn.net/gatieme/article/details/51383272
http://www.educity.cn/linux/518072.html

0 0
原创粉丝点击