Hacker News 中文摘要

RSS订阅

Unix可原子化操作集(2010) -- Things Unix can do atomically (2010)

文章摘要

这篇文章列举了UNIX类/POSIX兼容操作系统能够原子性执行的操作,这些操作可以作为构建线程安全和多进程安全程序的基础组件,而无需使用互斥锁或读写锁。作者主张尽可能让内核完成更多工作,认为直接使用内核提供的原子操作比自行实现锁机制更可靠高效。文章特别提醒这些操作最好用于本地文件系统,在NFS等网络文件系统上可能失效。

文章总结

UNIX原子操作指南:构建无锁线程安全程序的核心技术

作者 Richard Crowley 发布日期 2010年1月6日

本文系统梳理了类UNIX/POSIX操作系统支持的原子操作,这些技术无需互斥锁或读写锁即可构建线程安全及多进程安全的程序。作者强调应尽可能让内核完成同步工作,既因内核开发者更值得信赖,也因重复锁定本已原子化的操作纯属资源浪费。

【路径名操作】 (注:建议仅用于本地文件系统,NFS挂载可能失效)

  1. 符号链接原子替换
  • mv -T命令可通过rename(2)系统调用原子替换符号链接目标(注意:Mac OS X不适用)
  • ln -Tfs方案因实际调用非原子操作被剔除
  1. 文件锁机制
  • link(oldpath, newpath):通过硬链接创建实现原子文件锁(存在则失败)
  • symlink(oldpath, newpath):扩展至目录锁(注意处理悬垂符号链接)
  • rename(oldpath, newpath):跨文件系统受限的原子重命名
  1. 资源创建锁
  • open(pathname, O_CREAT|O_EXCL):带排他标记的文件创建
  • mkdir(dirname):目录创建天然具备排他性

【文件描述符操作】

  1. 区域文件锁
  • fcntl系列(FSETLK/FSETLKW)实现文件区间锁定
  • 注意Linux强制锁存在竞态条件风险
  1. 文件变更监控
  • 租约机制(F_SETLEASE)通过SIGIO信号通知文件变更
  • 对比非阻塞的F_NOTIFY不适用于同步场景
  1. 内存映射
  • mmap+msync实现进程间内存数据同步

【虚拟内存操作】 - GCC内置原子操作(如_syncfetchandadd)提供内存屏障 - 作为无锁算法的基础设施

作者邀请读者通过邮件或Twitter反馈遗漏项或竞态问题。本文持续更新,重点关注内核原生支持的原子操作,避免用户态锁带来的性能损耗。

(注:原文中个人博客导航、社交媒体链接及项目展示等非技术内容已省略)

评论总结

以下是评论内容的总结:

  1. 支持符号链接(symlink)作为原子操作

    • 观点:使用ln创建符号链接可以实现简单的跨平台锁定系统
    • 引用:
      • "You can use ln atomicity for a simple, portable(ish) locking system" (评论1)
      • "I didn't know about changing symlinks, that could be very useful" (评论4)
  2. 反对符号链接部署方式

    • 观点:不赞成通过修改符号链接来部署新代码
    • 引用:
      • "Sorry, there is zero chance I will ever deploy new code by changing a symlink" (评论2)
  3. 推荐rename()操作

    • 观点:rename()是最简单的基于文件系统的同步方法
    • 引用:
      • "rename() is certainly the easiest to use for any sort of file-system based synchronization" (评论3)
  4. 文件系统事务的局限性

    • 观点:当前系统只能对单个文件进行原子操作,缺乏多对象事务支持
    • 引用:
      • "it only does with one file at a time...What else it does not do is a transaction with multiple objects" (评论6)
      • "POSIX file locking semantics really are broken beyond repair" (评论11)
  5. 新特性的补充

    • 观点:文章遗漏了一些新的原子操作特性
    • 引用:
      • "Missing...mv --exchange aka renameat2+RENAME_EXCHANGE" (评论7)
      • "missing the C11/C++11 atomics that replaced the need for compiler intrinsics" (评论8)
  6. 其他实用工具

    • 观点:介绍了flock命令行工具
    • 引用:
      • "There's also flock, the CLI utility in util-linux" (评论9)
  7. 原子操作的应用扩展

    • 观点:原子能力可以用于构建队列应用
    • 引用:
      • "Anywhere there is atomic capability you can build a queuing application" (评论10)
  8. 文件系统监控需求

    • 观点:寻求更优雅的文件系统操作触发机制
    • 引用:
      • "I want to write a virtual filesystem...Does something like this exist?" (评论5)