进程与线程

进程与线程

一个进程(Process)是计算机中正在运行的程序的实例,它由以下核心组成部分构成:

  1. PCB(Process Control Block,进程控制块)
  • 进程ID(PID)、父进程ID(PPID)
  • 进程状态(运行、就绪、阻塞等)
  1. 代码段(Text Segment)
  2. 数据段(Data Segment)
  • 程序执行的实体。没有代码,进程无法运行;没有数据,代码无法处理信息。

PCB内主要有什么

  1. 进程标识信息:PID
  2. 进程状态信息:运行(Running)、就绪(Ready)、阻塞(Blocked)等
  3. CPU上下文信息(状态):(进程被切换时,保存当前CPU状态以便恢复)PC、SP

进程的状态转换

  • 区分就绪态与阻塞态
  • 主动/被动的转换

进程的创建

  1. 分配PID与PCB

    • 操作系统为新进程分配唯一的进程ID(PID)和空的进程控制块(PCB)。
    • 例子:在终端输入 ls 命令时,Shell(父进程)调用 fork() 创建子进程,内核为其分配PCB。
  2. 分配资源

    • 子进程继承父进程的资源(如文件描述符、内存映射),或从操作系统申请新资源。
    • 例子:子进程通过 exec() 加载 ls 程序时,需申请内存存储代码和数据。
  3. 初始化PCB

    • 设置进程状态(就绪)、程序计数器(PC)、堆栈指针等。
  4. 加入就绪队列

    • 新进程被放入调度队列等待CPU分配。

进程终止

终止原因:

  • 正常终止:进程执行完毕(如 main() 返回)。
  • 异常终止:段错误(访问非法内存)、除零错误、被 kill 命令杀死。

终止步骤:

  1. 触发终止:exit()、信号、父进程终止
  2. 释放资源:内存、文件、锁、设备等
  3. 更新 PCB:状态改为 Zombie,记录退出状态
  4. 通知父进程:父进程 wait() 或由 init 接管
  5. 删除 PCB

进程阻塞与唤醒

1. 阻塞(主动行为)

  • 触发条件:进程主动调用阻塞操作(如 read() 等待I/O)。
  • 过程
    1. 进程从运行态转为阻塞态,PCB加入等待队列。
    2. CPU调度其他就绪进程。

2. 唤醒(被动行为)

  • 触发条件:外部事件发生(如I/O完成、信号量释放)。
  • 过程
    1. 内核将对应PCB从阻塞队列移到就绪队列。
    2. 进程重新等待调度。

例子

  • 当磁盘I/O完成时,硬件触发中断,操作系统唤醒等待该I/O的进程。

易错点

  1. 阻塞是主动的,唤醒是被动的

    • 阻塞是进程主动请求等待(如调用 sleep()),而唤醒依赖外部事件(如定时器中断)。
  2. 资源泄漏

    • 终止进程时若未释放资源(如内存泄漏),会导致系统资源耗尽。
  3. 进程调度负责分配CPU资源,而非进程创建
    进程调度(Process Scheduling)是操作系统内核的核心功能之一,负责从多个就绪(Ready)的进程中选择一个进程分配CPU资源,并控制进程状态的切换。其本质是解决CPU资源的分配问题,确保系统高效、公平地运行多个程序。

进程之间的通信

  1. 共享存储:原理:多个进程访问同一块内存区域,直接读写数据,速度最快(无需内核介入)。
  2. 消息传递:原理:进程通过发送/接收消息(数据包(HTTP))通信,由内核中转。
  3. 管道通信:管道是一种特殊的文件:又称pipe文件。管道不满即可发、管道不空即可收

如何理解“进程获得处理器运行是通过调度得到的”?

这句话的核心含义是:在操作系统中,进程不能直接占用 CPU,而是必须由操作系统的调度程序(Scheduler)决定哪个进程可以运行、何时运行以及运行多久。

并发程序的执行速度与调度策略的关系

并发程序的执行速度并非单纯由CPU性能决定,调度策略的合理配置(如时间片(短时间片提高响应速度,长时间片提高吞吐量。)、算法选择(FCFS适合长任务,RR适合交互式任务。))同样关键

高级调度

高级调度的核心功能是 将作业从磁盘加载到内存并创建进程,因此 一定会导致新进程创建

为什么分时操作系统中,就绪态的任务最多?

分时操作系统的主要目标是:公平共享CPU时间(每个任务轮流执行一小段时间)。

实时操作系统阻塞态任务最多

因为:

  1. 任务多为事件/周期驱动,大部分时间在等待触发条件。
  2. 高优先级任务抢占CPU,低优先级任务长期阻塞。
  3. 资源同步机制(如锁、信号量)强制任务阻塞等待。

线程

404
进程-资源分配的基本单位
线程-现代OS中CPU调度和分派的最小单位

系统线程 vs 用户线程

404

  • 用系统线程:
    需要真并发(如视频编码、科学计算)。
    线程可能频繁阻塞(如网络服务)。

  • 用用户线程:
    轻量级任务(如快速切换的小任务)。
    语言或环境限制(如Python的GIL)。