广告
返回顶部
首页 > 资讯 > 操作系统 >linux有几种锁机制
  • 564
分享到

linux有几种锁机制

2023-07-02 10:07:21 564人浏览 八月长安
摘要

这篇文章主要介绍了linux有几种锁机制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux有几种锁机制文章都会有所收获,下面我们一起来看看吧。linux锁的种类:1、mutex(互斥锁),用于保证在任何时

这篇文章主要介绍了linux有几种机制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux有几种锁机制文章都会有所收获,下面我们一起来看看吧。

linux锁的种类:1、mutex(互斥锁),用于保证在任何时刻,都只能有一个线程访问该对象;2、rwlock(读写锁),分为读锁和写锁,适用于读取数据的频率远远大于写数据的频率的场合;3、spinlock(自旋锁),在任何时刻同样只能有一个线程访问对象;4、seqlock(顺序锁),用于能够区分读与写的场合,并且是读操作很多、写操作很少,写操作的优先权大于读操作。

教程操作环境:linux7.3系统、Dell G3电脑。

Linux的几种锁机制

互斥锁:mutex

  互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。

读写锁:rwlock

  读写锁:rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。

注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时,读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)。

  • 适用于读取数据的频率远远大于写数据的频率的场合。

自旋锁:spinlock

  自旋锁:spinlock,在任何时刻同样只能有一个线程访问对象。但是当获取锁操作失败时,不会进入睡眠,而是会在原地自旋,直到锁被释放。这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源。

RCU

  RCU:即read-copy-update,在修改数据时,首先需要读取数据,然后生成一个副本,对副本进行修改。修改完成后,再将老数据update成新的数据。

使用RCU时,读者几乎不需要同步开销,既不需要获得锁,也不使用原子指令,不会导致锁竞争,因此就不用考虑死锁问题了。而对于写者的同步开销较大,它需要复制被修改的数据,还必须使用锁机制同步并行其它写者的修改操作。在有大量读操作,少量写操作的情况下效率非常高。

信号量:semaphore

linux内核的信号量在概念和原理上与用户态的SystemV的IPC机制信号量是一样的,但是它绝不可能在内核之外使用,因此它与SystemV的IPC机制信号量毫不相干。

信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为1就变成互斥锁(Mutex),即同时只能有一个任务可以访问信号量保护的共享资源。一个任务要想访问共享资源,首先必须得到信号量,获取信号量的操作将把信号量的值减1,若当前信号量的值为负数,表明无法获得信号量,该任务必须挂起在该信号量的等待队列等待该信号量可用;若当前信号量的值为非负数,表示可以获得信号量,因而可以立刻访问被该信号量保护的共享资源。当任务访问完被信号量保护的共享资源后,必须释放信号量,释放信号量通过把信号量的值加1实现,如果信号量的值为非正数,表明有任务等待当前信号量,因此它也唤醒所有等待该信号量的任务。

rw_semaphore (读写信号量)

读写信号量对访问者进行了细分,或者为读者,或者为写者,读者在保持读写信号量期间只能对该读写信号量保护的共享资源进行读访问,如果一个任务除了需要读,可能还需要写,那么它必须被归类为写者,它在对共享资源访问之前必须先获得写者身份,写者在发现自己不需要写访问的情况下可以降级为读者。读写信号量同时拥有的读者数不受限制,也就说可以有任意多个读者同时拥有一个读写信号量。如果一个读写信号量当前没有被写者拥有并且也没有写者等待读者释放信号量,那么任何读者都可以成功获得该读写信号量;否则,读者必须被挂起直到写者释放该信号量。如果一个读写信号量当前没有被读者或写者拥有并且也没有写者等待该信号量,那么一个写者可以成功获得该读写信号量,否则写者将被挂起,直到没有任何访问者。因此,写者是排他性的,独占性的。
读写信号量有两种实现,一种是通用的,不依赖于硬件架构,因此,增加新的架构不需要重新实现它,但缺点是性能低,获得和释放读写信号量的开销大;另一种是架构相关的,因此性能高,获取和释放读写信号量的开销小,但增加新的架构需要重新实现。在内核配置时,可以通过选项去控制使用哪一种实现。

读写信号量:rw_semaphore

