第2章 进程与线程(3)

2.3 同步与互斥

引入同步的原因是【进程的并发具有异步性,以各自独立不可预知的速度推进】

2.3.1 同步与互斥的基本概念

1.临界资源:一次仅仅允许一个进程所使用的资源叫做临界资源
2.同步:进程同步是确保多个进程在共享资源的访问过程中按照一定规则进行协调和管理的过程。
基本原则:

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待(得不到处理机就进入阻塞态)

3.互斥:间接制约关系。一次只允许一个进程使用资源。


2.3.2 实现临界区互斥的进本方法

1.软件实现方法:
(1)算法一:单标志法:【只检查不上锁】

只有一个变量turn用于标记允许哪个进程访问。
资源只能轮流使用。若当前标记的是对方,即使对方没有使用,自己也不能使用
违背"空闲让进"原则:若当前标志不是当前需要访问的进程的标志,将会一直忙等。
在这里插入图片描述

(2)算法二:双标志法先检查:【先检查后上锁】(满足了“空闲让进”原则,允许交替使用)

使用bool型数组记录,哪个进程正在访问哪个进程的记录就位true
先检查对方是否占用资源,然后自己锁定资源
违背"忙则等待"原则:若两个进程的检查和上锁是交替运行的,会导致两个进程同时占用资源。(下图为例)【按照1,2,3,4顺序执行】
在这里插入图片描述

(3)算法三:双标志法后检查:【先上锁后检查】

使用bool型数组记录,哪个进程正在访问哪个进程的记录就位true
先对资源上锁,然后检查对方是否在使用
违背"空闲让进"原则:若两个进程的上锁和检查时交替运行的,会导致两个进程同时被对方锁住。会造成死锁(饥饿)(下图为例)【按照1,2,3,4顺序执行】
在这里插入图片描述

(4)算法四:皮特森算法:【结合算法一和算法三的思想】

同时使用bool数组和turn变量
bool数组表示进程想使用资源的意愿,turn表示可以让给其他进程先使用
先表明自己想使用资源,然后表示可以让其他进程先使用。若turn不是其他进程或其他进程没有使用资源的意愿,自己就可以占用资源。
违背"让权等待"原则:若资源不能得到,也不能下处理机。不存在死锁(饥饿)

在这里插入图片描述

单标志法双标志法先检查双标识法后检查皮特森算法
使用过程轮流使用先检查其他是否正在使用,在自己上锁先上锁,再检查其他进程是否在使用先表明自己想使用,再把使用权让给其他进程,若其他进程没有使用的意愿或使用权不在其他进程,则自己可以使用
缺陷违背"空闲让进"违背"忙则等待"违背"空闲让进"违背"让权等待"
使用变量一个公用整形变量"turn"一个bool数组"flag"一个bool数组"flag"一个公共整形变量"turn"和一个bool数组"flag"



2.硬件实现方法:
(1)中断屏蔽字

使用关中断和开中断来禁止切换进程,就不会出现互斥的问题。

优点:简单高效
缺点:不适合多处理机,只适合内核进程使用。可能会导致系统效率降低。

(2)硬件指令方法

由硬件逻辑上实现,不会被中断。
不能实现让权等待,产生饥饿现象

  • TestAndSet指令【一边检查一边上锁】
    本身为原子操作,不会被中断,也不允许关中断
    注意!!!【若长期使用,且在等待期间处于关中断状态,其他进程的操作会收到影响,从而影响到整个系统】

    优点:实现简单。适合多处理机系统【与总线相关】。
    缺点:不满足"让权等待",会持续等待
    在这里插入图片描述
  • swap指令【一边检查一边上锁】
    本身为原子操作,不会被中断,也不允许关中断
    优点:实现简单。适合多处理机系统【与总线相关】。
    缺点:不满足"让权等待",会持续等待
    在这里插入图片描述
硬件实现的优点:允许任意数量进程,单处理机和多处理机都适用!!!
硬件实现的缺点:不能让权等待,会产生`饥饿现象`

2.2.3 互斥锁

通过原子操作函数acquire()获得锁和release()释放锁。

属于`自旋锁`,需要循环忙等。{TSL,SWAP,单标志}都属于`自旋锁`
只适用于多处理机系统,互斥会导致进程处于持续等待的状态。

`为什么说适用于多处理机`:在忙等期间,单处理机会切换进程。若使用时间短但是使用频率很高造成切换进程的开销会增大。
多处理机只会使用`一个核`的资源,不影响其他核心。`单处理机`吃掉了唯一的核。

2.2.4 信号量{考试题目默认是记录型变量}

信号量用于解决同步和互斥问题。
使用原语【wait(s)/p操作】申请资源和【signal(s)/v操作】释放资源
p,v方式是一种低级的通信方式【相对于"共享存储",“消息传递”,“管道通信”】

