http://blog.csdn.net/qq_26768741/article/details/54348586

当把一个程序加载到内存当中,此时,这个时候就有了进程,关于进程,有一个相关的叫做进程控制块(PCB),这个是系统为了方便进行管理进程所设置的一个数据结构,通过PCB,就可以记录进程的特征以及一些信息。 
内核当中使用进程描述符task_struct。 
这个task_struct就是一个定义的一个结构体,通过这个结构体,可以对进程的所有的相关的信息进行维护,对进程进行管理。

接下来我们需要对task_struct结构体当中的成员进行一些分析。

linux内核版本
Linux version 2.6.32-431.el6.i686

1 task_struct


1.1 进程状态


  1. volatile long state;
  2. int exit_state;`

表示进程的状态, 在进程执行的时候,它会有一个状态,这个状态对于进程来说是很重要的一个属性。进程主要有以下几个状态。

state可能的取值 

这些状态就不再一一说明了,后续进程篇会有专门的说明。

1.2 进程标识符(PID)


  1. pid_t pid;
  2. pid_t tgid;

每个进程都有进程标识符、用户标识符、组标识符,进程标识符对于每一个进程来说都是唯一的。内核通过进程标识符来对不同的进程进行识别,一般来说,行创建的进程都是在前一个进程的基础上PID加上1作为本进程的PID。为了linux平台兼容性,PID一般最大为32767。

1.3 进程内核栈


  1. void *stack

stack用来维护分配给进程的内核栈,内核栈的意义在于,进程task_struct所占的内存是由内核动态分配的,确切的说就是内核根本不给task_struct分配内存,只给内核栈分配8KB内存,并且一部分会提供给task_struct使用。 
task_struct结构体大约占用的大小为1K左右,根据内核版本的不同,大小也会有差异。 
所以,也就可以知道内核栈最大也就是7KB,否则,内核栈会覆盖task_struct结构。

1.4 标记


  1. unsigned int flags

用来反映一个进程的状态信息,但不是运行状态,用于内核识别进程当前的状态,flags的取值如下:

可使用的标记 功能
PF_FORKNOEXEC 进程刚创建,但还没执行。
PF_SUPERPRIV 超级用户特权。
PF_DUMPCORE 关于核心。
PF_SIGNALED 进程被信号(signal)杀出。
PF_EXITING 进程开始关闭。

1.5 表示进程亲属关系的成员


  1. struct task_struct *real_parent;
  2. struct task_struct *parent;
  3. struct list_head children;
  4. struct list_head sibling;
  5. struct task_struct *group_leader;

linux系统当中,考虑到进程的派生,所以进程之间会存在父进程和子进程这样的关系,当然,对于同一个父进程派生出来的进程,他们的关系当然是兄弟进程了。

成员 功能
real_parent 指向父进程的指针,如果父进程不存在了,则指向PID为1的进程
parent 指向父进程的,值与real——parent相同,需要向它的父进程发送信号
children 表示链表的头部,链表中的所有元素都是它的子进程
sibling 用于当前进程插入兄弟链表当中
group_leader 指向进程组的领头进程

1.6 ptrace系统调用


  1. unsigned int ptrace;
  2. struct list_head ptraced;
  3. struct list_head ptrace_entry;

首先我们要清楚ptrace是什么东西,ptrace是一种提供父进程控制子进程运行,并且可以检查和改变它的核心image。当trace设置为0时不需要被跟踪。

1.7 性能诊断工具——Performance Event


  1. #ifdef CONFIG_PERF_EVENTS
  2. #ifndef __GENKSYMS__
  3. void * __reserved_perf__;
  4. #else
  5. struct perf_event_context *perf_event_ctxp;
  6. #endif
  7. struct mutex perf_event_mutex;
  8. struct list_head perf_event_list;
  9. #endif

Performance Event是性能诊断工具,这些成员用来帮助它进行分析进程性能问题。

1.8 进程调度


  1. int prio, static_prio, normal_prio;
  2. unsigned int rt_priority;
成员 功能
static_prio 保存静态优先级,可以通过nice系统进行修改
rt_priority 保存实时优先级
normal_prio 保存静态优先级和调度策略
prio 保存动态优先级

调度进程利用这部分信息决定系统当中的那个进程最应该运行,并且结合进程的状态信息保证系统运作高效。

提到进程调度,当然还需要说明一下进程调度策略,我们来看下关于调度策略的成员:

  1. unsigned int policy;
  2. const struct sched_class *sched_class;
  3. struct sched_entity se;
  4. struct sched_rt_entity rt;
成员 功能
policy 调度策略
sched_class 调度类
se 普通进程的一个调用的实体,每一个进程都有其中之一的实体
rt 实时进程的调用实体,每个进程都有其中之一的实体
cpus_allowed 用于控制进程可以在处理器的哪里运行

policy表示进程的调度策略,主要有以下五种:

种类 功能
SCHED_NORMAL 用于普通进程
SCHED_BATCH 普通进程策略的分化版本,采用分时策略
SCHED_IDLE 优先级最低,系统空闲时才跑这类进程
SCHED_FIFO 先入先出的调度算法
SCHED_RR 实时调度算法,采用时间片,相同优先级的任务当用完时间片就会放到队列的尾部,保证公平性,同时,高优先级的任务抢占低优先级的任务。
SCHED_DEADLINE 新支持的实时调度策略,正对突发性计算

说完了调度策略,我们再来看一下调度类。

调度类 功能
idle_sched_class 每一个cpu的第一个pid=0的线程,是一个静态的线程
stop_sched_class 优先级最高的线程,会中断所有其他的线程,而且不会被其他任务打断
rt_sched_slass 作用在实时线程
fair_sched_class 作用的一般线程

它们的优先级顺序为Stop>rt>fair>idle

1.9进程的地址空间


  1. struct mm_struct *mm, *active_mm;
成员 功能
mm 进程所拥有的用户空间的内存描述符
active_mm 指向进程运行时使用的内存描述符,对于普通的进程来说,mm和active_mm是一样的,但是内核线程是没有进程地址空间的,所以内核线程的mm是空的,所以需要初始化内核线程的active_mm

对于内核线程切记是没有地址空间的。

后续会有专门的博客来叙述

1.10 判断标志


  1. //用于进程判断标志
  2. int exit_state;
  3. int exit_code, exit_signal;
  4. int pdeath_signal; /* The signal sent when the parent dies */
  5. /* ??? */
  6. unsigned int personality;
  7. unsigned did_exec:1;
  8. unsigned in_execve:1; /* Tell the LSMs that the process is doing an
  9. * execve */
  10. unsigned in_iowait:1;
  11. /* Revert to default priority/policy when forking */
  12. unsigned sched_reset_on_fork:1;
成员 功能
exit_state 进程终止的状态
exit_code 设置进程的终止代号
exit_signal 设置为-1的时候表示是某个线程组当中的一员,只有当线程组的最后一个成员终止时,才会产生型号给父进程
pdeath_signal 用来判断父进程终止时的信号

1.11 时间与定时器


关于时间,一个进程从创建到终止叫做该进程的生存期,进程在其生存期内使用CPU时间,内核都需要进行记录,进程耗费的时间分为两部分,一部分是用户模式下耗费的时间,一部分是在系统模式下耗费的时间。

 
  1. //描述CPU时间的内容
  2. cputime_t utime, stime, utimescaled, stimescaled;
  3. cputime_t gtime;
  4. cputime_t prev_utime, prev_stime;
  5. unsigned long nvcsw, nivcsw; /* context switch counts */
  6. struct timespec start_time; /* monotonic time */
  7. struct timespec real_start_time; /* boot based time */
  8. struct task_cputime cputime_expires;
  9. struct list_head cpu_timers[3];
成员 属性
utime/stime 用于记录进程在用户状态/内核态下所经过的定时器
prev_utime/prev_stime 记录当前的运行时间
utimescaled/stimescaled 分别记录进程在用户态和内核态的运行的时间
gtime 记录虚拟机的运行时间
nvcsw/nicsw 是自愿/非自愿上下文切换计数
start_time/real_start_time 进程创建时间,real还包括了进程睡眠时间
cputime_expires 用来统计进程或进程组被跟踪的处理器时间,三个成员对应的是下面的cpu_times[3]的三个链表

然后接下来我们来看一下进程的定时器,一共是三种定时器。

定时器类型 解释 更新时刻
ITIMER_REAL 实时定时器 实时更新,不在乎进程是否运行
ITIMER_VIRTUAL 虚拟定时器 只在进程运行用户态时更新
ITIMER_PROF 概况定时器 进程运行于用户态和系统态进行更新

进程总过有三种定时器,这三种定时器的特征有到期时间,定时间隔,和要触发的时间,

1.12 信号处理


  1. struct signal_struct *signal;
  2. struct sighand_struct *sighand;
  3. sigset_t blocked, real_blocked;
  4. sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
  5. struct sigpending pending;
  6. unsigned long sas_ss_sp;
  7. size_t sas_ss_size;

关于信号处理:

成员 功能
signal 指向进程信号描述符
sighand 指向进程信号处理程序描述符
blocked 表示被阻塞信号的掩码
pending 存放私有挂起信号的数据结构
sas_ss_sp 信号处理程序备用堆栈的地址

1.13 文件系统信息


  1. //文件系统信息结构体
  2. /* filesystem information */
  3. struct fs_struct *fs;
  4. //打开文件相关信息结构体
  5. /* open file information */
  6. struct files_struct *files;

进程可以用来打开和关闭文件,文件属于系统资源,task_struct有两个来描述文件资源,他们会描述两个VFS索引节点,两个节点分别是root和pwd,分别指向根目录和当前的工作目录。

成员 功能
struct fs_struct *fs 进程可执行镜像所在的文件系统
struct files_struct *files 进程当前打开的文件

1.14 其他


  1. struct task_struct {
  2. //进程状态(-1就绪态,0运行态,>0停止态)
  3. volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  4. //进程内核栈
  5. void *stack;
  6. //有几个进程只在使用此结构
  7. atomic_t usage;
  8. //标记
  9. unsigned int flags; /* per process flags, defined below */
  10. //ptrace系统调用,关于实现断点调试,跟踪进程运行。
  11. unsigned int ptrace;
  12. //锁的深度
  13. int lock_depth; /* BKL lock depth */
  14. //SMP实现无加锁的进程切换
  15. #ifdef CONFIG_SMP
  16. #ifdef __ARCH_WANT_UNLOCKED_CTXSW
  17. int oncpu;
  18. #endif
  19. #endif
  20. //关于进程调度
  21. int prio, static_prio, normal_prio;
  22. //优先级
  23. unsigned int rt_priority;
  24. //关于进程
  25. const struct sched_class *sched_class;
  26. struct sched_entity se;
  27. struct sched_rt_entity rt;
  28. //preempt_notifier结构体链表
  29. #ifdef CONFIG_PREEMPT_NOTIFIERS
  30. /* list of struct preempt_notifier: */
  31. struct hlist_head preempt_notifiers;
  32. #endif
  33. /*
  34. * fpu_counter contains the number of consecutive context switches
  35. * that the FPU is used. If this is over a threshold, the lazy fpu
  36. * saving becomes unlazy to save the trap. This is an unsigned char
  37. * so that after 256 times the counter wraps and the behavior turns
  38. * lazy again; this to deal with bursty apps that only use FPU for
  39. * a short time
  40. */
  41. //FPU使用计数
  42. unsigned char fpu_counter;
  43. //块设备I/O层的跟踪工具
  44. #ifdef CONFIG_BLK_DEV_IO_TRACE
  45. unsigned int btrace_seq;
  46. #endif
  47. //进程调度策略相关的字段
  48. unsigned int policy;
  49. cpumask_t cpus_allowed;
  50. //RCU同步原语
  51. #ifdef CONFIG_TREE_PREEMPT_RCU
  52. int rcu_read_lock_nesting;
  53. char rcu_read_unlock_special;
  54. struct rcu_node *rcu_blocked_node;
  55. struct list_head rcu_node_entry;
  56. #endif /* #ifdef CONFIG_TREE_PREEMPT_RCU */
  57. //用于调度器统计进程运行信息
  58. #if defined(CONFIG_SCHEDSTATS) || defined(CONFIG_TASK_DELAY_ACCT)
  59. struct sched_info sched_info;
  60. #endif
  61. //用于构架进程链表
  62. struct list_head tasks;
  63. struct plist_node pushable_tasks;
  64. //关于进程的地址空间,指向进程的地址空间。(链表和红黑树)
  65. struct mm_struct *mm, *active_mm;
  66. /* task state */
  67. //进程状态参数
  68. int exit_state;
  69. //退出信号处理
  70. int exit_code, exit_signal;
  71. //接收父进程终止的时候会发送信号
  72. int pdeath_signal; /* The signal sent when the parent dies */
  73. /* ??? */
  74. unsigned int personality;
  75. unsigned did_exec:1;
  76. unsigned in_execve:1; /* Tell the LSMs that the process is doing an
  77. * execve */
  78. unsigned in_iowait:1;
  79. /* Revert to default priority/policy when forking */
  80. unsigned sched_reset_on_fork:1;
  81. //进程pid,父进程ppid。
  82. pid_t pid;
  83. pid_t tgid;
  84. //防止内核堆栈溢出
  85. #ifdef CONFIG_CC_STACKPROTECTOR
  86. /* Canary value for the -fstack-protector gcc feature */
  87. unsigned long stack_canary;
  88. #endif
  89. /*
  90. * pointers to (original) parent process, youngest child, younger sibling,
  91. * older sibling, respectively. (p->father can be replaced with
  92. * p->real_parent->pid)
  93. */
  94. //这部分是用来进行维护进程之间的亲属关系的。
  95. //初始化父进程
  96. struct task_struct *real_parent; /* real parent process */
  97. //接纳终止的进程
  98. struct task_struct *parent; /* recipient of SIGCHLD, wait4() reports */
  99. /*
  100. * children/sibling forms the list of my natural children
  101. */
  102. //维护子进程链表
  103. struct list_head children; /* list of my children */
  104. //兄弟进程链表
  105. struct list_head sibling; /* linkage in my parent's children list */
  106. //线程组组长
  107. struct task_struct *group_leader; /* threadgroup leader */
  108. /*
  109. * ptraced is the list of tasks this task is using ptrace on.
  110. * This includes both natural children and PTRACE_ATTACH targets.
  111. * p->ptrace_entry is p's link on the p->parent->ptraced list.
  112. */
  113. //ptrace,系统调用,关于断点调试。
  114. struct list_head ptraced;
  115. struct list_head ptrace_entry;
  116. //PID与PID散列表的联系
  117. /* PID/PID hash table linkage. */
  118. struct pid_link pids[PIDTYPE_MAX];
  119. //维护一个链表,里面有该进程所有的线程
  120. struct list_head thread_group;
  121. //do_fork()函数
  122. struct completion *vfork_done; /* for vfork() */
  123. int __user *set_child_tid; /* CLONE_CHILD_SETTID */
  124. int __user *clear_child_tid; /* CLONE_CHILD_CLEARTID */
  125. //描述CPU时间的内容
  126. //utime是用户态下的执行时间
  127. //stime是内核态下的执行时间
  128. cputime_t utime, stime, utimescaled, stimescaled;
  129. cputime_t gtime;
  130. cputime_t prev_utime, prev_stime;
  131. //上下文切换计数
  132. unsigned long nvcsw, nivcsw; /* context switch counts */
  133. struct timespec start_time; /* monotonic time */
  134. struct timespec real_start_time; /* boot based time */
  135. /* mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific */
  136. //缺页统计
  137. unsigned long min_flt, maj_flt;
  138. struct task_cputime cputime_expires;
  139. struct list_head cpu_timers[3];
  140. /* process credentials */
  141. //进程身份凭据
  142. const struct cred *real_cred; /* objective and real subjective task
  143. * credentials (COW) */
  144. const struct cred *cred; /* effective (overridable) subjective task
  145. * credentials (COW) */
  146. struct mutex cred_guard_mutex; /* guard against foreign influences on
  147. * credential calculations
  148. * (notably. ptrace) */
  149. struct cred *replacement_session_keyring; /* for KEYCTL_SESSION_TO_PARENT */
  150. //去除路径以后的可执行文件名称,进程名
  151. char comm[TASK_COMM_LEN]; /* executable name excluding path
  152. - access with [gs]et_task_comm (which lock
  153. it with task_lock())
  154. - initialized normally by setup_new_exec */
  155. /* file system info */
  156. //文件系统信息
  157. int link_count, total_link_count;
  158. #ifdef CONFIG_SYSVIPC
  159. /* ipc stuff */
  160. //进程通信
  161. struct sysv_sem sysvsem;
  162. #endif
  163. #ifdef CONFIG_DETECT_HUNG_TASK
  164. /* hung task detection */
  165. unsigned long last_switch_count;
  166. #endif
  167. //该进程在特点CPU下的状态
  168. /* CPU-specific state of this task */
  169. struct thread_struct thread;
  170. //文件系统信息结构体
  171. /* filesystem information */
  172. struct fs_struct *fs;
  173. //打开文件相关信息结构体
  174. /* open file information */
  175. struct files_struct *files;
  176. /* namespaces */
  177. //命名空间:
  178. struct nsproxy *nsproxy;
  179. /* signal handlers */
  180. //关于进行信号处理
  181. struct signal_struct *signal;
  182. struct sighand_struct *sighand;
  183. sigset_t blocked, real_blocked;
  184. sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */
  185. struct sigpending pending;
  186. unsigned long sas_ss_sp;
  187. size_t sas_ss_size;
  188. int (*notifier)(void *priv);
  189. void *notifier_data;
  190. sigset_t *notifier_mask;
  191. //进程审计
  192. struct audit_context *audit_context;
  193. #ifdef CONFIG_AUDITSYSCALL
  194. uid_t loginuid;
  195. unsigned int sessionid;
  196. #endif
  197. seccomp_t seccomp;
  198. #ifdef CONFIG_UTRACE
  199. struct utrace *utrace;
  200. unsigned long utrace_flags;
  201. #endif
  202. //线程跟踪组
  203. /* Thread group tracking */
  204. u32 parent_exec_id;
  205. u32 self_exec_id;
  206. /* Protection of (de-)allocation: mm, files, fs, tty, keyrings, mems_allowed,
  207. * mempolicy */
  208. spinlock_t alloc_lock;
  209. //中断
  210. #ifdef CONFIG_GENERIC_HARDIRQS
  211. /* IRQ handler threads */
  212. struct irqaction *irqaction;
  213. #endif
  214. //task_rq_lock函数所使用的锁
  215. /* Protection of the PI data structures: */
  216. spinlock_t pi_lock;
  217. //基于PI协议的等待互斥锁
  218. #ifdef CONFIG_RT_MUTEXES
  219. /* PI waiters blocked on a rt_mutex held by this task */
  220. struct plist_head pi_waiters;
  221. /* Deadlock detection and priority inheritance handling */
  222. struct rt_mutex_waiter *pi_blocked_on;
  223. #endif
  224. //死锁检测
  225. #ifdef CONFIG_DEBUG_MUTEXES
  226. /* mutex deadlock detection */
  227. struct mutex_waiter *blocked_on;
  228. #endif
  229. //中断
  230. #ifdef CONFIG_TRACE_IRQFLAGS
  231. unsigned int irq_events;
  232. int hardirqs_enabled;
  233. unsigned long hardirq_enable_ip;
  234. unsigned int hardirq_enable_event;
  235. unsigned long hardirq_disable_ip;
  236. unsigned int hardirq_disable_event;
  237. int softirqs_enabled;
  238. unsigned long softirq_disable_ip;
  239. unsigned int softirq_disable_event;
  240. unsigned long softirq_enable_ip;
  241. unsigned int softirq_enable_event;
  242. int hardirq_context;
  243. int softirq_context;
  244. #endif
  245. //lockdep
  246. #ifdef CONFIG_LOCKDEP
  247. # define MAX_LOCK_DEPTH 48UL
  248. u64 curr_chain_key;
  249. int lockdep_depth;
  250. unsigned int lockdep_recursion;
  251. struct held_lock held_locks[MAX_LOCK_DEPTH];
  252. gfp_t lockdep_reclaim_gfp;
  253. #endif
  254. //日志文件
  255. /* journalling filesystem info */
  256. void *journal_info;
  257. /* stacked block device info */
  258. //块设备链表
  259. struct bio *bio_list, **bio_tail;
  260. /* VM state */
  261. //虚拟内存状态,内存回收
  262. struct reclaim_state *reclaim_state;
  263. //存放块设备I/O流量信息
  264. struct backing_dev_info *backing_dev_info;
  265. //I/O调度器所用信息
  266. struct io_context *io_context;
  267. unsigned long ptrace_message;
  268. siginfo_t *last_siginfo; /* For ptrace use. */
  269. //记录进程I/O计数
  270. struct task_io_accounting ioac;
  271. #if defined(CONFIG_TASK_XACCT)
  272. u64 acct_rss_mem1; /* accumulated rss usage */
  273. u64 acct_vm_mem1; /* accumulated virtual memory usage */
  274. cputime_t acct_timexpd; /* stime + utime since last update */
  275. #endif
  276. //CPUSET功能
  277. #ifdef CONFIG_CPUSETS
  278. nodemask_t mems_allowed; /* Protected by alloc_lock */
  279. #ifndef __GENKSYMS__
  280. /*
  281. * This does not change the size of the struct_task(2+2+4=4+4)
  282. * so the offsets of the remaining fields are unchanged and
  283. * therefore the kABI is preserved. Only the kernel uses
  284. * cpuset_mem_spread_rotor and cpuset_slab_spread_rotor so
  285. * it is safe to change it to use shorts instead of ints.
  286. */
  287. unsigned short cpuset_mem_spread_rotor;
  288. unsigned short cpuset_slab_spread_rotor;
  289. int mems_allowed_change_disable;
  290. #else
  291. int cpuset_mem_spread_rotor;
  292. int cpuset_slab_spread_rotor;
  293. #endif
  294. #endif
  295. //Control Groups
  296. #ifdef CONFIG_CGROUPS
  297. /* Control Group info protected by css_set_lock */
  298. struct css_set *cgroups;
  299. /* cg_list protected by css_set_lock and tsk->alloc_lock */
  300. struct list_head cg_list;
  301. #endif
  302. //futex同步机制
  303. #ifdef CONFIG_FUTEX
  304. struct robust_list_head __user *robust_list;
  305. #ifdef CONFIG_COMPAT
  306. struct compat_robust_list_head __user *compat_robust_list;
  307. #endif
  308. struct list_head pi_state_list;
  309. struct futex_pi_state *pi_state_cache;
  310. #endif
  311. //关于内存检测工具Performance Event
  312. #ifdef CONFIG_PERF_EVENTS
  313. #ifndef __GENKSYMS__
  314. void * __reserved_perf__;
  315. #else
  316. struct perf_event_context *perf_event_ctxp;
  317. #endif
  318. struct mutex perf_event_mutex;
  319. struct list_head perf_event_list;
  320. #endif
  321. //非一致内存访问
  322. #ifdef CONFIG_NUMA
  323. struct mempolicy *mempolicy; /* Protected by alloc_lock */
  324. short il_next;
  325. #endif
  326. //文件系统互斥资源
  327. atomic_t fs_excl; /* holding fs exclusive resources */
  328. //RCU链表
  329. struct rcu_head rcu;
  330. /*
  331. * cache last used pipe for splice
  332. */
  333. //管道
  334. struct pipe_inode_info *splice_pipe;
  335. //延迟计数
  336. #ifdef CONFIG_TASK_DELAY_ACCT
  337. struct task_delay_info *delays;
  338. #endif
  339. #ifdef CONFIG_FAULT_INJECTION
  340. int make_it_fail;
  341. #endif
  342. struct prop_local_single dirties;
  343. #ifdef CONFIG_LATENCYTOP
  344. int latency_record_count;
  345. struct latency_record latency_record[LT_SAVECOUNT];
  346. #endif
  347. /*
  348. * time slack values; these are used to round up poll() and
  349. * select() etc timeout values. These are in nanoseconds.
  350. */
  351. //time slack values,常用于poll和select函数
  352. unsigned long timer_slack_ns;
  353. unsigned long default_timer_slack_ns;
  354. //socket控制消息
  355. struct list_head *scm_work_list;
  356. #ifdef CONFIG_FUNCTION_GRAPH_TRACER
  357. //ftrace跟踪器
  358. /* Index of current stored adress in ret_stack */
  359. int curr_ret_stack;
  360. /* Stack of return addresses for return function tracing */
  361. struct ftrace_ret_stack *ret_stack;
  362. /* time stamp for last schedule */
  363. unsigned long long ftrace_timestamp;
  364. /*
  365. * Number of functions that haven't been traced
  366. * because of depth overrun.
  367. */
  368. atomic_t trace_overrun;
  369. /* Pause for the tracing */
  370. atomic_t tracing_graph_pause;
  371. #endif
  372. #ifdef CONFIG_TRACING
  373. /* state flags for use by tracers */
  374. unsigned long trace;
  375. /* bitmask of trace recursion */
  376. unsigned long trace_recursion;
  377. #endif /* CONFIG_TRACING */
  378. /* reserved for Red Hat */
  379. unsigned long rh_reserved[2];
  380. #ifndef __GENKSYMS__
  381. struct perf_event_context *perf_event_ctxp[perf_nr_task_contexts];
  382. #ifdef CONFIG_CGROUP_MEM_RES_CTLR /* memcg uses this to do batch job */
  383. struct memcg_batch_info {
  384. int do_batch; /* incremented when batch uncharge started */
  385. struct mem_cgroup *memcg; /* target memcg of uncharge */
  386. unsigned long bytes; /* uncharged usage */
  387. unsigned long memsw_bytes; /* uncharged mem+swap usage */
  388. } memcg_batch;
  389. #endif
  390. #endif
  391. };

如果需要,可从github处取走注释源码:https://github.com/wsy081414/C_linux_practice/blob/master/task_struct.h

进程管理—进程描述符(task_struct)的更多相关文章

  1. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

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

  2. 进程描述符task_struct

    1.进程状态 volatile long state; int exit_state; state成员的可能取值如下: #define TASK_RUNNING        0 #define TA ...

  3. Linux-进程描述符 task_struct 详解

    为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块 PCB(Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构.它是进程 ...

  4. Linux进程管理描述符 task_struct

    转:http://blog.csdn.net/hongchangfirst/article/details/7075026 大家都知道进程,可是知道linux是怎么管理其进程的吗?每一个进程都有一个进 ...

  5. 内核线程的进程描述符task_struct中的mm和active_mm

    task_struct进程描述符中包含两个跟进程地址空间相关的字段mm, active_mm, struct task_struct { // ... struct mm_struct *mm; st ...

  6. 【Linux 应用编程】进程管理 - 进程、线程和程序

    基本概念 程序和进程的区别 程序是平台相关的二进制文件,只占用磁盘空间.编写完程序代码后,编译为可执行的二进制文件即可. 进程是运行中的程序,占用 CPU.内存等系统资源. 通过 Shell 命令,可 ...

  7. Linux进程管理之task_struct结构

    转载:http://blog.csdn.net/npy_lp/article/details/7335187 内核源码:linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 进程是处 ...

  8. Linux进程管理之task_struct结构体

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

  9. 进程—内存描述符(mm_struct)

    http://blog.csdn.net/qq_26768741/article/details/54375524 前言 上一篇我们谈论了task_struct这个结构体,它被叫做进程描述符,内部成员 ...

随机推荐

  1. logback error 分开存日志

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <property ...

  2. 字符串转LocalTime再转Instant

    LocalTime a= LocalTime.parse("20:13:01"); // LocalTime a= LocalTime.now(); System.out.prin ...

  3. java登录验证码 用到spring框架

    转载:https://blog.csdn.net/zqd_java/article/details/53638143 在次大神基础上添加下述js代码即可使用了. //登陆验证 function cha ...

  4. hive 全表全字段对比

    select * from ( select max(t1.source) as source ,t1.c1 ,t1.c2 ,t1.c3 ,count(*) as cnt from ( as sour ...

  5. C# 连接 Exchange 发送邮件

    C#连接Exchange 发送邮件代码如下 /// <summary> /// exchange群发邮件 /// </summary> /// <param name=& ...

  6. UGUI 用手柄或者键盘控制选择Scroll View中的游戏对象时,滚动条跟着移动

    原预制体以及脚本的下载地址:https://download.csdn.net/download/qq_15017279/10404010 1.新建一个Scroll View,删掉横向的滚动条,并且把 ...

  7. Magnum DevStack安装

    local.conf文件 [[local|localrc]]DATABASE_PASSWORD=123456RABBIT_PASSWORD=123456SERVICE_TOKEN=123456SERV ...

  8. socket编程(一)

    因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...

  9. CentOS 7 更新软件源和系统

    [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  10. RadControl使用相同的Theme

    我們僅須對兩個地方加一些程式碼,就可使所有的RadControl擁用相的Theme,如此一下不但可使Ap內布景主題一致,設計者亦不需要對每個控件做字型,顏色,大小等等瑣碎的設計. App.Xaml.c ...