第二章:进程管理

进程

​ Linux 内核把进程称为任务 (task), 进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间。

进程描述符 task_struct 被定义在sched.h头文件中:include\linux\sched.h

​ 其中重要的成员变量如下:

成员 描述
volatile long state; 进程的状态。 -1 unrunnable, 0 runnable, >0 stopped
void *stack; 指向内核栈
pid_t pid; 全局的进程号
pid_t tgid; 全局的线程组标识符
struct pid_link pids[PIDTYPE_MAX]; 进程号,进程组标识符和会话标识符
struct task_struct __ rcu *real_parent;
struct task_struct __rcu *parent;
real_parent指向真实的父进程。
parent 指向父进程:如果进程被另一个进程(通常是调试器)
使用系统调用ptrace跟踪,那么父进程是跟踪进程,否则和 real_parent相同
char comm[TASK_COMM_LEN]; 进程名称
int prio,static_prio,normal_prio;
unsigned int rt__priority;
unsigned int policy;
调度策略和优先级
cpumask_t cpus_allowed; 允许进程在哪些处理器上运行
struct mm_struct *mm, *active_mm; 指向内存描述符
进程:mm 和 active_mm指向同一个内存描述符
内核线程:mm是空指针,当内核线程运行时, active_mm指向从进程借用的内存描述符
struct fs struct *fs; 文件系统信息,主要是进程的根目录和当前工作目录
struct files_struct *files; 打开文件表
struct nsproxy *nsproxy; 命名空间