读写信号量对访问者进行了细分,或者为读者,或者为写者,读者在保持读写信号量期间只能对该读写信号量保护的共享资源进行读访问,如果一个任务除了需要读,可能还需要写,那么它必须被归类为写者,它在对共享资源访问之前必须先获得写者身份,写者在发现自己不需要写访问的情况下可以降级为读者。读写信号量同时拥有的读者数不受限制,也就说可以有任意多个读者同时拥有一个读写信号量。如果一个读写信号量当前没有被写者拥有并且也没有写者等待读者释放信号量,那么任何读者都可以成功获得该读写信号量;否则,读者必须被挂起直到写者释放该信号量。如果一个读写信号量当前没有被读者或写者拥有并且也没有写者等待该信号量,那么一个写者可以成功获得该读写信号量,否则写者将被挂起,直到没有任何访问者。因此,写者是排他性的,独占性的。

读写信号量有两种实现,一种是通用的,不依赖于硬件架构,因此,增加新的架构不需要重新实现它,但缺点是性能低,获得和释放读写信号量的开销大;另一种是架构相关的,因此性能高,获取和释放读写信号量的开销小,但增加新的架构需要重新实现。在内核配置时,可以通过选项去控制使用哪一种实现。

seqlock****(顺序锁)

用于能够区分读与写的场合,并且是读操作很多、写操作很少,写操作的优先权大于读操作。seqlock的实现思路是,用一个递增的整型数表示sequence。写操作进入临界区时,sequence++;退出临界区时,sequence再++。

写操作还需要获得一个锁(比如mutex),这个锁仅用于写写互斥,以保证同一时间最多只有一个正在进行的写操作。当sequence为奇数时,表示有写操作正在进行,这时读操作要进入临界区需要等待,直到sequence变为偶数。读操作进入临界区时,需要记录下当前sequence的值,等它退出临界区的时候用记录的sequence与当前sequence做比较,不相等则表示在读操作进入临界区期间发生了写操作,这时候读操作读到的东西是无效的,需要返回重试。

seqlock写写是必须要互斥的。但是seqlock的应用场景本身就是读多写少的情况,写冲突的概率是很低的。所以这里的写写互斥基本上不会有什么性能损失。而读写操作是不需要互斥的。seqlock的应用场景是写操作优先于读操作,对于写操作来说,几乎是没有阻塞的(除非发生写写冲突这一小概率事件),只需要做sequence++这一附加动作。而读操作也不需要阻塞,只是当发现读写冲突时需要retry。seqlock的一个典型应用是时钟的更新,系统中每1毫秒会有一个时钟中断,相应的中断处理程序会更新时钟(写操作)。

而用户程序可以调用gettimeofday之类的系统调用来获取当前时间(读操作)。在这种情况下,使用seqlock可以避免过多的gettimeofday系统调用把中断处理程序给阻塞了(如果使用读写锁,而不用seqlock的话就会这样)。中断处理程序总是优先的,而如果gettimeofday系统调用与之冲突了,那用户程序多等等也无妨。

互斥锁和读写锁的区别:

1)读写锁区分读者和写者,而互斥锁不区分

2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写者,但是允许多个读者同时读对象。

关于“linux有几种锁机制”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“linux有几种锁机制”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网操作系统频道。

--结束END--

本文标题: linux有几种锁机制