1.整形信号量【不满足让权等待】

只有一个整数变量S用于记录资源的数量

`S>0说明有空闲资源`
`S<=0说明无空闲资源,其绝对值就是进程的等待数量`\\注意不是阻塞,而是等待。阻塞会放弃处理机,等待不会放弃处理机。

过程描述:
(1)wait函数用于申请资源,若s<=0,说明无资源可以使用,将进入循环等待阶段。
(2)signal函数用于释放资源(s=s+1)。若wait在等待时发现s>0,循环等待可以结束。
在这里插入图片描述

2.记录型信号量【满足让权等待】

使用结构类型变量semaphore记录资源数S和阻塞进程队列L

`s>0说明有空闲资源,s<0说明无空闲资源,s的绝对值就是阻塞队列中进程的个数`
`L代表申请资源却得不到资源的进程的队列`

过程描述:
(1)wait函数用于申请资源,先资源数-1,若s<=0,说明无资源可以使用,将插入阻塞队列队尾,且自动放弃处理机。

在这里插入图片描述
(2)signal函数用于释放资源(s=s+1)先资源数+1然后从阻塞队列唤醒队首进程,使其从阻塞态变成就绪态,等待处理机调度。
在这里插入图片描述

3.利用信号量实现同步,互斥和前驱关系

互斥设置信号量,整形s初始化设置为1,结构型s设置为资源数量。为0就阻止其他进程进入(先p后v)
同步设置信号量初始值由用户确定【可能已经存在资源】(先v后p)

在这里插入图片描述


2.3.5 管程【软件

