我们都晓得所谓的进程就是正在运行的一个程序,它是由正文段,用户数据段和系统数据段所组成的一个动态实体。系统数据段存放着进程的控制信息。其中包括进程控制块PCB。

而在linux中每一个进程都由task_struct数据结构来定义(也称为任务结构体)。task_struct就是我们通常所说的PCB。它是进程存在的唯一标识,也是Linux进程实体的核心。

当我们调用fork()时,系统会为我们产生一个task_struct结构,然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中,以待进行进程管理。因此task_struct的结构对于我们理解进程调度有着关键作用。

在进行剖析task_struct的定义之前.我们先看一下一个进程基本的要求有哪些:

1,进程状态,将纪录进程在等待,运行,或死锁

2,调度信息,由哪个调度函数调度,怎样调度等

3,进程的通讯状况

4,因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型

5,时间信息,比如计算好执行的时间,以便cpu分配

6,标号,决定改进程归属

7,可以读写打开的一些文件信息

8,进程上下文和内核上下文

9,处理器上下文

10,内存信息

只有这些结构存在了,才能满足一个进程的所有要求.

然后我们打开/include/linux/sched.h

找到task_struct的定义:   
struct task_struct  {

/* these are hardcoded - don't touch */这里是一些硬件设置对程序原来说是透明的.

其中state说明了该进程是否可以执行,还是可以中断等信息.

Flage是进程号,在调用fork()时给出,

addr_limit是区分内核进程与普通进程在内存存放的位置不同

volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */

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

int  sigpending;

mm_segment_t  addr_limit; /* thread address space: 0-0xBFFFFFFF  for user-thead                                         0-0xFFFFFFFF  for kernelthread */

struct exec_domain *exec_domain;

long   need_resched;     
/*   various   fields   */

count是计数器   priorrity是优先级

long   counter;

long   priority;

cycles_t   avg_slice;

/*   SMP   and   runqueue   state   */   为多处理机定义的变量.

int   has_cpu;

int   processor;

int   last_processor;

int   lock_depth;   /*   Lock   depth.   We   can   context   switch   in   and   out   of   holding   a   syscall   kernel   lock...   */

为了在进程树中排序,   定义的父子,兄弟指针

struct   task_struct   *next_task,   *prev_task;

struct   task_struct   *next_run,   *prev_run;     
/*   task   state   */   定义task运行的状态,以及信号

struct   linux_binfmt   *binfmt;

int   exit_code,   exit_signal;

int   pdeath_signal;   /*   The   signal   sent   when the parent dies   */

/* 定义可进程的用户号,用户组以及进程组*/

unsigned   long   personality;

int   dumpable:1;

int   did_exec:1;

pid_t   pid;

pid_t   pgrp;

pid_t   tty_old_pgrp;

pid_t   session;

/*   boolean   value   for   session   group   leader   */

是不是进程组的头文件

int   leader;

/*

*   pointers   to   (original)   parent   process,   youngest   child,   younger   sibling,

*   older   sibling,   respectively.   (p->father   can   be   replaced   with   *   p->p_pptr->pid)

*/

父子进程的一些指针

struct   task_struct   *p_opptr,   *p_pptr,   *p_cptr,   *p_ysptr,   *p_osptr;     
/*   PID   hash   table   linkage.   */   在调度中用的一些hash表

struct   task_struct   *pidhash_next;

struct   task_struct   **pidhash_pprev;     
/*   Pointer   to   task[]   array   linkage.   */

struct   task_struct   **tarray_ptr;     
  struct   wait_queue   *wait_chldexit;   /*   for   wait4()   等待队列   */       struct   semaphore   *vfork_sem;   /*   for   vfork()   */

unsigned   long   policy,   rt_priority;

unsigned   long   it_real_value,   it_prof_value,   it_virt_value;

进程的性质因为实时进程与普通进程的调度算法不一样所以应有变量区分

下面是进程的一些时间信息

unsigned   long   it_real_incr,   it_prof_incr,   it_virt_incr;

struct   timer_list   real_timer;

struct   tms   times;

unsigned   long   start_time;

long   per_cpu_utime[NR_CPUS],   per_cpu_stime[NR_CPUS];定义了时间片的大小

/*   mm   fault   and   swap   info:   this   can   arguably   be   seen   as   either   mm-specific   or   thread-specific   */

内存信息

unsigned   long   min_flt,   maj_flt,   nswap,   cmin_flt,   cmaj_flt,   cnswap;   int   swappable:1;

/*   process   credentials   */

uid_t   uid,euid,suid,fsuid;

gid_t   gid,egid,sgid,fsgid;

int   ngroups;

gid_t   groups[NGROUPS];

kernel_cap_t   cap_effective,   cap_inheritable,   cap_permitted;

struct   user_struct   *user;

以下英文注释很清楚

/*   limits   */

struct   rlimit   rlim[RLIM_NLIMITS];

unsigned   short   used_math;

char   comm[16];   /*   file   system   info   */

int   link_count;

struct   tty_struct   *tty;   /*   NULL   if   no   tty   */

/*   ipc   stuff   */     
  struct   sem_undo   *semundo;

struct   sem_queue   *semsleeping;

/*   tss   for   this   task   */

struct   thread_struct   tss;

/*   filesystem   information   */

struct   fs_struct   *fs;

/*   open   file   information   */

struct   files_struct   *files;

/*   memory   management   info   */

struct   mm_struct   *mm;     
/*   signal   handlers   */

spinlock_t   sigmask_lock;

/*   Protects   signal   and   blocked   */

struct   signal_struct   *sig;   sigset_t   signal,   blocked;

struct   signal_queue   *sigqueue,   **sigqueue_tail;

unsigned   long   sas_ss_sp;

size_t   sas_ss_size;

};

