Linux flock 原理(shell进阶)

简介: flock申请的锁对象是处于 内核空间层的全局级别的open file table中的。

flock申请的锁对象是处于 内核空间层的全局级别的open file table中的。


回忆一下OS是如何打开一个文件的?


首先一个文件对应一个fd,fd是维护在用户空间,通过索引对应到内核空间的fd表。程序是无法直接打开文件的,需要请内核帮忙。用户空间使用fd在内核中调用open函数,当然可以调用多次,调用多次在open file中就会记录多条记录。然后在内核空间的文件级别层的inode表找到对应的inode(这个inode表是从硬盘上copy过来的,并附加上一些额外的信息), 将此文件加载到虚拟内存中此时这个文件就被打开了。


注意:


内核层面的inode 表和open file表是一对多的关系。


fd表 中存在复制的fd,这两个fd可能指向同一个lock

2edf5490d6f648b8bf537bf29b827280.png

如何理解man flock中的这段文字呢?1997cbf6d4434a63a6ffc3a1bede08fb.png

588bcd3adc034457abbd13d2ec05844b.png

 Locks created by flock() are associated with an open file table entry.  This means that duplicate file descriptors  (created  by,  for  example,  fork(2)  or
       dup(2))  refer  to  the  same lock, and this lock may be modified or released using any of these descriptors.  Furthermore, the lock is released either by an
       explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed.

这段话主要说明了文件描述符上的锁和文件上的锁的区别 , 因为存在fork的子进程使用同一把锁。当手动释放锁文件时,open file table entry中的fd关联的锁消失。如果释放的是某个fd的锁,则锁还是存在并生效的。


open file table上维护的其他特殊信息

de6298a1c683437fa0fcec2510446fb9.png

对于多个进程同一文件都能正确工作。每个进程都有它自己的文件表项,其中也有它自己的当前文件位移量。但是,当多个进程写同一文件时,则可能产生预期不到的结果。


假定有两个独立的进程 A和B,都对同一文件进行添加操作。每个进程都已打开了该文件,但未使用 O _ A P P E N D标志。此时各数据结构之间的关系如图中所示一样。每个进程都有它自己的文件表项,但是共享一个 v节点表项。假定进程A调用了l s e e k,它将对于进程A的该文件的当前位移量设置为1 5 0 0字节(当前文件尾端处)。然后内核切换进程使进程 B运行。进程B执行l s e e k,也将其对该文件的当前位移量设置为 1 5 0 0字节(当前文件尾端处)。然后B调用w r i te,它将B的该文件的当前文件位移量增至 1 6 0 0。因为该文件的长度已经增加了,所以内核对 v节点中的当前文件长度更新为 1 6 0 0。然后,内核又进行进程切换使进程 A恢复运行。当A调用w r i t e时,就从其当前文件位移量 ( 1 5 0 0 )处将数据写到文件中去。这样也就代换了进程 B刚写到该文件中的数据。

--update 2022年3月24日14:04:00

劝告锁

flock和fcntl都属于劝告式锁(Advisory Lock),如果同步的进程遵循游戏规则,操作之前先申请锁,就能起到同步的作用;但是如果进程无视劝告式锁的存在,不遵循游戏规则,不申请锁直接操作文件或文件的某个区域,内核也不会阻止这种操作。


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
18天前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
70 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
609 2
|
2月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
32 0
|
3月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
4月前
|
存储 缓存 Linux
深度探索Linux操作系统 —— Linux图形原理探讨3
深度探索Linux操作系统 —— Linux图形原理探讨
60 9
|
4月前
|
存储 Linux 图形学
深度探索Linux操作系统 —— Linux图形原理探讨1
深度探索Linux操作系统 —— Linux图形原理探讨
63 7