操作系统 - 进程同步中的读写锁
读写锁
操作系统中的读写者问题是关于管理对共享数据的访问。它允许多个 reader 同时访问数据,但确保同一时间只有一个 writer 可以写入,且在写入过程中不允许任何 reader 读取。
这种方法有助于解决并发编程中的基本问题:为共享资源提供安全的访问。
阐释读写者问题对于展示如何使用数据结构进行同步以保证一致性和效率非常重要。读写者问题描述了多个进程或线程可能需要访问公共资源(如数据库或文件)的场景。
这种场景突显了有效同步机制的必要性,以平衡 reader 和 writer 对资源的访问需求。
Reader 和 Writer 的概念
读写者问题是操作系统中的一个同步问题,用于管理多个线程或进程对共享数据的访问。
Readers: 仅从数据库读取的进程。
Writers: 读取并修改(写入)数据库的进程。
同步中的挑战
以下是读写者问题在同步中面临的主要挑战。
并发访问: 多个进程可能想要读取或同时读写数据库。
Reader-Reader 访问: 如果两个 reader 同时访问共享数据,没有问题,因为它们仅读取。
Writer 访问: 当一个 writer 和另一个进程同时访问数据库时会出现问题。
如果一个 writer 正在更新数据而一个 reader 正在读取,reader 可能读取到不一致的数据。
如果两个 writer 同时访问数据库,可能会发生冲突的更改。
读写者问题的解决方案
读写者问题有三种基本解决方案:
Writer 优先: 优先考虑 writer。这意味着 writer 到达时,即使有 reader 正在访问资源,它们也可以继续执行操作。
目标: writer 对数据库具有独占访问权,即当一个 writer 正在访问数据时,没有其他进程可以访问。
Reader 优先: 优先考虑 reader。这意味着 writer 必须等待 reader 完成读取。只有在没有 reader 访问资源时,writer 才能访问资源。
使用 Semaphore 进行同步
Semaphore 解决了读写者问题,我们使用两个 semaphore 和一个整数变量:
Mutex semaphore: 用于在更新 readcount 变量时的互斥。
Write Semaphore: 初始化为 1,由 reader 和 writer 共享,用于管理写入访问。
Readcount 变量: 一个普通的整数变量,用于跟踪当前访问数据库的 reader 数量。
Writer 进程
Writer 进程请求 write semaphore,如果可用,它将获得访问权限执行写入操作。在此期间,没有其他进程(无论是 reader 还是另一个 writer)可以在 writer 持有 semaphore 时访问数据库。一旦写入操作完成,writer 会 signal semaphore,释放它供其他进程使用。
Reader Process
读取进程遵循一系列步骤来安全访问共享数据库。
在 Mutex semaphore 上等待:在更新 readcount 变量时,没有其他进程修改它。
递增 readcount:每个读取进程在开始读取时递增此变量。
第一个 Reader:如果 readcount 等于 1,它会在 write semaphore 上等待,以防止 writer 在读取时访问数据库。
信号 Mutex Semaphore:更新 readcount 后,读取进程信号 mutex semaphore,允许其他读取进程递增 readcount 并进入临界区。
读取操作:读取进程读取数据。
递减 readcount:读取进程完成时,递减 readcount。
最后一个 Reader:如果 readcount 等于 0,读取进程信号 write semaphore,允许 writer 访问数据库。
Problem Parameters
Reader-Writer 进程的问题参数 −
一组数据在多个进程之间共享。
一旦 writer 准备好,它就执行写入操作。同一时间只有一个 writer 可以写入。
如果一个进程正在写入,没有其他进程可以读取。
如果至少有一个 reader 在读取,没有其他进程可以写入。
Reader 不能写入,只能读取。
Main Features of Solution
以下是该解决方案的关键概念 −
Writer 访问:只有在没有其他 reader 或 writer 使用数据库时,writer 才能访问它,由 write semaphore 保证。
Reader 优先级:优先考虑 reader。如果一个 reader 正在访问数据库,没有 writer 可以在所有 reader 完成前修改它。
并发性:多个 reader 可以同时访问数据库而无问题,但当 writer 访问数据库时,需要独占访问。
Conclusion
该解决方案通过使用 semaphore 实现了 reader 和 writer 之间的同步,有效防止了竞争条件,并确保共享数据库中数据的 consistency。