生命周期
进程控制块
进程类型
顺序进程
Sequential Process,即“单线程”进程 (single-threaded process),按照顺序,逐个完成任务。
- 资源效率低:一个进程一次只能处理一个任务
- 开销成本 (Overhead Cost) 高:: 创建新进程需要处理器使用资源初始化许多数据结构
内存空间组织
- 堆栈帧 (Stack frame) 是函数调用时创建的一种数据结构,用于存储函数的局部变量、参数和其他与函数执行相关的信息。
- 运行时堆栈 (Runtime stack) 是一个嵌套的堆栈帧结构,用于跟踪程序在执行过程中的函数调用关系和执行状态。每当一个函数被调用时,它的堆栈帧会被推入运行时堆栈的顶部。当函数执行完毕后,它的堆栈帧会被从运行时堆栈中弹出,控制流程返回到调用该函数的位置。
创建进程
参考 Lab 4
- 父进程可以通过
fork()
创建子进程的 - 在父进程中返回子进程的 PID,返回值是负数则表示创建子进程失败
- 在子进程中返回 0
- 在子进程中获取自己实际的 PID 需要通过调用
getpid()
来获取
在成功创建子进程后,
fork()
系统调用会返回两次- 通常情况下,在子进程调用
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
- ☑️ 线程的创建、销毁和切换等操作都在用户空间完成,不需要涉及内核的干预,因此具有较低的开销,可以实现更高的并发性能。
- ❎ 用户空间线程的调度由用户程序控制,因为所有线程都运行在同一个处理器核心上,无法充分利用多核处理器的并行计算能力。
- ❎ 如果一个用户空间线程被阻塞,它会导致整个进程的所有线程都被阻塞,无法继续执行其他任务。
内核空间线程 Kernel Space Threads
- ❎ 开销较大,线程切换的成本较高。
- ☑️ 有更好的灵活性和效率,一个线程的阻塞不会影响其他线程的执行。
- ☑️ 可以在多处理器系统上调度到不同的CPU上,充分利用系统资源,实现大规模并发性。
创建线程
基于 Unix POSIX 接口