【av68676164(p23-p24)】临界区和锁
4.4.1 临界资源和临界区
临界资源(Critical Resource)
一次只允许一个进程独占访问(使用)的资源
例:例子中的共享变量i
临界区(Critical Section)
进程中访问临界资源的程序段
// 程序A
i = 100;
printf("A:i=%d", i);
// 程序B
i = 200;
printf("B:i=%d", i);
临界区和临界资源的访问特点
- 具有排他性
- 并发进程不能同时进入临界区
设计临界区访问机制的四个原则
- 忙则等待:当临界区忙时,其他进程必须在临界区外等待
- 空闲让进:当无进程处于临界区时,任何有权进程可以进入临界区
- 有限等待:进程进入临界区的请求应在有限时间内满足
- 思考:临界区的设置大些好还是小些好?
- 不能随意扩大(其他进程等待更长时间)
- 不能太小(达不到目的)
- 思考:临界区的设置大些好还是小些好?
- 让权等待:等待进程放弃CPU(让其他进程有机会得到CPU)
4.4.2 锁机制
基本原理
设置一个“标志”S:
- 表明临界资源“可用”还是“不可用”?1:0
进入临界区之前检查标志是否“可用”?——上锁操作
- 若为“不可用”状态:进程在临界区外等待
- 若为“可用”状态
- 访问临界资源
- 将标志修改为“不可用”
离开临界区时将标志修改为“可用”状态——开锁操作
上锁操作
步骤
- 检查锁S的状态(0或1)
- 如果S=0,则返回第一步
- 如果S=1,则置其为0
// 上锁源语
void Lock(S) {
test:
if (S == 0) {
goto test;
} else {
S = 0; // 上锁
}
}
开锁操作
步骤
- 把锁S的状态置1
// 开锁愿语
void Unlock(S) {
S = 1;
}
用锁机制访问临界区
- 初始化锁的状态S=1(可用)
- 进入临界区前执行上锁Lock(s)操作
- 离开临界区之后执行开锁unlock(s)操作
S=1-->上锁Lock
上锁Lock-->临界区
临界区-->开锁Unlock
【av68676164(p23-p24)】临界区和锁的更多相关文章
- ### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明标量变量 "@P23@P24"。(sql少一个逗号)【??】
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,[??],?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ...
- 第8章 用户模式下的线程同步(2)_临界区(CRITICAL_SECTION)
8.4 关键段(临界区)——内部也是使用Interlocked函数来实现的! 8.4.1 关键段的细节 (1)CRITICAL_SECTION的使用方法 ①CRITICAL_SECTION cs; ...
- Singleton、MultiThread、Lib——实现单实例无锁多线程安全API
前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...
- linux 自旋锁
一.概述: 自旋锁是SMP架构中的一种low-level的同步机制.当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了.对于自选锁需要注意: 由于自 ...
- java锁机制
2.4 锁机制 临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...
- java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)
在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...
- Linux内核中锁机制之RCU、大内核锁
在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...
- 大话Linux内核中锁机制之RCU、大内核锁
大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...
- 操作系统下spinlock锁解析、模拟及损耗分析
关于spinlock 我们在知道什么是spinlock之前,还需要知道为什么需要这个spinlock?spinlock本质就是锁,提到锁,我们就回到了多线程编程的混沌初期,为了实现多线程编程,操作系统 ...
随机推荐
- 记录groupby的一次操作
df = pd.DataFrame({'key1':list('aabba'), 'key2': ['one','two','one','two','one'], 'data1': np.random ...
- saver 的保存与恢复
模型保存,先要创建一个Saver对象:saver=tf.train.Saver(), max_to_keep 是用来设置保存模型的个数,默认为5,即保存最近的五个模型,saver=tf.train.S ...
- js获得url传过来的参数
function getParam(url) { var arr = url.split('?'); //取?以后 var a ...
- 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门
百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
- Golang语言排序的几种方式
1.Ints,float64s,strings 使用以如函数实现基本类型 sort.Ints sort.Float64s sort.Strings s := []int{4, 2, 3, 1} sor ...
- xctf-pwn hello_pwn
走流程,看看文件类型 64位,开了NX 直接丢IDA分析 查看sub_400686() 是个给flag的函数,可以看到,只要满足if语句的条件使dword_60106C == 1853186401就可 ...
- 聊聊Django应用的部署和性能的那些事儿
随着工作的深入,我越来越发现Python Web开发中有很多坑,也一直在羡慕AspNetCore和Go等的可执行文件部署和高性能,以及Spring生态的丰富,不过因为工作用了Django,生活还是要继 ...
- sscanf,sprintf(思修课的收获)
转载的,就是做个笔记 sprintf函数原型为 int sprintf(char *str, const char *format, ...).作用是格式化字符串,具体功能如下所示: (1)将数字变量 ...
- 使用MacOS直播
参考链接:https://www.jianshu.com/p/94f42a793a7e 参考链接:https://blog.dreamtobe.cn/live_guideline/ 所需软件 密码: ...
- __getattribute__小例子
class student(object): def __init__(self,name=None,age=None): self.name = name self.age = age def __ ...