【av68676164(p23-p24)】临界区和锁
2024-09-06 22:14:04
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)操作
graph TB
S=1-->上锁Lock
上锁Lock-->临界区
临界区-->开锁Unlock
S=1-->上锁Lock
上锁Lock-->临界区
临界区-->开锁Unlock
最新文章
- C#使用ADO.NET访问数据库(一)
- javascript深入浅出(imooc)
- 深度讲解VIEWPORT和PX是什么?移动端单位px,em,rem
- android studio sdk 配置
- Kotlin:Android世界的Swift
- CSS 高级语法 ---- 继承和选择器的分组
- ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)
- GoF的23个经典设计模式
- CODEVS 1638 修复公路
- HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
- Shell上传文件到ftp
- SCU 2009(数位dp)
- JavaScript设计模式--门面模式
- redis 系列2 知识点概述
- 对C#调用C++的dll的一点思考
- Android MVP 架构一 View与Presenter
- Gym 102091L Largest Allowed Area 【二分+二维前缀和】
- python 05集合
- laravel5.2 开发中打印sql语句
- ASP.NET MVC5 高级编程-学习日记-第二章 控制器
热门文章
- java 数据结构(二):java常用类 二 StringBuffer、StringBuilder
- 数据可视化之powerBI基础(九)Power BI中的“新表”,你会用吗?
- SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
- Linux06 /Python web项目部署
- 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?
- 题解 CF1359B 【New Theatre Square】
- 自学 Python 到什么程度能找到工作,1300+ 条招聘信息告诉你答案
- TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?
- java8之Stream流处理
- EF Code 如何输出sql语句