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

如题所述

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

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

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

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

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

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

结果,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 没有使用协同锁机制进行合作,仍然会带来不可预期的结果。

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

强制锁(Mandatory Lock)

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

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

使用强制锁之后,这个锁会在操作系统级别进行管理和控制。
温馨提示:内容为网友见解,仅供参考
无其他回答

「干货」linux文件系统中的“锁”
这是因为 Linux 通常不会自动给打开的文件加锁,所以即使是正在运行的文件,仍然有可能被 rm 命令删除。Linux 支持两种文件锁:协同锁(Advisory lock)和强制锁(Mandatory lock)。协同锁(Advisory lock)协同锁定不是强制性锁方案,仅当参与的进程通过显式获取锁进行协作时,它才有效。否则,如果某个...

「技术干货」Linux内核中的互斥量——Mutex锁
Linux内核中的互斥量(Mutex)是一种关键同步机制,它在保证串行执行的同时,与spinlock不同,当无法获取时,mutex会让线程进入阻塞状态。DEBUG_MUTEXES选项用于检测潜在的误用,确保正确使用。mutex的工作原理涉及状态标记、等待队列和乐观自旋队列(Osq)。Osq是一个自旋任务队列,用于优化自旋等待,避免了ca...

linux中shadow文件里的"!!" 表示什么意思
以下为干货。shadow文件中第二列的格式,它是加密后的密码,它有些玄机,不同的特殊字符表示特殊的意义:①.该列留空,即"::",表示该用户没有密码。②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh公钥认证的方式,su的方式。③.该列为...

【干货】Linux 修改权限命令 chmod 用法示例
在Linux\/Unix系统中,至关重要的Chmod命令用于调整文件和目录的权限。本文将深入讲解chmod命令的用法,帮助你理解权限分配和管理。Linux文件权限由文件所有权和三类权限(读r、写w和执行x)决定,它们分别针对文件所有者(u)、文件所属组(g)和其他用户(o)。通过ls -l命令,你可以看到文件权限的详细...

S:使用 Vim 给文件设置密码保护
怎样在 Linux 中用 Vim 对文件进行密码保护 Vim 有个-x选项,这个选项能让你在创建文件时用它来加密。一旦你运行下面的vim 命令,你会被提示输入一个密钥:vim -x file.txt 警告:正在使用弱加密方法;参见 :help 'cm' 输入加密密钥:*** 再次输入相同密钥:如果第二次输入的密钥无误,你就能可...

【干货】linux关闭防火墙命令,【收藏】linux关闭防火墙命令
在Linux系统中,若觉得频繁关闭防火墙过于繁琐,可能考虑将其永久性关闭。但请谨慎操作,确保安全性和系统完整性。以下为在Red Hat\/CentOS7系统中关闭防火墙的具体步骤和命令。首先,了解当前防火墙状态。使用`systemctl status firewalld`命令查看是否已启用。若需要暂时关闭防火墙,使用以下命令:1. `system...

【干货】linux创建文件夹命令,【收藏】linux创建文件夹命令
在Linux系统中,创建文件夹的常用命令是mkdir,它代表make directories,即建立目录。这个命令对所有用户都开放,使用起来非常直观。基本格式包括建立新目录,如建立名为cangls的目录,以及使用特殊选项,如-p递归创建多层目录,-m自定义权限,如test2目录设置了711权限(具体含义后续介绍)。此外,对于初学者,...

【干货】linux书籍推荐,【收藏】linux书籍大全
学 Linux?这里有一份你绝对不能错过的干货!本文将分三个部分,帮你全面掌握 Linux 技能。首先,我们推荐的 Linux 书籍,从入门到进阶,让你成为 Linux 大师。接着,附上 28 张 Linux 命令思维导图,让你全面掌握 Linux 基础。其次,你将获取到一份「10G Linux 学习资料大全」,几乎覆盖了 Linux ...

【干货】linux查看磁盘空间 命令,【收藏】linux查看磁盘空间 命令_百度...
Linux查看磁盘空间时,通常使用df命令。df命令以磁盘分区为单位,查看文件系统状态,提供已用空间、剩余空间等信息。使用时,增加-h参数,可使显示更加人性化,以GB、MB为单位显示大小。例如,执行"df -h"命令,即可轻松获取磁盘使用情况。具体来说,df命令的工作原理是遍历系统中的所有文件系统,并收集有...

干货:Linux 系统的三种挂载方式
在Linux系统中,挂载操作是日常维护中常见的操作。本文主要介绍了三种挂载方式:手动挂载、开机自动挂载(永久挂载)以及自动挂载。手动挂载可通过`mount`命令实现,需要指定设备、文件系统类型、挂接选项和挂载点。例如,挂载光盘镜像文件,首先制作镜像,再用`mount -o loop`命令将其挂载到指定目录。移动...

相似回答
大家正在搜