36 lines
1.9 KiB
Markdown
36 lines
1.9 KiB
Markdown
# 进程与同步:协作执行的对象
|
||
|
||
> 原书依据:第 13 章,印刷页 91–95,PDF 页 102–106。
|
||
|
||
原书的 `Process` 是 Smalltalk 镜像中的执行活动。不能把这个名字直接解释为操作系统进程,也不能据此推断多核并行。
|
||
|
||
## 四类对象的分工
|
||
|
||
| 类 | 作用 |
|
||
| --- | --- |
|
||
| `Process` | 表示可恢复、可挂起的执行活动 |
|
||
| `ProcessorScheduler` | 按调度策略管理执行活动 |
|
||
| `Delay` | 表示一定时间的等待 |
|
||
| `Semaphore` | 协调活动之间的等待与信号 |
|
||
|
||
块可以作为执行活动的计算内容。是否立即运行、以什么优先级运行,要看创建和启动协议;不要把“创建 Process”和“已经执行完成”混为一谈。
|
||
|
||
## 等待不是空转
|
||
|
||
Delay 表达经过一段时间后再继续。Semaphore 的 `wait` 与 `signal` 表达同步关系。等待活动暂停后,其他可运行活动可以继续推进;反复检查共享变量的循环则可能消耗执行时间。
|
||
|
||
```text
|
||
消费者:等待信号 → 检查共享状态 → 取出结果
|
||
生产者:准备结果 → 更新共享状态 → 发出信号
|
||
```
|
||
|
||
这是一张概念顺序图,不是可直接运行的队列实现。仅有信号量不代表共享集合访问自动安全,还要定义互斥、空队列、重复信号和退出条件。
|
||
|
||
## 阅读调度代码的顺序
|
||
|
||
先找创建与启动位置,再找可能挂起的位置,最后沿恢复路径检查共享状态。重点记录“此处继续执行时,其他活动可能改过什么”。原书的优先级说明属于该系统调度模型,不是跨实现的性能保证。
|
||
|
||
## 思考题
|
||
|
||
如果发送信号后才写入结果,消费者恢复时能否看见完整状态?这取决于调度与同步保证;设计时应先完成状态转换,再通过约定的同步协议通知。研究时也要核对目标 VM 的具体行为。本教程未运行并发或调度测试。
|