|
| 1 | +# 操作系统 |
| 2 | + |
| 3 | +!!! abstract "课程概述" |
| 4 | + 本笔记涵盖操作系统的核心概念,包括进程管理、内存管理、文件系统等重要内容。 |
| 5 | + |
| 6 | +## 2. 进程与线程 |
| 7 | + |
| 8 | +### 2.1 进程的基本概念 |
| 9 | + |
| 10 | +!!! abstract "进程的引入目的" |
| 11 | + 为了实现系统的**并发性**和**共享性**,操作系统引入了进程的概念。 |
| 12 | + |
| 13 | +#### 进程的组成 |
| 14 | + |
| 15 | +!!! info "进程实体的三个组成部分" |
| 16 | + 1. **PCB(Process Control Block)**:进程控制块 |
| 17 | + 2. **程序段**:可执行的程序代码 |
| 18 | + 3. **数据段**:程序运行时的相关数据 |
| 19 | + |
| 20 | + 这三部分共同构成**进程实体**,创建进程实质上就是创建PCB。 |
| 21 | + |
| 22 | +#### 进程的定义 |
| 23 | + |
| 24 | +!!! note "进程的几种典型定义" |
| 25 | + - **实例定义**:正在执行程序的实例 |
| 26 | + - **加载定义**:程序及其数据从硬盘加载到内存后在CPU上的执行过程 |
| 27 | + - **功能定义**:具有独立功能的程序在一个数据集合上运行的过程 |
| 28 | + |
| 29 | +!!! important "进程的本质" |
| 30 | + 进程是**进程实体的运行过程**,是系统进行**资源分配和调度**的一个独立单位。 |
| 31 | + |
| 32 | + 这里的"系统资源"主要指**时间资源**(时间片)。 |
| 33 | + |
| 34 | +#### 进程的特征 |
| 35 | + |
| 36 | +!!! tip "进程的四个基本特征" |
| 37 | + |
| 38 | + **1. 动态性(Dynamic)** |
| 39 | + - 进程是程序的一次执行过程,有创建、执行、消亡的过程 |
| 40 | + - 程序是静态的,进程是动态的 |
| 41 | + |
| 42 | + **2. 并发性(Concurrency)** |
| 43 | + - 多个进程可以在同一时间段内执行 |
| 44 | + - 宏观上同时进行,微观上交替执行 |
| 45 | + |
| 46 | + **3. 独立性(Independence)** |
| 47 | + - 进程是能独立运行、独立获得资源、独立接受调度的基本单位 |
| 48 | + - 不同进程的工作不会相互干扰 |
| 49 | + |
| 50 | + **4. 异步性(Asynchronism)** |
| 51 | + - 各进程按各自独立的、不可预知的速度向前推进 |
| 52 | + - 操作系统必须提供"进程同步机制"来解决异步问题 |
| 53 | + |
| 54 | +### 2.2 进程状态与转换 |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | +!!! info "进程的基本状态" |
| 59 | + |
| 60 | + **运行态(Running)** |
| 61 | + - 进程正在CPU上执行 |
| 62 | + - 单核系统中,同一时刻只有一个进程处于运行态 |
| 63 | + |
| 64 | + **就绪态(Ready)** |
| 65 | + - 进程已获得除CPU外的所有必需资源 |
| 66 | + - 等待分配CPU时间片 |
| 67 | + |
| 68 | + **阻塞态(Blocked/Waiting)** |
| 69 | + - 进程因等待某个事件而暂停执行 |
| 70 | + - 即使给它CPU也无法运行 |
| 71 | + |
| 72 | +!!! tip "状态转换条件" |
| 73 | + - **就绪 → 运行**:获得CPU时间片 |
| 74 | + - **运行 → 就绪**:时间片用完 |
| 75 | + - **运行 → 阻塞**:等待I/O或其他事件 |
| 76 | + - **阻塞 → 就绪**:等待的事件发生 |
| 77 | + |
| 78 | +### 2.3 进程控制块(PCB) |
| 79 | + |
| 80 | +!!! abstract "PCB的重要作用" |
| 81 | + PCB是操作系统用于管理和控制进程的数据结构,包含了进程的所有相关信息。 |
| 82 | + |
| 83 | +**PCB的主要内容:** |
| 84 | +- **进程标识信息**:PID、用户ID等 |
| 85 | +- **处理机状态信息**:寄存器值、程序计数器等 |
| 86 | +- **进程调度信息**:进程状态、优先级等 |
| 87 | +- **进程控制信息**:程序入口地址、资源清单等 |
| 88 | + |
| 89 | +### 2.4 信号机制 |
| 90 | + |
| 91 | +!!! abstract "信号的概念" |
| 92 | + 信号是Unix/Linux系统中进程间通信的一种方式,用于通知进程发生了某个事件。 |
| 93 | + |
| 94 | +#### 信号的特点 |
| 95 | + |
| 96 | +!!! note "信号处理特点" |
| 97 | + - **pending**:信号已产生但尚未被处理 |
| 98 | + - **blocked**:信号被暂时阻塞,不会立即处理 |
| 99 | + - **优先级**:程序号小的信号优先级高 |
| 100 | + - **信号丢弃**:同类型的后续信号可能被丢弃 |
| 101 | + |
| 102 | +#### 信号相关系统调用 |
| 103 | + |
| 104 | +!!! example "kill系统调用" |
| 105 | + ```c |
| 106 | + int kill(pid_t pid, int sig); |
| 107 | + ``` |
| 108 | + - 向指定进程发送信号 |
| 109 | + - pid:目标进程ID |
| 110 | + - sig:信号编号 |
| 111 | + |
| 112 | +!!! tip "信号处理时机" |
| 113 | + - **内核态转用户态**时会检查是否有待处理信号 |
| 114 | + - 信号可以作为**异常处理的配套机制** |
| 115 | + |
| 116 | +#### 常见信号类型 |
| 117 | + |
| 118 | +参考CSAPP和man pages中的信号表,了解各种信号的含义和用途。 |
| 119 | + |
| 120 | +### 2.5 线程的引入 |
| 121 | + |
| 122 | +!!! abstract "为什么引入线程" |
| 123 | + 为了在进程内部实现更细粒度的并发,提高系统的并发性能。 |
| 124 | + |
| 125 | +#### 进程与线程的关系 |
| 126 | + |
| 127 | +!!! important "资源分配与调度的分离" |
| 128 | + - **进程**:资源分配的基本单位 |
| 129 | + - **线程**:CPU调度的基本单位 |
| 130 | + - **线程并发**:在同一进程内实现多线程并发执行 |
| 131 | + |
| 132 | +#### 线程的优势 |
| 133 | + |
| 134 | +!!! tip "线程的特点" |
| 135 | + |
| 136 | + **1. 切换开销小** |
| 137 | + - 线程切换不需要CPU状态切换 |
| 138 | + - 同一进程内的线程共享地址空间 |
| 139 | + |
| 140 | + **2. 资源共享** |
| 141 | + - 同一进程内的线程共享内存、文件等资源 |
| 142 | + - 通信更加便捷 |
| 143 | + |
| 144 | + **3. 创建销毁快** |
| 145 | + - 线程的创建和销毁比进程更快 |
| 146 | + |
| 147 | +#### 线程的分类 |
| 148 | + |
| 149 | +!!! note "用户级线程 vs 内核级线程" |
| 150 | + |
| 151 | + **用户级线程(User-level Thread)** |
| 152 | + - 由用户程序负责管理,而非操作系统 |
| 153 | + - 操作系统感知不到用户级线程的存在 |
| 154 | + - 切换速度快,但无法充分利用多核 |
| 155 | + |
| 156 | + **内核级线程(Kernel-level Thread)** |
| 157 | + - 由操作系统内核直接管理 |
| 158 | + - 可以充分利用多核处理器 |
| 159 | + - 切换开销相对较大 |
| 160 | + |
| 161 | +!!! warning "用户级线程的限制" |
| 162 | + - 一个用户级线程阻塞会导致整个进程阻塞 |
| 163 | + - 无法在多核系统上并行执行 |
| 164 | + - 调度完全依赖于用户程序的实现 |
| 165 | + |
| 166 | + |
0 commit comments