自旋锁-原理

2023-05-16

    跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。由此我们可以看出,自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题:

死锁。试图递归地获得自旋锁必然会引起死锁:递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。在递归程序中使用自旋锁应遵守下列策略:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源,从而进入死循环
过多占用cpu资源。如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会
    由此可见,自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。

    自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。就保证了对共享数据访问的顺序性,不会出现交叉访问。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自旋锁-原理 的相关文章

  • 什么是定时器计数器

    定时器 计数器实际就是加1计数器 1 定时器和计数器的区别 xff1a 区别很小 xff0c 本质上都是计数器 xff0c 但定时器只是计数固定周期的脉冲 xff0c 所以根据频率可以计算出准确的时间 定时器模式 xff1a 对内部机器周期
  • 面试中问到动态库和静态库相关知识

    1 动态库相比较于静态库的优缺点 xff1f 动态库优点 xff1a 节省内存和代码重用 xff0c 当应用程序使用动态链接库时 xff0c 多个应用程序可以共享磁盘上的DLL xff08 windows xff09 和so linux 副
  • 【c++语法大全】

    C 43 43 基础入门 xff08 转载自黑马程序员 xff09 1 C 43 43 初识 1 1 第一个C 43 43 程序 编写一个C 43 43 程序总共分为4个步骤 创建项目创建文件编写代码运行程序 1 1 1 创建项目 Visu
  • Ubuntu20.04 USB网卡驱动安装 - MT7601u

    型号 xff1a TL WN725N 1 0 免驱版 芯片 xff1a MT7601u 具体型号可使用 96 lsusb 96 命令查看 确认型号为mt7601u后 执行如下命令 sudo apt install git build ess
  • 【浅谈插入排序】

    浅谈插入排序 插入排序 xff0c 是把无序数列中的数一个个插入到有序数列中 xff0c 直到无序数列没有数为止 比如有这么一个数列 xff1a 2 4 6 1 3 5 14 2 0 10 一共有10个数 xff0c 我们可以把第一个数当做
  • Meta Learning(元学习)详解

    元学习 概述基本概念基本分类 基本流程模型结构 概述 元学习 xff08 Meta Learing xff09 的提出是针对传统神经网络 模型的泛化性能不足 对信种类任务适应性较差的特点 主要表现为通过少量的计算和新训练数即可用于模型上实现
  • 2022 *CTF REVERSE 的 NaCl

    2022 CTF REVERSE 的 NaCl 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff1a 照例扔入虚拟机中运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码 xff0c
  • python编码问题的一点笔记

    Python编码 xff1a 中文乱码问题 xff1a 如果开头不声明保存编码的格式是什么 xff0c 那么它会默认使用 ASCII 码保存文件 这时如果你的代码中有中文就会出错了 xff0c 即使你的中文是包含在注释里面的 声明中文编码格
  • 对 IDA 结构体操作的一些理解

    对 IDA 结构体操作的一些理解 前言 xff1a 刚学逆向时把 IDA pro 权威指南过了一遍 xff0c 但读得并不是很细 xff0c 满足日常使用还是没问题的 xff0c 但是对于一些细节的操作或提高效率的方法倒是没能掌握 比如 I
  • 第二届广东省大学生网络攻防大赛 pyre

    第二届广东省大学生网络攻防大赛 pyre 以前做过 pyc 逆向 xff0c 直接的 python exe 逆向还是第一次 xff1a 第一种方法 xff1a 用 pyinstxtractor py 将 exe 文件转换成 pyc 文件 用
  • 2022 年网刃杯 ez_algorithm

    2022 年网刃杯 ez algorithm 下载附件 xff1a 照例扔入 exeinfope 中查看信息 xff0c 64 位无壳 xff1a 照例运行一下 xff0c 查看主要回显信息 xff1a 照例扔入 IDA64 中查看伪代码
  • Base-N 算法加密解密实现:

    目录 Base N 算法加密解密实现 xff1a Base64 加密解密 xff1a xff08 C 语言 python xff09 Base32 加密解密 xff1a xff08 C 语言 xff09 Base N 算法加密解密实现 xf
  • 第二届广东省大学生网络攻防大赛 simple_re

    第二届广东省大学生网络攻防大赛 simple re 流程总结 xff1a xff08 思路原文出自 JANlittle 师傅 xff09 程序将关键函数以对象元素的形式存在对象里 xff0c 然后在申请内存中搭配指针间接调用 xff0c 关
  • 解析 DES 加密算法(C语言):

    目录 解析 DES 加密算法 C语言 xff1a DES 简介 xff1a DES 算法整体流程 xff1a DES 解密 xff1a C 语言代码实现加密解密逻辑 xff1a 解析 DES 加密算法 C语言 xff1a 内容修改自博客 x
  • x64dbg 基本使用技巧

    x64dbg 基本使用技巧 最近使用 DBG 多了起来 xff0c 所以查了一些资料来学习并整理成自适应的笔记 本文摘抄自 xff1a x64dbg 使用技巧与实用插件合集 官方网站 xff1a https x64dbg com DBG 根
  • freertos系统栈溢出检测机制简述

    FreeRTOS 提供了多种特性来辅助跟踪调试栈相关的问题 uxTaskGetStackHighWaterMark 函数 每个任务都独立维护自己的栈空间 xff0c 栈空间总量在任务创建时进行设定 uxTaskGetStackHighWat
  • 记一次 windows 桌面卡顿

    记一次 windows 桌面卡顿 这几天在 windows 桌面上的操作感觉非常不好 xff0c 一开始以为是电脑老化 网络卡顿 C 盘又被垃圾挤占空间 或什么自启动软件占了内存 xff0c 复制一个快捷键出来都要缓冲 然后就卸载了很多不常
  • 浏览 APT 报告中学习积累

    浏览 APT 报告中学习积累 工具网站积累 xff1a xff08 APT 报告搜寻网站 xff09 https ti qianxin com https feed watcherlab com index apt https malped
  • 《windows 程序设计》读书笔记 一

    目录 基础知识 主要的动态链接库 xff1a API 及内存管理模式 xff1a 第一个 Windows 程序解析 xff1a 头文件 xff1a Windows 程序的入口 xff1a MessageBox 函数 xff1a 基础知识 主
  • 《windows 程序设计》读书笔记 二

    目录 Unicode 历史及介绍 美国标准 ASCII xff1a Unicode 方案 xff1a 宽字符和 C 语言 xff1a 宽字符和 Windows xff1a Windows 函数调用 xff1a Unicode 和 Ascii

随机推荐