Linux进程描述符:task_struct结构体

进程是什么?

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

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

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

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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值