linux - 许多进程的缓存锁定?

标签 linux caching locking flock

我有一个脚本 1) 经常运行 2) 由很多不同的进程运行 3) 需要很长时间。

更新:需要很长时间的事情是测试谁的结果对于每个过程都是一样的。完全多余。

我认为是时候做一些缓存了,但我担心潜在的种族、冲突、腐败、时间漩涡不稳定和鸡。

复杂性来自于任何进程都可以更新缓存以及读取缓存,所以我必须知道如何处理所有这些组合。

在我看来,这似乎是比我更聪明、受过更多教育的人可能已经发现的东西。

无论如何,为了让这个问题更具体,这是我到目前为止的想法。我在脑海中使用 flock,不确定这是否是个好主意。

  • 如果缓存是新的,读取它并离开
  • 如果缓存过时
    • 尝试获取写锁
      • 如果我得到锁,进行测试并更新缓存
      • 如果我没有获得锁,其他人是否有写锁或读锁?
      • 如果它是共享的,为什么他们要读取陈旧的缓存?我是否忽略它们,进行测试并更新缓存(或者这可能导致它们读取写了一半的缓存……呃……)
      • 如果是排他性的,给他们很短的时间来完成测试并更新缓存。

希望这是有道理的...

最佳答案

这是一个使用 flock(2) 的方案用于并发环境中的文件锁定。 它解释了“safe-cache”的工作原理。

每个缓存文件都有两个伴随文件(WLock 和 RLock)。 除了第一个 (NB WLock),所有的 flock 请求都是阻塞的。

  • 拥有 WLock 可确保有机会生成新的缓存
  • 共享 RLock 确保从缓存文件中安全读取
  • 并拥有独占 RLock 确保安全写入缓存文件

只有一个原因有两个伴随文件,那就是在生成新缓存时, 并且旧缓存不太旧(缓存时间+N未过期)客户端仍然可以使用旧缓存 而不是等待生成缓存。

请对这个方案进行评论,并尽可能使其更简单。

cache locking diagram

关于linux - 许多进程的缓存锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11787567/

相关文章:

c - 在 linux 内核模式下使用 vfs_link

php - 有没有办法使 Yii2 查询缓存记录无效/变脏?

caching - NGINX 缓存代理失败,出现 SSL23_GET_SERVER_HELLO :sslv3 alert handshake failure

spring-boot - 如何找出缓存管理器中是否存在键(org.springframework.cache.CacheManager)

Mysql select for update - 它没有锁定目标行。我如何确保它确实如此?

c++ - 由于段错误导致生产机器上的 C++ 应用程序崩溃

linux - 虚拟机网络困境

php - 获取文件的独占读/写锁以进行原子更新

linux - MONO WCF 自托管服务对在使用 net.tcp 时由对等方重置连接

ios - 如何在 Xcode8 中锁定文件?