Unix 什么';独占锁和共享锁的区别是什么?
根据维基百科 共享锁有时称为“读锁”,独占锁有时称为“写锁”Unix 什么';独占锁和共享锁的区别是什么?,unix,locking,Unix,Locking,根据维基百科 共享锁有时称为“读锁”,独占锁有时称为“写锁” 你能解释一下“共享”和“独占”这两个术语背后的原因吗?这很简单。读锁也称为共享锁,因为可以同时读取多个进程。读锁的作用是防止另一进程获取写锁。相反,写操作完成时,写锁禁止所有其他操作,这就是为什么它被描述为独占的原因 所以读锁说“你现在可以读,但是如果你想写,你必须等待”,而写锁说“你必须等待” 我知道你在研究以支持你的研究,但我忍不住要讲课 锁的使用不当是性能问题的主要原因。使用区分读锁和写锁的锁定系统是一个良好的开端,但仔细的设
你能解释一下“共享”和“独占”这两个术语背后的原因吗?这很简单。读锁也称为共享锁,因为可以同时读取多个进程。读锁的作用是防止另一进程获取写锁。相反,写操作完成时,写锁禁止所有其他操作,这就是为什么它被描述为独占的原因 所以读锁说“你现在可以读,但是如果你想写,你必须等待”,而写锁说“你必须等待”
我知道你在研究以支持你的研究,但我忍不住要讲课 锁的使用不当是性能问题的主要原因。使用区分读锁和写锁的锁定系统是一个良好的开端,但仔细的设计有时可以消除大部分锁定需求。例如,会话状态永远不应该保存在每个状态元素的一个全局集合中 事实上,我已经看过了。这是一个非常糟糕的设计,每次对会话状态进行更改时,都会导致装箱和对集合的更改,从而导致长时间的写锁。开销严重削弱了服务器的性能,有效地降低了服务器的单线程行为 简单地将所有会话状态聚合到一个结构中是一个巨大的改进。对会话状态的更改只是更改了会话状态结构成员的值。由于没有其他会话有机会直接引用会话的状态,因此正在更新的唯一集合是会话列表。因此,在session期间完全不需要锁定,仅在开始和结束时,吞吐量增加了3000倍 另一种常见的锁定场景是用户应用程序线程之间共享的资源。大多数现代框架使用消息而不是锁来解决这个问题;当您“转换到UI线程”时,实际上是在对包含函数指针和一些参数(或委托和堆栈帧,具体取决于实现)的消息排队。
- 排他锁或写锁为进程提供写入文件指定部分的排他访问权限。当写入锁定到位时,其他进程无法锁定文件的该部分
- 共享锁或读锁禁止任何其他进程在文件的指定部分请求写锁。但是,其他进程可以请求读锁
更多信息:我写下了这个答案,因为我认为这将是一个有趣(且合适)的类比: 把一个可锁的物体想象成教室里的黑板(可锁的),教室里有一个老师(作家)和许多学生(读者) 当老师在黑板上写东西(独占锁)时:
在数据库方面也是如此。根据Oracle文档 独占锁定模式阻止共享关联的资源。此锁定模式用于修改数据。独占锁定资源的第一个事务是唯一可以更改资源的事务,直到释放独占锁定为止 共享锁定模式允许共享关联的资源,具体取决于所涉及的操作。读取数据的多个用户可以共享数据,持有共享锁以防止写入者(需要独占锁)并发访问。可以执行多个事务
获取同一资源上的共享锁。非常好的解释。然而,PO询问“共享”和“独占”面额的起源,而不是对therms本身的解释。这是“如果已经存在一个或多个共享锁,则无法获得独占锁”吗?可重入写块的中间层?我认为写锁可以在任何时候获得,否则由于连续读取可能会发生写饥饿。@KanagaveluSugumar,是的,这是真的。当另一个实体已经持有同一对象的读锁时,您就无法获得写锁。这就是读写锁的全部意义。如果你碰巧在别人阅读时覆盖了某个内容,那么他们会读什么?我不知道您为什么特别选择“重入”读写锁,但重入意味着重入锁的所有者可以再次“锁定()”它,并且在第一次调用之后所有后续的
lock()
调用将立即成功返回。i、 你可以成功地锁定你已经拥有的东西。你还提到“我认为写锁可以在任何时候获得,否则由于持续读取可能会发生写饥饿”——这根本不可能。当其他实体已持有读/写锁时,无法获取写锁。可能发生的情况是,如果多个实体已经在等待锁定一个对象,那么当锁选择下一个获得锁的人时(当锁被当前所有者解锁时),等待的编写器将优先于等待的读取器。这是关于你的,谢谢你!我选择了重新进入