记录上锁(字节范围锁,特例:锁住文件的某一部分或者整个文件)

引言

记录上锁是对读写锁的一种扩展,他可以用于有亲缘关系和无亲缘关系进程之间共享某个文件的读写。这中锁通常是在内核中维护的(与互斥锁和读写锁做比较)。

粒度:用于标记能被锁住的对象的大小。Posix记录上锁来说,粒度就是单个字节。

Posix fcntl 记录上锁

posix fcntl 记录上锁被称为劝告性上锁(advisory locking)。其含义是,内核维护着已由各个进程进程上锁的所有文件的正确信息,但是他不能防止一个进程写另外一个进程已经读锁定的文件。也就是说,只要进程对文件有足够的读写权限,内核是不能防止一个进程写一个已经被读锁定的文件,类似的,也不能防止一个进程读一个已经被写锁定的文件。对于协作进程是足够了的。因为协作进程之间对文件的访问权限是受系统管理的控制的。

既然劝告性锁有缺陷,那么我们肯定就要研发一种完善他的锁——强制性上锁(mandatory locking)。

记录上锁的一个常见用途就是确保某个程序在任何时刻只有一个副本在运行。

时间: 2024-10-11 10:36:20

记录上锁(字节范围锁,特例:锁住文件的某一部分或者整个文件)的相关文章

Android 手动按power键上锁,没有锁屏提示音,无法恢复【单机必现】

测试步骤 [测试版本]T0606 [模块版本] NAVI锁屏:5.0.0.ck [测试步骤] 1.手动按power键上锁, [测试结果] 没有锁屏提示音,无法恢复[单机必现] [预期结果] 有提示音 [发生次数] 单机必现 从log可以找到 4321 05-25 16:58:23.779 886 32501 W SoundPool: sample 1 not READY 7641 05-25 16:58:33.879 886 32563 W SoundPool: sample 1 not REA

JVM学习记录-线程安全与锁优化(一)

前言 线程:程序流执行的最小单元.线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度(线程是CPU调度的基本单位). Java语言定义了5中线程状态,在任意一个时间点,一个线程只能有且只有其中的一种状态,5中状态如下. 新建(New):创建后尚未启动的线程处于这种状态. 运行(Runnable):Runnable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程可能

JVM学习记录-线程安全与锁优化(二)

前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有:自适应自旋锁(Adaptive Spinning).锁消除(Lock Elimination).锁粗化(Lock Coarsening).轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等. 自旋锁与自适应自旋 互斥同步对性能最大的影响是阻塞的实现,线程的挂

oracle 记录被别的用户锁住

找出数据库的serial#,以备杀死: select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; 杀死该session alter system kill session 'sid,serial#'

160802、1.06s删除10w条重复记录只保留一条(mysql)及linux删除乱码文件

上次发表过的一遍删除重复记录的文章,其中最优的方案三删除1w条也花了0.07秒而2w条就已经花掉了4秒.今天进行了进一步优化,测试删除10w条只花了1.06秒.速度提升了很多. 建表语句 CREATE TABLE `test_user` ( `id` INT(10) NOT NULL DEFAULT '0', `namea` VARCHAR(40) NOT NULL, `nameb` VARCHAR(40) NOT NULL, `user_id` VARCHAR(40) NOT NULL, PR

文件是数据(字节)流的抽象-为什么C++中会把文件操作抽象为fstream?

这不过是返祖罢了.正确的问题是为什么会把数据流抽象成文件. 设备-字节流-文件. 一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列). 文件抽象为数据流一定程度上是 Unix 造成的. 传统上,计算机上用于 IO 的设备大致可以分成两大类,块(block)设备和流(stream)设备.前者可以抽象成一组数据块,读写必须数据块为单位,但一般可以指定任意一个数据块读写,典型的例子比如磁盘,以扇区为单位进行读写.后者可以抽象成一个数据流,你可以一个字节一个

如何判断一个字节是否是一个汉字中的一部分

UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序. 在UTF-8编码中一个中文占三个字节 比如 汉字 "张" 对应的三字节编码是[229 188 160] 但是如何判断,229 188 160 是组合的呢,这里涉及到一套规则 UTF规定: 如果一个符号只占一个字节,那么这个8位字节的第一位就为0. 如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10 然后如果是三个字节的话,那么第一个字节的

[学习记录]面对wxpython的长跑(100米:wxpython安装,相关文件,wx.App,wx.Frame)

被老师要求,已经是不得不进行图形界面的开发了,因为程序本体使用python写的,所以自然第一次进行图形界面开发就选择了wxpython,wxpython是一款非常优秀的GUI图形库,写起来也相对简洁方便. 安装时直接pip install wxpython即可. demo程序以及其它官方相关文件下载地址:https://extras.wxpython.org/wxPython4/extras/ 官方文档:https://docs.wxpython.org/wx.1moduleindex.html

python学习记录(持续更新)--最最最基础的一部分(变量、字符串、运算符)

几个常用的函数 print 打印 print('*' * 10) => 打印出10个* input 获取输入 name = input('What is your name?') int  float bool str 类型转换 num=int('12345') len upper lower  replace in course='Python for Beginners' print(len(course)) =>20 print(course.upper())=>PYTHON FO