互斥与同步机制及其算法

操作系统中的同步互斥机制

进程同步与互斥是为了解决并发进程访问共享资源时可能出现的数据不一致问题。

实现同步互斥的机制可以分为两大类:软件实现方法硬件实现方法

1. 软件实现方法

软件方法完全依赖于程序代码逻辑来解决同步互斥问题。主要包括以下几种尝试性算法:

a. 单标志法(轮换法)

b. 双标志先检查法(尝试法)

c. 双标志后检查法(礼让法)

d. Peterson 算法(Peterson's Algorithm)

2. 硬件实现方法

硬件方法利用特殊的机器指令来提供原子操作,从而实现同步互斥。

a. TestAndSet 指令(TSL指令)

b. Swap 指令(XCHG指令)

3. 高级抽象机制

为了克服上述低级机制的缺点(如忙等待、易用性差等),操作系统提供了更高级的同步互斥机制。

a. 信号量机制(Semaphore)

b. 管程机制(Monitor)


各种同步互斥机制的异同点

特性/机制 软件实现方法(如 Peterson) 硬件实现方法(如 TSL/Swap) 信号量机制(Semaphore) 管程机制(Monitor)
原子性 非原子性(Peterson 算法通过逻辑保证) 原子性(依赖硬件指令) 原子性(P/V 操作由操作系统保证) 原子性(管程入口处的互斥锁和条件变量操作)
互斥实现 复杂,易错 相对简单,直接 简单,灵活 自动实现,封装在内部
同步实现 难以实现复杂同步 无法直接实现复杂同步 强大且灵活 强大且直观(通过条件变量)
忙等待 存在忙等待 存在忙等待 避免忙等待(进程可阻塞) 避免忙等待(进程可阻塞)
饥饿问题 可能出现 可能出现 可能出现 相对不易出现(由管程实现决定)
死锁问题 可能出现 可能出现 易出现(P/V 顺序错误) 不易出现(封装性高)
易用性/安全性 较差,容易出错 较差,容易出错 中等,P/V 操作分散,易误用 ,封装性好,不易出错
适用范围 通常限于少量进程 适用于多进程 适用于多进程 适用于多进程
抽象层次 低级 低级 中级 高级
系统支持 无需操作系统支持 依赖底层硬件指令支持 需要操作系统内核支持 需要编程语言/编译器或操作系统支持

异同点总结:

相同点:

不同点:

  1. 抽象层次

    • 软件方法和硬件方法属于低级原语,它们直接操作共享变量或利用原子指令,但实现复杂同步逻辑较为困难,且容易出错。

    • 信号量中级原语,通过 P/V 操作实现阻塞与唤醒,大大简化了同步互斥的实现,但其操作分散,仍需程序员谨慎使用。

    • 管程高级抽象机制,它将共享数据、操作以及同步机制封装在一个模块中,由编译器或运行时环境保证互斥,极大地提高了易用性和安全性。

  2. 是否避免忙等待

    • 软件方法和硬件方法通常会导致忙等待,即等待进程会持续占用 CPU 循环检测条件。

    • 信号量和管程则可以使等待进程进入阻塞状态,释放 CPU,避免忙等待,提高了 CPU 利用率。

  3. 安全性与易用性

    • 软件方法和硬件方法需要程序员非常小心地处理共享变量,容易因编程错误导致死锁、饥饿或破坏互斥。

    • 信号量虽然比低级方法好用,但 P/V 操作的顺序和配对仍然需要程序员严格控制,否则极易引发问题。

    • 管程通过其内部的自动互斥和条件变量机制,大大降低了程序员犯错的可能性,提高了程序的健壮性和易用性。可以说,管程是目前公认的更优的同步互斥解决方案


考点分析与命题方式

历年命题方式与陷阱: