并发需求
- 两个层次的并发:
- 应用层并发:应用程序利用 OS 支持的进程/线程,安排可并行事务并发执行
- 操作系统内核层并发:OS 核心程序本身也要尽可能地并发(如设备驱动、文件系统并发访问)
并发编程方法
- 自动并行检测:编译器自动识别可并行执行的部分
- 并发编程语言:语言本身提供并行语法(如并发语句
cobegin/coend)
- 传统语言 + OS API:使用 OS 提供的系统调用(如 fork、pthread_create)实现并发
并发表示法 — parbegin/parend
S1;
parbegin
S2;
S3;
parend
S4;
- 表示 S2 和 S3 可以并发执行,S4 必须在两者都完成后才开始
并发执行特征
- 间断性:执行—暂停—执行,运行过程不可预测
- 失去封闭性:执行结果受并发环境和相对速度的影响
- 不可再现性:多次执行可能得到不同结果(Race Condition)
并发产生的问题
- 同步(Synchronization)— 直接约束:多个进程按一定顺序执行,存在协作关系
- 例如:A 产生数据,B 消费数据,B 必须等待 A 完成
- 互斥(Mutual Exclusion)— 间接约束:多个进程不能同时访问临界资源
任务图示例(S1 / S2 / S3)
S1 → 并发 S2、S3 → S4
- S1 先执行
- S2 和 S3 可并发执行
- S4 必须在 S2 和 S3 都完成后执行
- 同步约束:S1 与 S2/S3 之间为同步关系;S2/S3 无约束,可任意并发