读者-写者问题2025 年 4 月 4 日 | 阅读 9 分钟 读者-写者问题是进程同步的经典问题,它涉及到一个文件等数据集,该数据集在同一时间由多个进程共享。在这些不同的进程中,有些是读者——它们只能读取数据集;它们不执行任何更新,有些是写者——它们既可以读取也可以写入数据集。 读者-写者问题用于管理不同读者和写者进程之间的同步,以确保数据集不会出现问题,即不会产生不一致性。 让我们通过一个例子来理解——如果两个或两个以上的读者希望在同一时间访问文件,则不会出现问题。然而,在其他情况下,比如当两个写者或一个读者和一个写者希望在同一时间访问文件时,可能会出现一些问题,因此任务是以这样的方式设计代码:如果一个读者正在阅读,则不允许任何写者在同一时间更新;同样,如果一个写者正在写入,则不允许任何读者在该时间点读取文件;如果一个写者正在更新文件,则不应允许其他写者在同一时间更新文件。但是,多个读者可以同时访问对象。 让我们通过下表了解读写的可能性 表 1
读者和写者的解决方案可以使用二值信号量实现。 我们使用两个二值信号量“write”和“mutex”,其中二值信号量可以定义为 信号量:信号量是 S 中的一个整数变量,除了初始化之外,它只能通过两个标准原子操作——wait 和 signal 访问,其定义如下 从上述 wait 的定义可以清楚地看出,如果 S 的值 <= 0,它将进入无限循环(因为 while 循环后面的分号)。而 signal 的作用是增加 S 的值。 下面的代码将提供读者-写者问题的解决方案,读者和写者进程代码如下 - 读者进程的代码读者进程的代码如下 - 在上述读者代码中,mutex 和 write 是初始值为 1 的信号量,而 readcount 变量的初始值为 0。mutex 和 write 在读者和写者进程代码中是通用的,信号量 mutex 确保互斥,信号量 write 处理写入机制。 readcount 变量表示同时访问文件的读者数量。当变量 readcount 变为 1 时,使用 wait 操作写入信号量,这将使值减 1。这意味着不允许写者再访问文件。完成读取操作后,readcount 减 1。当 readcount 变为 0 时,用于 write 的信号操作允许写者访问文件。 写者进程的代码定义写者进程的代码如下 如果写者希望访问文件,则对 write 信号量执行 wait 操作,这会将 write 减到 0,并且没有其他写者可以访问文件。当访问文件的写者完成写入工作后,对 write 执行信号操作。 让我们看看表 1 中提到的每个案例的证明 案例 1:写入 - 写入 → 不允许。也就是说,当两个或两个以上进程希望写入时,是不允许的。让我们看看我们的代码是否按此工作? 案例 2:读取 - 写入 → 不允许。也就是说,当一个或一个以上进程正在读取文件时,不允许其他进程写入。让我们看看我们的代码是否按此工作? 案例 3:写入 -- 读取 → 不允许。也就是说,如果一个进程正在写入文件,则不允许其他进程读取。让我们看看我们的代码是否按此工作? 案例 4:读取 - 读取 → 允许。也就是说,当一个进程正在读取文件,而另一个或多个进程希望读取时,它们都被允许,即读取 - 读取不是互斥的。让我们看看我们的代码是否按此工作? 下一个主题戴尔操作系统 |
什么是 Windows 10 ISO 文件? ISO 文件通常称为 ISO 映像文件,是计算机上 CD 或 DVD 镜像的存储格式之一。Windows 10 ISO 文件是 Windows 10 操作系统的映像文件,我们可以使用它来……
阅读 6 分钟
一台计算机有足够的物理内存,但我们需要更多,所以我们大部分时间都在将一些内存交换到磁盘上。交换空间是硬盘上的一个空间,它替代了物理内存。它被用作虚拟内存,...
阅读 8 分钟
引言 分布式系统中有许多进程通过网络进行交互和共享资源。最广为人知的问题是死锁,即一组进程在等待其他进程所持有的资源时,无助地相互阻塞,无限期地停滞。这些情况由...检测。
阅读 6 分钟
在当今快节奏的数字世界中,用户期望计算机和设备能够无缝地执行多项任务——无论是边浏览网页边播放音乐,还是在后台下载文件,或是同时运行多个应用程序。操作系统高效处理此类任务的能力取决于……
阅读 13 分钟
操作系统启动中冷启动和热启动的区别 启动是在用户按下电源按钮时加载和执行操作系统的一个操作过程。它也称为启动、重启或引导。启动指令...
5 分钟阅读
操作系统提供键盘快捷键以实现快速导航和功能。它与一个或多个按键组合一起使用。不使用快捷键,鼠标可能需要更多单击和更长时间才能完成任务。您无需学习操作系统的每个快捷键...
阅读 6 分钟
桌面环境是一种桌面模型实现。它由在操作系统上运行的程序组成,并且还共享通用的图形用户界面。Cinnamon和MATE是两种主要的桌面环境示例。在本文中,您将了解区别...
阅读 6 分钟
五态进程模型是从二态模型发展而来的。如果所有处于非运行状态的进程都已准备好运行,则二态模型是有效的;然而,事实并非总是如此。处于非运行状态的某些进程可能正在等待事件或执行...
阅读 4 分钟
访问令牌是一个描述进程或线程安全上下文的对象。令牌用于做出安全决策并存储有关某个系统实体的防篡改信息。虽然令牌通常仅用于表示安全信息,但它可以保存...
5 分钟阅读
fork() 和 vfork() 之间的区别 fork() 和 vfork() 都是系统调用,它们创建一个与 fork() 或 vfork() 调用进程相似的新进程。fork() 的使用允许两个进程同时执行。另一方面,vfork() 系统...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India