第八章:并发# 引言 本章导读 线程定义 同步互斥 实践体验 本章代码树 本章代码导读 用户态的线程管理 本节导读 用户态多线程应用 多线程的基本执行环境 线程的结构与执行状态 线程管理运行时初始化 线程创建 线程切换 开始执行 内核态的线程管理 本节导读 线程概念 通用操作系统多线程应用程序示例 线程模型与重要系统调用 线程创建系统调用 等待子线程系统调用 进程相关的系统调用 应用程序示例 系统调用封装 多线程应用程序 – threads 线程管理的核心数据结构 线程控制块 包含线程的进程控制块 线程与处理器管理结构 线程管理机制的设计与实现 线程创建、线程退出与等待线程结束 线程创建 线程退出 等待线程结束 线程执行中的特权级切换和调度切换 锁机制 本节导读 为什么需要锁 锁的基本思路 用户态软件级方法实现锁 机器指令硬件级方法实现锁 实现锁:原子指令 CAS原子指令和TAS原子指令 RISC-V的AMO指令与LR/SC指令 内核态操作系统级方法实现锁 实现锁:yield系统调用 实现锁:mutex系统调用 使用mutex系统调用 mutex系统调用的实现 信号量机制 本节导读 信号量的起源和基本思路 实现信号量 使用semaphore系统调用 实现semaphore系统调用 条件变量机制 本节导读 条件变量的基本思路 实现条件变量 使用condvar系统调用 实现condvar系统调用 并发中的问题 本节导读 互斥缺陷 同步缺陷 死锁缺陷 死锁预防 死锁避免 银行家算法的数据结构 银行家算法的步骤 安全性检查算法 练习 课后练习 编程题 问答题 实验练习 编程作业 银行家算法——分数更新 实现 eventfd 实验要求 问答作业 实验练习的提交报告要求 练习参考答案 课后练习 编程题 问答题