进程
- 进程
- 分配系统资源的实体(CPU、内存等)
- 创建时,子进程拷贝父进程的地址空间
- 轻量级进程
- 用于实现线程
- 与进程相比,轻量级线程共享一些资源(地址空间,打开的文件等)
- 线程
- 系统调度的最小单位
进程描述符
进程描述符
- 包含进程的优先级、状态、地址空间等信息(与进程相关的所有信息)
- 包含进程的优先级、状态、地址空间等信息(与进程相关的所有信息)
进程状态:在进程标识符的state字段中
- 可运行状态(TASK_RUNNING)
- 要么在CPU上执行,要么准备执行
- 可中断的等待状态(TASK_INTERRUPTIBLE)
- 进程被挂起,直到某个条件为真。(硬件中断、系统资源可用、信号等)
- 不可中断的等待状态(TASK_UNINTERRUPTIBLE)
- 信号不能改变进程状态
- 暂停状态
- 跟踪状态
- 僵死状态
- 进程已终止,但父进程未发布wait系统调用,导致内核不能丢弃子进程的进程描述符中的数据
- 僵死撤销状态
- 可运行状态(TASK_RUNNING)
进程标识
- PID: 进程标识符,存放在进程描述符的PID字段中
- 如何从进程的PID快速找到进程的描述符指针(很常用,如kill)
- thread_info结构与内核态堆栈放在一起,内核可以通过esp寄存器的值获得当前在CPU上正在运行进程的thread_info,thread_info指向进程描述符
- pidhash:PID与进程描述符指针的Hash表
- thread_info结构与内核态堆栈放在一起,内核可以通过esp寄存器的值获得当前在CPU上正在运行进程的thread_info,thread_info指向进程描述符
- 进程链表
- 双向链表,把所有进程描述符链接起来
- TASK_RUNNING状态的进程链表
- 所有可运行的进程放在该链表中
- 链表不按优先级排列,导致调度时需要扫描整个链表,找出优先级最高的进程
- Linux 2.6: 每种优先权对应一个不同的链表
进程切换
- 硬件上下文
- 进程恢复执行前必须装入寄存器的一组数据
- 一部分存放在任务状态段(TSS),剩余部分存放在内核态堆栈
- 进程切换只发生在内核态
- 进程切换
- 切换页全局目录,安装新的地址空间
- 切换内核态堆栈和硬件上下文