进程

进程

  • 进程
    • 分配系统资源的实体(CPU、内存等)
    • 创建时,子进程拷贝父进程的地址空间
  • 轻量级进程
    • 用于实现线程
    • 与进程相比,轻量级线程共享一些资源(地址空间,打开的文件等)
  • 线程
    • 系统调度的最小单位

进程描述符

  • 进程描述符

    • 包含进程的优先级、状态、地址空间等信息(与进程相关的所有信息)
  • 进程状态:在进程标识符的state字段中

    • 可运行状态(TASK_RUNNING)
      • 要么在CPU上执行,要么准备执行
    • 可中断的等待状态(TASK_INTERRUPTIBLE)
      • 进程被挂起,直到某个条件为真。(硬件中断、系统资源可用、信号等)
    • 不可中断的等待状态(TASK_UNINTERRUPTIBLE)
      • 信号不能改变进程状态
    • 暂停状态
    • 跟踪状态
    • 僵死状态
      • 进程已终止,但父进程未发布wait系统调用,导致内核不能丢弃子进程的进程描述符中的数据
    • 僵死撤销状态
  • 进程标识

    • PID: 进程标识符,存放在进程描述符的PID字段中
    • 如何从进程的PID快速找到进程的描述符指针(很常用,如kill)
      • thread_info结构与内核态堆栈放在一起,内核可以通过esp寄存器的值获得当前在CPU上正在运行进程的thread_info,thread_info指向进程描述符
      • pidhash:PID与进程描述符指针的Hash表
    • 进程链表
      • 双向链表,把所有进程描述符链接起来
    • TASK_RUNNING状态的进程链表
      • 所有可运行的进程放在该链表中
      • 链表不按优先级排列,导致调度时需要扫描整个链表,找出优先级最高的进程
      • Linux 2.6: 每种优先权对应一个不同的链表

进程切换

  • 硬件上下文
    • 进程恢复执行前必须装入寄存器的一组数据
    • 一部分存放在任务状态段(TSS),剩余部分存放在内核态堆栈
    • 进程切换只发生在内核态
  • 进程切换
    • 切换页全局目录,安装新的地址空间
    • 切换内核态堆栈和硬件上下文

创建进程

  • 传统方法:子进程复制父进程所有资源,需要拷贝父进程的整个地址空间
  • Linux的改进:
    • 写时复制
    • 轻量级进程:允许子进程共享父进程的内存地址空间(页表、打开文件表等)
  • clone, fork, vfork
  • 内核线程
    • 只运行在内核态
    • 进程0:所有进程的祖先进程
    • 进程1:init进程

      撤销进程

  • 进程终止
  • 进程删除
    • 为什么子进程退出后不立刻删除进程的进程描述符?
      • 父进程需要通过子进程的进程描述符知道子进程的状态
    • 僵死状态:已终止进程的进程描述符仍然占据RAM