进程Progress描述符:(struct task_struct)(<linnux/sched.h>)

  32位机器上,大约有1.7KB,完整描述一个正在执行的程序。
 
 

任务队列(双向循环链表)

1571475290472
 
 

分配进程描述符

slab分配器:

  linux采用slab分配器分配task_struct结构

  目的:对象复用和缓存着色。

  slab分配器动态生成task_struct,只需在栈底(相对于向下增长的栈)或栈顶(相对于向上增长的栈)创建一个新结构struct thread_info (<asm/thread_info>)

1571550696201
 
 
 

进程描述符成员

  PID最大值默认为32768(short int 短整形的最大值<linux/threads.h>)可通过修改/proc/sys/kernel/pid_max提高上限。

 
current宏查找当前正在运行进程的进程描述符。
 
x86系统中,current把栈指针后13个有效位屏蔽掉,用来计算出thread_info的偏移。
 

current_thread_info():

movl $-8192,%eax
andl %esp,%eax

 
 

进程状态

TASK_RUNNING:

  1. 正在执行
  2. 在运行队列中等待执行

TASK_INTERRUPTIBLE:阻塞(可中断)

TASK_UNINTERRUPTIBLE:阻塞(不可中断)

__TASK_TRACED:被其他进程跟踪的进程

__TASK_STOPPED:进程停止
 
 

1571556447032

 
 

进程家族树

init进程:

  所有进程都是PID为1的init进程的后代

  内核Kernel在系统启动的最后阶段启动init进程。

init进程目的:读取系统的初始化脚本Script,并执行其他的相关程序,最终完成系统启动的整个过程。
 
 

task_struct中记录父子进程

  1. parent指针(指向父进程)
  2. children子进程链表
     
     

陷入内核执行的条件

  1. 系统调用
  2. 异常处理程序