进程状态
字数: 0

生命周期

  • 创建(New):进程正在被创建,但还没有被操作系统完全初始化。
  • 阻塞(Blocked):进程等待某个事件的完成发生或等待其他进程释放所需资源等。
  • 就绪(Ready):进程已经分配到了所需的资源,并等待系统分配处理器来执行它。
  • 运行(Running):正在执行的进程。
  • 终止(Terminated):进程已经执行完毕,或者出现了错误导致进程被操作系统终止。
notion image

僵尸进程

进程已经退出了,它不占用任何数据,但还在进程表中保留着相关记录。
如果有大量的僵尸进程堆积在系统中,会导致进程表资源的浪费,从而影响系统的性能。
notion image

进程控制块

Process Control Block,管理进程的数据结构,每个进程都有一个对应的 PCB
notion image

进程标识

  • 进程标识符 (Process Identifier, PID):唯一标识一个进程的数字或字符串

进程状态

  • 进程状态 (Process State):表示进程当前的状态,如运行、就绪、阻塞等
  • 优先级 (Priority):确定进程的调度顺序

进程控制

  • 文件描述符表 (File Descriptor Table)
    • 🔑
      标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stder) 分别具有文件描述符 0、1和 2。其他文件描述符的值在打开文件时由操作系统分配。

进程类型

notion image
notion image

顺序进程

Sequential Process,即“单线程”进程 (single-threaded process),按照顺序,逐个完成任务。
  • 资源效率低:一个进程一次只能处理一个任务
  • 开销成本 (Overhead Cost) 高:: 创建新进程需要处理器使用资源初始化许多数据结构

内存空间组织

  • 堆栈帧 (Stack frame) 是函数调用时创建的一种数据结构,用于存储函数的局部变量、参数和其他与函数执行相关的信息。
  • 运行时堆栈 (Runtime stack) 是一个嵌套的堆栈帧结构,用于跟踪程序在执行过程中的函数调用关系和执行状态。每当一个函数被调用时,它的堆栈帧会被推入运行时堆栈的顶部。当函数执行完毕后,它的堆栈帧会被从运行时堆栈中弹出,控制流程返回到调用该函数的位置。
 
顺序进程的内存空间组织
顺序进程的内存空间组织
 

创建进程

参考 Lab 4
  • 父进程可以通过 fork() 创建子进程的
    • notion image
      在成功创建子进程后,fork() 系统调用会返回两次
    • 在父进程中返回子进程的 PID,返回值是负数则表示创建子进程失败
    • 在子进程中返回 0
      • 在子进程中获取自己实际的 PID 需要通过调用 getpid() 来获取
      notion image
  • 通常情况下,在子进程调用 fork() 之后,会使用 exec() 来执行一个不同的程序。
  • 执行 wait() 之后,操作系统暂停调用进程的执行,回收资源,直到其子进程之一终止
    • 成功时,返回终止子进程的 PID
    • 出错时,返回1

多线程进程

Multi-threaded Process,操作系统并发性的一种实现途径

优点

  • 简化编程模型:Simple mechanism to add concurrency
  • 提高资源利用率:Lightweight on Resources, Quick to Create
  • 提高程序的响应性:Improved responsiveness for applications and ser vers

线程实现方式

用户空间线程 User Space Threads
notion image
notion image
  • ☑️ 线程的创建、销毁和切换等操作都在用户空间完成,不需要涉及内核的干预,因此具有较低的开销,可以实现更高的并发性能。
  • ❎ 用户空间线程的调度由用户程序控制,因为所有线程都运行在同一个处理器核心上,无法充分利用多核处理器的并行计算能力。
  • ❎ 如果一个用户空间线程被阻塞,它会导致整个进程的所有线程都被阻塞,无法继续执行其他任务。
内核空间线程 Kernel Space Threads
notion image
notion image
  • ❎ 开销较大,线程切换的成本较高。
  • ☑️ 有更好的灵活性和效率,一个线程的阻塞不会影响其他线程的执行。
  • ☑️ 可以在多处理器系统上调度到不同的CPU上,充分利用系统资源,实现大规模并发性。
 

创建线程

基于 Unix POSIX 接口
 
 
2023 - 2026