内核中的竞争状态和互斥(简述)

以下内容源于朱有鹏《物联网大讲堂》课程的学习,如有侵权,请告知删除。

一、概念

(1)竞争状态(简称竟态);

(2)临界段(某一段代码,该代码有可能造成并发,因此应该添加锁。这段代码应该尽可能地短)、互斥锁、死锁(由于互斥锁使用不对,导致的后果);

(3)同步与并发(多CPU、(单cpu下)多任务、中断)。

二、解决竟态的方法

(1)原子操作(automic_t,即不可分割的操作(以前认为原子不可以分割))

  • 操作要么不开始,要么开始后就不会被打断。

(2)信号量、互斥锁;

  • 程序可以休眠,即当前代码运行条件不满足,因此把cpu交出来,等到条件满足时再使用cpu。

(3)自旋锁;

  • 程序不可以休眠,不会让出CPU。这段时间很短,因此可以等待。
  • (2)(3)可以“占用篮球场(CPU)与否”的例子来理解。

三、自旋锁和信号量的使用要点

(1)自旋锁不能递归

  • 已经拿到自旋锁后,不能再次获取该锁。

(2)自旋锁可以用在中断上下文(即中断处理程序)(信号量不可以,因为当运行条件不满足时,可能造成睡眠),但是在中断上下文中获取自旋锁之前要先禁用本地中断;

  • 中断上下文不能使用信号量,因为中断上下文不参与调度,一旦开始就应该执行完,不应该在运行阶段交出cpu。

(3)自旋锁的核心要求

  • 拥有自旋锁的代码必须不能睡眠,要一直持有CPU直到释放自旋锁;

(4)

  • 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。
  • 如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适;如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。
  • 自旋锁保持期间是不能被抢占的(所谓抢占,即优先级比其高),而信号量和读写信号量保持期间是可以被抢占的。
  • 自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MenuetOS

MenuetOS由芬兰人Ville Turjanmaa开发,是一个操作系统,用于和IBM PC兼容的电脑。 它由汇编语言写成,可以存入一只1.44MB的软盘中。 Menuet OS 的32位版本Menuet32使用GNU通用公共许可证发放,但64位版本Menuet64使用自己的协议发放…

php是一种,PHP是一种什么型的语言:()

案例分析一:假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送,其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期,并且在DMA传送完成后的中断…

java动态代理二cglib

2019独角兽企业重金招聘Python工程师标准>>> java动态代理 转载于:https://my.oschina.net/u/1430510/blog/290215

spring心得6--自动装配知识点讲解及案例分析

1.自动装配: spring3.2以上版本有四种自动装配类型: 1).byName:寻找和属性名相同的bean,若找不到,则装不上。 2).byType:寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常。 3).constructor:按照参数…

中断的上下半部

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 因为输入类设备的输入都是异步事件,因此一般使用中断来处理和响应。 中断处理程序处于中断上下文中,不能和用户空间数据交互(不能使用copy_to(from)_usr函数…

arrayPointer

1,分别使用指针加减 int wages[2] {100000000,20000000}; int *pw wages or int *pw &wages[0] 表示指针指向数组的首地址; pw表示地址,*pw表示取值,new分配的动态数组时 指针名称当数组名称使用eg pw[0],pw[2]分别表示指向数组wages的2个数组的元素值; 我们已知pw表示此…

php抓取动态数据,php+ajax实现无刷新动态加载数据技术

我们浏览有些网页的时候,当拉动浏览器的滚动条时到页底时,页面会继续自动加载更多内容供用户浏览。这种技术我暂且称它为滚屏加载技术。我们发现很多网站用到这种技术,必应图片搜索、新浪微博、QQ空间等将该技术应用得淋漓尽致。滚屏加载技术…

图片播放器小项目(详解)

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。一、开始动手写代码 1、Makefile介绍 (1)这是一个通用的项目管理的Makefile体系,自己写的(有子文件夹组织的)项目可以…

基于linux-2.6.32.2的servfox移植

说明:这篇文章是本人在做基于web客户端的远程监控系统课题期间,在移植servfox应用服务程序费了很大周折,所以写下的。 只是介绍了基于arm的servfox移植【因为其他部分的移植没有遇到过错误】 前言: 如何移植基于linux的USB摄像头驱…

Telnet远程访问思科交换机、路由器

一、实验目的Telnet远程访问思科交换机、路由器二、实验拓扑三、实验步骤1、PC1远程管理S11)配置交换机的管理IPS1(config)#int vlan 1S1(config-if)#ip add 192.168.1.100 255.255.255.0S1(config-if)#no shu2)开启S1的telnet远程管理服务S1(config)#li…

