Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的进程。
Linux-进程管理
现代的操作系统提供2种虚拟机制,虚拟处理器和虚拟内存。
进程描述符
进程描述符的存放–PID
内核通过一个唯一的进程标识值(process identification value)或PID来标识每个进程。
PID是一个数,表示为pid_t隐含类型,实际上就是一个int类型。
PID实际上就是系统中允许同时存在的进程的最大数目。
PID的最大默认值为32768(受<linux/thread.h>中所定义PID最大值的限制),可通过/proc/sys/kernel/pid_max来查看
Andorid的进程描述符
PID同样在Android上可以体现到,当你用AS启动调试App,在调试处可以看到这个值。
内核把进程的列表存放在任务队列的双向循环链表中
- 每一项都是类型为 task_struct , 称为进程描述符的结构. 在 <linux/sched.h> 文件中
task_struct 在 32 位机器上, 大约为 1.7KB - 通过 slab 分配器分配 task_struct 结构
- 用 PID 来标识每个进程. 最大值为 32768 (short int 的最大值). PID 存放在进程描述符中. cat /proc/sys/kernel/pid_max
- 进程描述符中的 state 描述了进程的当前状态
- TASK_RUNNING : 这是在用户空间唯一的可能状态
- TASK_INTERRUPTIBLE : 可中断 – 进程正在睡眠(也称为阻塞), 等待某些条件达成. 一旦达成, 内核就会把进程状态设置为运行.
- TASK_UNINTERRUPTIBLE : 不可中断 – 除了就算接收到信号也不会被唤醒或准备投入运行外, 这个状态与可中断状态相同.
- _TASK_TRACED : 被其他进程跟踪. 例如通过 ptrace 对调试程度进行跟踪
- _TASK_STOPPED : 停止. 进程停止执行. 通常是接收到信号: SIGSTOP, SIGTSTP, SIGTTIN, SIGTOU 等.
- 进程家族树. 所有进程都是 PID 为 1 的 init 进程的后代. task_struct 中的 parent 指向父进程. children 指向子进程链表