您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

linux文件系统中的“锁”

时间:2021-08-13 11:47:20  来源:  作者:linux技术栈
「技术干货」linux文件系统中的“锁”

 

推荐视频:

手把手带你实现一个Linux内核文件系统:「链接」

c/c++ linux服务器开发学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂

在多进程共享的应用程序中,通过“锁”来对同一个计算资源进行协同是非常常见的做法,无论在单机或多机的系统、数据库、文件系统中,都需要依赖“锁”机制来避免并发访问导致的不确定结果,今天我们就来讲讲文件系统中的“锁”。

首先,文件锁也是一种互斥机制,可确保多个进程以安全的方式读取/写入同一个文件。之所以要对这些多进程业务进行控制,就是因为这些进程的调度是不可预期的,这种时序上的不可预期会对同一个文件资源产生竞争性访问,从而带来预期外的结果。

我们可以看一个例子,以便更好地理解这个问题。

假设我们有一个 account.dat 文件,用于存储帐户余额,其初始值为“200”。并发系统有两个进程来更新这个文件上的余额值:

  1. 进程 A:读取当前值,减去 20,然后将结果保存回文件中。
  2. 进程 B:读取当前值,加 80,然后将结果写回到文件中。

显然,在顺序执行完这两个进程后,我们期望文件具有以下值:200-20 + 80 = 260。

但是,如果进程的执行不是按预期的顺序直径,在以下这种情况下,可能会出现不一样的结果:

  1. 进程 A 读取文件的当前值(200),并准备进行进一步的计算。
  2. 这时,进程 B 读取相同的文件并获得当前余额(200)。
  3. 进程 A 计算 200-20 并将结果 180 保存回文件。
  4. 进程 B 不知道余额已更新。因此,它仍将使用过时的值 200 计算 200 + 80,并将结果 280 写入文件。

结果,account.dat 文件中保存的余额就是 280 而不是预期值 260。

Linux 中的文件锁

像前面提到的,文件锁是一种在多个进程之间限制文件并发访问的机制。它仅允许一个进程在特定时间内访问文件,从而避免更新问题。

我们都知道 rm -rf /在 Linux 中是非常危险的命令。如果我们以 root 用户身份执行该命令,它甚至可以删除正在运行的系统中的所有文件。这是因为 Linux 通常不会自动给打开的文件加锁,所以即使是正在运行的文件,仍然有可能被 rm 命令删除。Linux 支持两种文件锁:协同锁(Advisory lock)和强制锁(Mandatory lock)。

协同锁(Advisory lock)

协同锁定不是强制性锁方案,仅当参与的进程通过显式获取锁进行协作时,它才有效。否则,如果某个进程根本不知道锁,则这个协同锁会被忽略掉(意味着各个进程间必须协商并遵守这个协同锁的机制,才能发挥锁的作用)。

下面这个例子可以帮助我们更容易地理解协同锁机制。让我们先回顾一下我们之前提到的账户文件的例子。

首先,我们假设文件 account.dat 仍包含初始值 “200”。

进程 A 获取 account.dat 文件的排他锁,然后打开并读取该文件以获取当前值:200。

我们必须了解,协同锁不是由操作系统或文件系统设置的。因此,即使进程 A 锁定了文件,进程 B 仍然可以通过系统调用自由读取、写入或删除文件。

如果进程 B 不尝试在获取锁的情况下,就执行文件操作,则可以说进程 B 与进程 A 没有使用协同锁机制进行合作,仍然会带来不可预期的结果。

现在,让我们看一下锁如何在协作流程中发挥作用:

  1. 进程 B 尝试在读取文件之前(与进程 A 协作)获得对 account.dat 文件的锁。
  2. 由于进程 A 已获得文件锁,因此进程 B 必须等待进程 A 释放锁。
  3. 进程 A 计算 100-20 并将 80 写回到文件中。
  4. 进程 A 释放锁。
  5. 进程 B 现在获取一个锁并读取文件,并获取更新的值:180。
  6. 进程 B 开始其逻辑,并将结果 260(180 + 80)写回到文件中。
  7. 进程 B 释放锁,以便其他协作进程可以继续读写该文件。

强制锁(Mandatory Lock)

与协作锁不同,强制锁不需要参与进程之间的任何合作。一旦在文件上激活了强制锁,操作系统便会阻止其他进程读取或写入文件。

要在 Linux 中启用强制性文件锁定,必须满足两个要求:

  1. 我们必须使用 mand 选项挂载文件系统(挂载-o mand FILESYSTEM MOUNT_POINT)。
  2. 我们必须为要锁定的文件(chmod g + s,g-x FILE)打开 set-group-ID 位,并关闭组执行位。

使用强制锁之后,这个锁会在操作系统级别进行管理和控制。

 

检查系统中的所有锁

slocks 命令

lslocks 命令是 util-linux 软件包的一个组件,在所有 Linux 发行版中都可用,通过这个命令可以列出系统中所有当前持有的文件锁。

在以下列表中,我们可以看到系统中所有当前锁定的文件,还可以看到每个锁的详细信息,例如锁的类型以及哪个进程持有该锁。