php redis 队列,Redis 实现队列

## Redis 实现队列Redis 实现队列场景说明:用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后…

offsetTop测试见解

offsetTop一开始以为只要容器内div的top定位为负就行&#xff0c;结果今天刚做了个demo&#xff0c;发现好像不是那么回事&#xff0c;于是经过各种测试&#xff0c;得出了一些结论&#xff0c;结论看demo <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" &qu…

[置顶]       cocos2d-x 手游源码站

尊重开发者的劳动成果&#xff0c;转载的时候请务必注明出处&#xff1a;http://blog.csdn.net/haomengzhu/article/details/37829061 1、魔幻方块 链接&#xff1a;魔幻方块源码关键词&#xff1a;魔幻方块源码 源代码 Cocos2d-x2.0 游戏源码 益智 休闲 游戏 游戏类型&#xf…

include “ “ 与 include < > 的区别

#include <>格式&#xff1a;引用标准库头文件&#xff0c;编译器从标准库目录开始搜索。 #incluce " "格式&#xff1a;引用非标准库的头文件&#xff0c;编译器从用户的工作目录开始搜索&#xff0c;如果找不到&#xff0c;再到标准位置寻找。 预处理器发现…

php 字符串的比较大小,php怎么比较两个字符串的大小

比较字符串是任何编程语言的字符串处理功能中重要的特性之一。在PHP中除了可以使用比较运算符号(、)加以比较外&#xff0c;还提供了一系列的比较函数&#xff0c;使PHP可以进行更复杂的字符串比较。如strcmp()、strcasecmp()和strnatcmp()等函数。1、按字节顺序进行字符串比较…

Android SDK开发包国内下载地址

原帖地址&#xff1a;http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/2769409.html 不知道是因为最近kaihui还是怎么的&#xff0c;打开android sdk官方网站特别的慢&#xff0c;想下载最新版本的platform几乎变成不可能完成的任务&#xff0c;不知道为什么Google不像…

SharePoint 2013 Workflow - Advanced Workflow Debugging with Fiddler

来自&#xff1a;Andrew Connell [MVP SharePoint] | 时间&#xff1a;2012-07-18 19:26:30 原文链接&#xff1a; http://www.andrewconnell.com/blog/archive/2012/07/18/sharepoint-2013-workflow-advanced-workflow-debugging-with-fiddler.aspx In previous posts Iv…

调试技巧——宏定义开关和printf

转自http://blog.csdn.net/guanyasu/article/details/51866984 #ifndef __CONFIG_H__ #define __CONFIG_H__#define DEBUG/*#undef DEBUG */#ifdef DEBUG #define debug(...) \{\fprintf(stderr,"[DEBUG] [%s:%s:%d]",__FILE__,__FUNCTION__,__LINE__);\fprin…

java sheet 打印区域设定,如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)...

如何使用Java设置电子表格的打印区域。(How to set the print area of a spreadsheet using Java.)问题描述 (Problem Description)如何使用Java设置电子表格的打印区域。解决方案 (Solution)以下是使用Java设置电子表格打印区域的程序。import java.io.File;import java.io.Fi…

RedHat6.2 x86手动配置LNMP环境

为什么80%的码农都做不了架构师&#xff1f;>>> 因为公司要求用RedHat配&#xff0c;顺便让我练习一下Linux里面的操作什么的。 折腾来折腾去终于搞好了&#xff0c;其实也没那么难嘛。但是也要记录一下。 首先&#xff0c;是在服务器里面用VMware搭建的RedHat6.2 …