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

【av68676164(p23-p24)】临界区和锁的更多相关文章

  1. ### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明标量变量 "@P23@P24"。(sql少一个逗号)【??】

    (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,[??],?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ...

  2. 第8章 用户模式下的线程同步(2)_临界区(CRITICAL_SECTION)

    8.4 关键段(临界区)——内部也是使用Interlocked函数来实现的! 8.4.1 关键段的细节 (1)CRITICAL_SECTION的使用方法 ①CRITICAL_SECTION cs;   ...

  3. Singleton、MultiThread、Lib——实现单实例无锁多线程安全API

        前阵子写静态lib导出单实例多线程安全API时,出现了CRITICAL_SECTION初始化太晚的问题,之后查看了错误的资料,引导向了错误的理解,以至于今天凌晨看到另一份代码,也不多想的以为s ...

  4. linux 自旋锁

    一.概述: 自旋锁是SMP架构中的一种low-level的同步机制.当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了.对于自选锁需要注意: 由于自 ...

  5. java锁机制

    2.4 锁机制        临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...

  6. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  7. Linux内核中锁机制之RCU、大内核锁

    在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...

  8. 大话Linux内核中锁机制之RCU、大内核锁

    大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...

  9. 操作系统下spinlock锁解析、模拟及损耗分析

    关于spinlock 我们在知道什么是spinlock之前,还需要知道为什么需要这个spinlock?spinlock本质就是锁,提到锁,我们就回到了多线程编程的混沌初期,为了实现多线程编程,操作系统 ...

随机推荐

  1. java 数据结构(五):数据结构简述

    1.数据结构概述数据结构(Data Structure是一门和计算机硬件与软件都密切相关的学科,它的研究重点是在计算机的程序设计领域中探讨如何在计算机中组织和存储数据并进行高效率的运用,涉及的内容包含 ...

  2. Activiti工作流--分布式实现方案

    一.运行环境 以下所有的描述都是基于Activiti的5.20.0.1版本 public interface ProcessEngine extends EngineServices { /** th ...

  3. hihoCoder 1051 补提交卡 最详细的解题报告

    题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...

  4. less基础

    less less的含义: less是一种动态样式语言,属于css预处理器的范畴,它扩展了css语言,增加了变量.Mixin.函数等特性,使css更易维护和扩展. 此外,less既可以在客户端上运行, ...

  5. SpringBoot 接收前端参数的几种方式

    昨天和前端小伙伴在联调是碰到了参数接收不到的错误,我在postman上测试接口是正常的,但是与前端对接时就接受不到参数,请求方式都是get,但是问题就在于json  和 form-data 的区别!这 ...

  6. NVIDIA GPU Volta架构简述

    NVIDIA GPU Volta架构简述 本文摘抄自英伟达Volta架构官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Ce ...

  7. 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)

    一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...

  8. HashMap 中 get,put 方法源码实现

    HashMap 是Map接口的一个实现类 1.线程 HashMap 非线程安全2.数据存储结构 hashMap采用Entity数组来存储 key-value对,每一个键值对组成一个Entity,键值对 ...

  9. socket链接

    服务端: package com.batch.service.impl; import java.io.BufferedReader; import java.io.BufferedWriter; i ...

  10. spring tx——TransactionManger

    TransactionDefinition--事务定义 定义事务属性,包括传播级别.隔离级别.名称.超时.只读等 TransactionStatus--事务状态 事务状态,包含事务对象(jdbc为Da ...