每次仅仅允许一个进程在管程内执行某个内部过程/函数。
外部进程/线程只能通过管程提供的特定"入口"访问。每次只开放一个入口。
管程组成 { 1. 管程名称 2. 局部于管道内部的共享数据结构说明 3. 对于该数据结构操作的函数 4. 初始化内部数据语句 管程组成\begin{cases}1.管程名称\\ 2.局部于管道内部的共享数据结构说明\\ 3.对于该数据结构操作的函数\\ 4. 初始化内部数据语句 \end{cases} 管程组成 1.管程名称2.局部于管道内部的共享数据结构说明3.对于该数据结构操作的函数4.初始化内部数据语句

对比结构型信号量管程

结构型信号量管程
阻塞时机在wait操作/p操作内检查到资源不足1.在使用过程前已有进程使用,会被阻塞在过程外。2.过程内部检测到没有资源
signal/v操作包含了资源+1和唤醒操作其他过程给资源+1,调用signal时才唤醒

管程
在这里插入图片描述

信号量
在这里插入图片描述

相似点:条件变量的wait/signal操作类似信号量的P/V操作,可实现进程的阻塞唤醒
不同点:条件变量没有值,仅实现排队功能。信号量是有值的,反映剩余资源数量管程用共享数据结构记录。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 徒手抓取trace方式

1, 打开开发者选项 2, 进入开发者选项中系统跟踪 3,使能系统跟踪中选项 4,可在下拉框快捷关闭trace跟踪 5,停止跟踪 会生产trace文件,路径如下: /data/local/traces

助推直播产业升级与经济转型 天府锋巢直播产业基地成都开园

2023年年末&#xff0c;位于成都天府新区兴隆湖板块的天府锋巢直播产业基地正式开园&#xff0c;为成都直播产业注入了新的活力&#xff0c;助推成都经济转型和产业升级。天府锋巢直播产业基地的成立&#xff0c;不仅是成都直播产业的一大盛事&#xff0c;更是对成都经济发展的…

计算机毕业设计 | SpringBoot+vue 移动端社区物业管理系统(附源码+论文)

1&#xff0c; 概述 课题背景 近几年来&#xff0c;随着物业相关的各种信息越来越多&#xff0c;比如报修维修、缴费、车位、访客等信息&#xff0c;对物业管理方面的需求越来越高&#xff0c;我们在工作中越来越多方面需要利用网页端管理系统来进行管理&#xff0c;我们所需…

【LeetCode热题100】104. 二叉树的最大深度(二叉树)

一.题目要求 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&am…

敏感信息泄露到接管云服务器

通过信息收集发现子域为xx.xx.com网站&#xff0c;打开先找功能点&#xff0c;测试登录&#xff0c;是微信扫描登录&#xff0c;自己太菜&#xff0c;测试一圈没测出来什么 指纹识别发现是js开发&#xff0c;如果登录或者找回密码不是扫码登录的话&#xff0c;八成是前端验证&a…

由浅到深认识C语言(9):动态内存分配

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

深度解读:如何解决Image-to-Video模型视频生成模糊的问题?

Diffusion Models视频生成-博客汇总 前言&#xff1a;目前Image-to-Video的视频生成模型&#xff0c;图片一般会经过VAE Encoder和Image precessor&#xff0c;导致图片中的信息会受到较大损失&#xff0c;生成的视频在细节信息上与输入的图片有较大的出入。这篇博客结合最新的…

Docker 哲学 - docker-compose.yml 管理多个容器

compose 启动容器的 volume 和 network名字的生成规则 如果在 docker-compose.yml 文件中没有明确定义 networks&#xff0c;Docker Compose 会默认为所有服务创建一个默认的网络。 如果你想自定义网络&#xff0c;你可以在 docker-compose.yml 文件的顶级定义 networks 2、com…

【Spring Cloud】Sentinel限流

控制台下载https://github.com/alibaba/Sentinel/releases # 控制台启动 java -Dserver.port10888 -Dcsp.sentinel.dashboard.serverlocalhost:10888 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar引入依赖 <dependency><groupId>com.alibaba.c…

RedisCluster集群中的插槽为什么是16384个?

RedisCluster集群中的插槽为什么是16384个&#xff1f; CRC16的算法原理。 1.根据CRC16的标准选择初值CRCIn的值2.将数据的第一个字节与CRCIn高8位异或3.判断最高位&#xff0c;若该位为0左移一位&#xff0c;若为1左移一位再与多项式Hex码异或4.重复3至9位全部移位计算结束5…

【ArcGIS 脚本工具】强制移动要素类,绕过空间参考不一致

作为一个合格的数据管家&#xff0c;自然要让自己的数据库井井有条。 于是想着整理一下数据库里面的七零八落的要素类&#xff0c;按 数据库-要素数据集-要素类 的方式整理。 但是将要素类移动到要素数据集内的时候经常会出现下面的报错。 这大概率是因为要素类的坐标系与目标…

【数据库】基础操作

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

一、yocto 编译raspberrypi 4B并启动

yocto 编译raspberrypi 4B并启动 yocto 编译raspberrypi 4B并启动环境准备代码下载编译及配置烧录 yocto 编译raspberrypi 4B并启动 本篇文章为基于raspberrypi 4B单板的yocto实战系列的开篇之作。 环境准备 最近到手一个树莓派4B&#xff0c;准备拿来玩一玩&#xff0c;下面…

电动工具直流调速专用集成电路芯片S069——具有电源电压范围宽、功耗小、抗干扰能力强等特点

GS069是CMOS工艺、电动工具直流调速专用集成电路。具有电源电压范围宽、功耗小、抗干扰能力强等特点。 应用范围&#xff1a;广泛应用于各种电动工具。 02 产品基本参数 03 产品应用 1、应用图&#xff1a; 2、测试参数&#xff1a;&#xff08;VCC9V&#xff0c;RL2K&#x…

osgEarth学习笔记1-安装osgEarth开发环境

原文链接 本文主要是为了防止丢失&#xff0c;做一些记录&#xff0c;仅供个人学习使用。 QGis的学习和使用基本告一段落了。日常的应用已经离不开QGis了&#xff0c;常用的QGis-API和跨平台的QTQGis开发已经十分熟练了。涉及遥感和GIS领域的二维可视化、数据处理使用QT搭配Q…

C语言例3-18:使用关系表达式的例子

关系表达式的一般形式&#xff1a; 表达式 关系运算符 表达式 最初代码如下&#xff1a; #include<stdio.h> int main(void) {int i3,j4,k5;float f11.0, f22.1;char c1a, c2d; //a(97) d(100)printf("i>j 的结果为&#xff1a…

深度学习——微积分基础

目录 1、导数和微分 1.1 定义函数&#xff1a; 1.2 趋近过程&#xff1a; 1.3 绘图表示&#xff1a; 2、偏导数 3、梯度 4、链式法则 5、学习心得 在2500年前&#xff0c;古希腊人把一个多边形分成三角形&#xff0c;并把它们的面积相加&#xff0c;才找到计算多边形面积…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候&#xff0c;肯定会遇到获取DOM内容的情况。 以往&#xff0c;我们是用原生的js方法去获取&#xff0c;如document.getXxxx 但是&#xff0c;这中方法会有个问题&#xff0c;如果父组件和子组件的id相同&#xff0c;则会出错。 在Vue3中&…

Unity游戏项目接广告

Unity游戏项目中接入GoogleAdMob 先看效果图 接入测试横幅广告&#xff0c;代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System;public class GoogleAdMobManager : MonoBehavi…

观察者模式的理解和引用

1.前言 在之前的H5小游戏中&#xff0c;对于长连接发送的不同类型数据包的处理&#xff0c;是通过switch语句进行处理的&#xff0c;于是在自己的代码中出现了大量的case分支&#xff0c;不方便进行维护和后期的版本迭代。于是在老师的指导下&#xff0c;开始寻求使用观察者模…