本文链接: https://www.lsjlt.com/news/341246.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • linux有几种锁机制
    这篇文章主要介绍了linux有几种锁机制的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux有几种锁机制文章都会有所收获,下面我们一起来看看吧。linux锁的种类:1、mutex(互斥锁),用于保证在任何时...
    99+
    2023-07-02
  • MySQL数据库有哪几种锁定机制
    下面一起来了解下MySQL数据库有哪几种锁定机制,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL数据库有哪几种锁定机制这篇短内容是你想要的。       ...
    99+
    2022-10-18
  • webapi安全机制有哪几种
    Web API 的安全机制通常包括以下几种: 身份验证(Authentication):确保请求的用户是合法用户。常用的身份验证...
    99+
    2023-10-26
    webapi
  • redis的锁有哪几种
    这期内容当中小编将会给大家带来有关redis的锁有哪几种,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。         ...
    99+
    2022-10-18
  • linux权限有哪几种
    本篇内容主要讲解“linux权限有哪几种”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux权限有哪几种”吧!linux权限有四种:1、读权限,即可以读取文件内容的权限;2、写权限,即可以向...
    99+
    2023-06-21
  • Linux下有几种文件
    小编给大家分享一下Linux下有几种文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!我们都知道Linux下一切皆文件,主要有:- 普通文件d 目录l 符号链接s...
    99+
    2023-06-16
  • mysql表级锁的模式有几种
    本篇内容介绍了“mysql表级锁的模式有几种”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、表共享读锁,添加共享读锁的表不会阻塞其他ses...
    99+
    2023-06-20
  • java中常见的几种锁有哪些
    公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,有可能,会造成优先级反转或者饥饿现象。独享锁/共享锁独享锁是指该锁一次只能被一...
    99+
    2017-11-14
    java入门 java 常见
  • linux中各种锁机制的使用与区别详解
    前言: 相信需要了解这方面的知识的小伙伴,已经基本对进程间通信和线程间通信有了一定了解。例如,进程间通信的机制之一:共享内存(在这里不做详解):多个进程可同时访问同一块内存。如果不对访问这块内存的临界区进行互斥或者同步,...
    99+
    2022-06-04
    linux锁机制 linux中断机制 linux内核锁机制
  • MySQL基础扎实——MySQL中有哪几种锁
    常见锁举例 在MySQL中,常见的锁包括以下几种: 表级锁(Table-level Lock):表级锁是对整张表进行锁定,可以分为两种类型: 共享锁(Shared Lock):也称为读锁(Read Lock),多个事务可以同时持有共...
    99+
    2023-08-30
    mysql 数据库
  • linux中有几种文件类型
    小编给大家分享一下linux中有几种文件类型,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!linux中有七种文件类型:1、普通文件类型;2、目录文件类型;3、块设备文件类型;4、字符设备类型;5、套接字文件类型;6、管道文...
    99+
    2023-06-21
  • Linux文件的时间有几种
    小编给大家分享一下Linux文件的时间有几种,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux文档的时间一般分三种:Access time-atime(访问...
    99+
    2023-06-27
  • linux中解压命令有几种
    linux中解压命令有以下几种:1、*.tar,需要使用tar工具;2、*.gz,需要使用gzip或者gunzip工具;3、*.tar.Z,*.tar.bz2,*.tar.gz和*.tgz,需要使用tar工具;4、*.bz2,需要使用bzi...
    99+
    2022-10-09
  • linux图形界面有哪几种
    linux图形界面有:1、GNOME是一个开源的、面向用户的图形界面环境,具有强大的图形特效和自定义选项;2、KDE是广受欢迎的开源图形界面环境,更注重美观和可定制型;3、Xfce是一个轻量级的开源图形界面环境,提供快速、可靠和易于使用的桌...
    99+
    2023-07-11
  • linux的重启命令有哪几种
    今天小编给大家分享一下linux的重启命令有哪几种的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2023-03-14
    linux
  • C#强制类型转化有几种
    这篇文章给大家分享的是有关C#强制类型转化有几种的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C#强制类型转化有以下三种:注:objA 为 typeA 类型,objB 为 typeB 类型(1) typeA ob...
    99+
    2023-06-18
  • python流程控制语句有几种
    python流程控制语句有三种,分别是条件语句、循环语句和跳转语句。详细介绍:1、条件语句,条件语句用于根据条件的真假来执行不同的代码块,Python提供了if语句和if-else语句来实现条件控制;2、循环语句,用于重复执行一段代码块,直...
    99+
    2023-12-12
    python 流程控制
  • Linux下Shell日期的格式有几种
    这篇文章主要为大家展示了“Linux下Shell日期的格式有几种”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下Shell日期的格式有几种”这篇文章吧。在Shell环境里,我们获取时间...
    99+
    2023-06-15
  • Linux重命名文件有几种方法
    Linux重命名文件有四种方法,分别是:1、使用命令行重命名文件,可以用来移动文件或者文件夹,同时也可以用来重命名文件;2、使用文件管理器重命名文件,只需要在文件管理器中选中要重命名的文件,然后通过右键单击文件,选择“重命名”选项。接着,在...
    99+
    2023-08-09
  • 限制登录Linux服务器的几种方式
    在日常运维中,我们通常使用防火墙iptables跟firewalld的方式来实现访问控制,但在实际环境中,开启防火墙可能会对业务造成影响,所以以下整理了三种限制登录Linux服务器的几种方式。分别是修改TCP Wrappers服务访问控制、...
    99+
    2023-08-31
    服务器 linux 网络 运维 Powered by 金山文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作