文件锁中的“协同锁”与“强制锁”的区别

 文件锁是一种文件读写机制,在任何特定的时间只允许一个进程访问一个文件。利用这种机制能够使读写单个文件的过程变得更安全。

  在这篇文章中,我们将探讨Linux中不同类型的文件锁,并通过示例程序来理解它们之间的不同之处。

  我们将采取以下的例子来解释为什么需要使用文件锁。

  1、进程“A”打开和读取一个文件,此文件包含账户相关的一些信息。

  2、进程“B”也打开了这个文件,并读取了文件中的信息。

  3、现在,进程“A”更改了其副本中的一条余额记录,并将其写入文件。

  4、此时,进程“B”并不知道上次读取的文件已经被更改,它还保存着原始的文件副本。然后,进程“B”更改了“A”操作的那条相同的记录,并将记录写入文件。

  5、此时,文件中将只保存了进程“B”更改过的记录。

  为了避免这种事情发生,就要使用文件锁来确保操作的“序列化”。

  以下是Linux系统中两种常用的文件锁:

  1、协同锁

  协同锁要求参与操作的进程之间协同合作。假设进程“A”获得一个WRITE锁,并开始向文件中写入内容;此时,进程“B”并没有试图获取一个锁,它仍然可以打开文件并向文件中写入内容。在此过程中,进程“B”就是一个非合作进程。如果进程“B”试图获取一个锁,那么整个过程就是一个合作的过程,从而可以保证操作的“序列化”。

  只有当参与操作的进程是协同合作的时候,协同锁才能发挥作用。协同锁有时也被称为“非强制”锁。

  2、强制锁

  强制锁不需要参与操作的进程之间保持协同合作。它利用内核来查检每个打开、读取、写入操作,从而保证在调用这些操作时不违反文件上的锁规则。

时间: 2024-12-09 14:04:24

文件锁中的“协同锁”与“强制锁”的区别的相关文章

linux 建议锁和强制锁

作为APUE 14.3节的参考 linux是有强制锁的,但是默认不开启.想让linux支持强制性锁,不但在mount的时候需要加上-o mand,而且对要加锁的文件也需要设置相关权限. 1.??????????????建议锁又称协同锁.对于这种类型的锁,内核只是提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与协调工作.也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的.因此,建议锁,不能阻止进程对文件的操作,而只能依赖于大

Linux建议锁和强制锁

llinxu强制性锁默认是不开启的,想让linux支持强制性锁,不但在mount的时候需要加上-o mand,而且对 要加锁的文件也需要设置相关权限. 1.建议性锁业称为协同锁,对于这种类型的锁,内核知识提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与 协同工作,也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者 无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的.因此,建议锁,不能阻止进程对文件的操作, 而只能依赖于大家自觉的去检测是否加锁然后约束自己的行为: 2.强制

操作系统文件建议锁与强制锁

文件锁有建议使用和强制使用之分. 建议锁又称协同锁.对于这种类型的锁,内核只是提供加减锁以及检测是否加锁的操作,但是不提供锁的控制与协调工作.也就是说,如果应用程序对某个文件进行操作时,没有检测是否加锁或者无视加锁而直接向文件写入数据,内核是不会加以阻拦控制的.因此,建议锁,不能阻止进程对文件的操作,而只能依赖于大家自觉的去检测是否加锁然后约束自己的行为:多数 Unix 和类 Unix 操 作系统使用建议型锁,有些也使用强制型锁或兼而有之. 强制锁,是OS内核的文件锁.每个对文件操作时,例如执行

MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或线程并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对于

深入理解Python中的GIL(全局解释器锁)

深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁).这篇我们就来看看这个GIL究竟是怎么回事. 1. GIL是什么? 首先来看看GIL究竟是什么.我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以

Innodb中的事务隔离级别和锁的关系

前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式.同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力.所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在.这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么. #一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道

JAVA多线程编中的轮询锁与定时锁

显示锁                                                                                     Lock接口是Java 5.0新增的接口,该接口的定义如下: 1 2 3 4 5 6 7 8 publicinterface Lock {     void lock();     void lockInterruptibly() throws InterruptedException;     boolean tryLo

mysql中InnoDB存储引擎的行锁和表锁

Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. 而导致行锁变为表锁的情况之一就是: SQL的更新(update)或者删除(delete)语句中未使用到索引,导致在InnoDB在对数据进行相应操作的时候必须把整个表锁起来进行检索(表锁).而如果使用了索引的话,InnoDB只会通过索引条件检索数据,而只锁住索引对应的行(行锁). 下面记录一下我遇到

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的