「技术干货」linux文件系统中的“锁”

 

/ proc /locks

/ proc / locks 不是命令,它是 procfs 虚拟文件系统中的文件。该文件包含所有当前文件锁,lslocks 命令也依赖于此文件来生成列表。

要获取 / proc / locks 的信息,我们执行“ cat / proc / locks”:

「技术干货」linux文件系统中的“锁”

 

我们从第一行开始,了解/ proc / locks 文件系统中锁信息的组织方式:

「技术干货」linux文件系统中的“锁”

 

  1. 第一列是序列号。
  2. 第二个字段指示使用的锁类别,例如 FLOCK(来自 flock 系统调用)或 POSIX(来自 lockf,fcntl 系统调用)。
  3. 此列用于说明锁类型。它可以有两个值:ADVISORY 或 MANDATORY。
  4. 第四个字段显示该锁是 WRITE 还是 READ 锁。
  5. 第五个字段是锁的进程 ID。
  6. 该字段包含一个冒号分隔的字符串,以“ major-device:minor-device:inode”的格式显示锁定文件的 ID。
  7. 此列以及最后一列显示了被锁定文件的锁定区域的开始和结束。在此示例行中,整个文件被锁定(0-EOF)。

由于分布式文件系统主要用于多个客户端中共享文件,客户端的应用程序并发访问文件是很常见的操作,在实际应用中,渲染、HPC 等业务都需要使用到文件锁,锁的支持对分布式文件系统而言至关重要。YRCloudFile 支持 POSIX 语义中的协同锁和共享锁,用户可以通过 flock 或 fcntl 等系统调用来对文件进行锁操作,锁的粒度可以支持到文件级别或文件内的指定区间。



Tags:linux文件   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
推荐视频:手把手带你实现一个Linux内核文件系统:「链接」c/c++ linux服务器开发学习地址:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂在多进程共享的...【详细内容】
2021-08-13  Tags: linux文件  点击:(91)  评论:(0)  加入收藏
1.简介文件系统是解决如何在存储设备上存储数据的一套方法,包括存储布局、文件命名、空间管理、安全控制等。Linux 操作系统支持很多现代的流行文件系统,其中 ext2 、 ext3...【详细内容】
2021-03-04  Tags: linux文件  点击:(212)  评论:(0)  加入收藏
在研究云系统提供的持久性时,想确保自己了解基本知识。首先阅读NVMe规范,以了解disks提供的保证(https://www.evanjones.ca/durability-nvme.html)。简单来说,你应该假设,在发出...【详细内容】
2020-10-15  Tags: linux文件  点击:(113)  评论:(0)  加入收藏
我们知道,无论什么东西,涉及到安全性的,比如文件、文件夹、磁盘(就如window系统的磁盘,我们就可以通过bitlocker技术将磁盘给加密锁起来)、服务器,等都需要设置权限管理,以保证安全性,接下来让我们来探讨以下Linux的文件权限...【详细内容】
2020-07-29  Tags: linux文件  点击:(94)  评论:(0)  加入收藏
磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。那么,磁盘和文件系统是怎么工作的呢?又有哪些指标可以衡量它们的性能呢?索...【详细内容】
2020-07-08  Tags: linux文件  点击:(70)  评论:(0)  加入收藏
你可能知道,包括硬盘、显卡和USB在内的一切设备在Linux上都是一个文件。Linux使用色码(color code)来区别文件类型。作为Linux管理员,你不必记住各种色码,但确实需要记住你每天...【详细内容】
2020-05-11  Tags: linux文件  点击:(141)  评论:(0)  加入收藏
0.新建操作:mkdir abc #新建一个文件夹touch abc.sh #新建一个文件1.查看操作查看目录:ll #显示目录文件详细信息du -h 文件/目录 #查看大小pwd #显示路径查看文件内容:cat|hea...【详细内容】
2019-11-27  Tags: linux文件  点击:(95)  评论:(0)  加入收藏
一、使用者与群组我们使用useradd创建用户时知道该用户是属于某一个group组里的,除了超级用户root外,按照所针对的用户,文件的权限可分为三类:1) 文件属主,创建该文件的用户。2)...【详细内容】
2019-08-21  Tags: linux文件  点击:(244)  评论:(0)  加入收藏
linux下各文件夹的结构说明及用途介绍:/bin:二进制可执行命令。/dev:设备特殊文件。/etc:系统管理和配置文件。/etc/rc.d:启动的配 置文件和脚本。/home:用户主目录的基点,比如用...【详细内容】
2019-08-20  Tags: linux文件  点击:(204)  评论:(0)  加入收藏
/bin [重点] (/usr/bin 、 /usr/local/bin) • 是Binary的缩写, 这个目录存放着最经常使用的命令/sbin (/usr/sbin 、 /usr/local/sbin) • s就是Super User的意思,...【详细内容】
2019-08-07  Tags: linux文件  点击:(263)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(13)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(21)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(21)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(34)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(26)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(16)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(24)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条