并发需求

  • 两个层次的并发:
    1. 应用层并发:应用程序利用 OS 支持的进程/线程,安排可并行事务并发执行
    2. 操作系统内核层并发: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 无约束,可任意并发