在分析完这个结构之后, 还有很多问题要想要问,也许不能完全理解,但基本的框架要有.要有一个大体的认识,要了解到一个task_struct中基本的结构,这对今后学习进程和线程有着举足轻重的作用。

转载于:https://blog.51cto.com/cuiyuxuan/1786385

Linux下的进程管理——task_struct相关推荐

  1. 【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )

    文章目录 一.task_struct 结构体字段分析 1.files 字段 2.nsproxy 字段 3.信号处理相关字段 4.信号量和共享内存相关字段 在 Linux 内核 中 , " 进 ...

  2. 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )

    文章目录 一.task_struct 结构体字段分析 1.comm 字段 2.进程优先级字段 3.cpus_ptr 字段 4.mm.active_mm 字段 5. fs 字段 在 Linux 内核 中 ...

  3. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )

    文章目录 一.task_struct 结构体字段分析 1.real_parent 字段 2.parent 字段 3.group_leader 字段 4.real_cred 字段 5.cred 字段 在 ...

  4. 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )

    文章目录 一.task_struct 结构体字段分析 1.state 字段 2.stack 字段 3.pid字段 4.tgid 字段 5.pid_links 字段 在 Linux 内核 中 , &qu ...

  5. 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )

    文章目录 一.task_struct 结构体 二.task_struct 结构体代码示例 一.task_struct 结构体 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象 ...

  6. Linux下monit进程管理操作梳理--转载

    本文转自 (https://cloud.tencent.com/developer/article/1027097) Monit对运维人员来说可谓神器,它是一款功能非常丰富的进程.文件.目录和设备的监 ...

  7. 查看linux进程的设备io,Linux下查看进程IO工具iopp

    Linux下的IO检测工具最常用的是iostat,不过iostat只能查看到总的IO情况.如果要细看具体那一个程序点用的IO较高,可以使用iotop .不过iotop对内核版本和Python版本有要求 ...

  8. Linux学习日记(七)——Ubuntu下的进程管理

                                                     Ubuntu下的进程管理 who命令查看当前在线用户的情况 在linux系统下,通常情况下可能会有tt ...

  9. 【Linux】从冯诺依曼体系到初识Linux下的进程

    目录 前言 1.冯诺依曼体系结构 2.管理和操作系统 3.初识进程 1.描述进程PCB(process control block) 1.标识符pid fork接口创建子进程 2.进程状态 3.进程优 ...

最新文章

  1. ASP.NET页面包含另外一个页面
  2. 跑三小时的monkey测试该怎么算_百亿次的锤炼 - 带逛Dragonboat的各类测试
  3. Java集合框架体系(超详细)
  4. Ztree-JQuery树插件的学习(未完)
  5. 实体类?Dao接口?Mapper映射文件?都别写了!!!用这种方法就可以
  6. ogc是一个非营利性组织_非营利组织的软件资源
  7. 行为设计模式 - 命令设计模式
  8. Java企业面试算法新得体会之链表问题20问
  9. Leetcode 100.相同的树
  10. .net core平台使用遇到的坑
  11. 【DBSCAN聚类算法原理介绍】
  12. vue 点击某一行的按钮,获取当前行的数据
  13. dec是几进制(oct是几进制)
  14. 微信小程序如何实现登录注册带源码
  15. 玻色量子CEO文凯受邀出席首经贸金融学院系列讲座
  16. input file 上传图片及压缩
  17. ABAP字符串系列操作
  18. 微信小程序开发实验2
  19. NotePad快捷键
  20. 现场管理三大工具(zt)

热门文章

  1. ios沙盒机制与文件操作
  2. Java基础复习笔记系列 七 IO操作
  3. (七) UVC框架分析
  4. 使用云CRM的10个理由
  5. ThinkPHP入门篇(一)
  6. jetty9优化的两处地方
  7. 大白话讲解Promise(三)搞懂jquery中的Promise
  8. 苹果公司发布TestFlight Groups,放宽二进制版本提交限制
  9. EF 更新条目时出错。有关详细信息,请参见内部异常。
  10. Linux下的dhcp测试实现方法