4.4.1 临界资源和临界区

临界资源(Critical Resource)

一次只允许一个进程独占访问(使用)的资源

例:例子中的共享变量i

临界区(Critical Section)

进程中访问临界资源的程序段

// 程序A
i = 100;
printf("A:i=%d", i);
// 程序B
i = 200;
printf("B:i=%d", i);

临界区和临界资源的访问特点

  • 具有排他性
  • 并发进程不能同时进入临界区

设计临界区访问机制的四个原则

  1. 忙则等待:当临界区忙时,其他进程必须在临界区外等待
  2. 空闲让进:当无进程处于临界区时,任何有权进程可以进入临界区
  3. 有限等待:进程进入临界区的请求应在有限时间内满足
    • 思考:临界区的设置大些好还是小些好?

      • 不能随意扩大(其他进程等待更长时间)
      • 不能太小(达不到目的)
  4. 让权等待:等待进程放弃CPU(让其他进程有机会得到CPU)

4.4.2 锁机制

基本原理

设置一个“标志”S:

  • 表明临界资源“可用”还是“不可用”?1:0

进入临界区之前检查标志是否“可用”?——上锁操作

  • 若为“不可用”状态:进程在临界区外等待
  • 若为“可用”状态
    • 访问临界资源
    • 将标志修改为“不可用”

离开临界区时将标志修改为“可用”状态——开锁操作

上锁操作

步骤

  1. 检查锁S的状态(0或1)
  2. 如果S=0,则返回第一步
  3. 如果S=1,则置其为0
// 上锁源语
void Lock(S) {
test:
if (S == 0) {
goto test;
} else {
S = 0; // 上锁
}
}

开锁操作

步骤

  1. 把锁S的状态置1
// 开锁愿语
void Unlock(S) {
S = 1;
}

用锁机制访问临界区

  1. 初始化锁的状态S=1(可用)
  2. 进入临界区前执行上锁Lock(s)操作
  3. 离开临界区之后执行开锁unlock(s)操作
graph TB
S=1-->上锁Lock
上锁Lock-->临界区
临界区-->开锁Unlock

最新文章

  1. C#使用ADO.NET访问数据库(一)
  2. javascript深入浅出(imooc)
  3. 深度讲解VIEWPORT和PX是什么?移动端单位px,em,rem
  4. android studio sdk 配置
  5. Kotlin:Android世界的Swift
  6. CSS 高级语法 ---- 继承和选择器的分组
  7. ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)
  8. GoF的23个经典设计模式
  9. CODEVS 1638 修复公路
  10. HDOJ/HDU 1250 Hat's Fibonacci(大数~斐波拉契)
  11. Shell上传文件到ftp
  12. SCU 2009(数位dp)
  13. JavaScript设计模式--门面模式
  14. redis 系列2 知识点概述
  15. 对C#调用C++的dll的一点思考
  16. Android MVP 架构一 View与Presenter
  17. Gym 102091L Largest Allowed Area 【二分+二维前缀和】
  18. python 05集合
  19. laravel5.2 开发中打印sql语句
  20. ASP.NET MVC5 高级编程-学习日记-第二章 控制器

热门文章

  1. java 数据结构(二):java常用类 二 StringBuffer、StringBuilder
  2. 数据可视化之powerBI基础(九)Power BI中的“新表”,你会用吗?
  3. SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
  4. Linux06 /Python web项目部署
  5. 什么是A站、B站、C站、D站、E站、F站、G站、HIJKLM站N站?
  6. 题解 CF1359B 【New Theatre Square】
  7. 自学 Python 到什么程度能找到工作,1300+ 条招聘信息告诉你答案
  8. TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?
  9. java8之Stream流处理
  10. EF Code 如何输出sql语句