OS_同步与互斥

2024-07-04:操作系统同步与互斥学习笔记

第9节 同步与互斥

  • 9.1 同步互斥的基本概念
    • 9.1.1 同步关系
    • 9.1.2 互斥关系
    • 9.1.3 临界资源
    • 9.1.4 临界区
    • 9.1.5 同步机制应遵循规则
  • 9.2 软件同步机制
    • 9.2.1 单标志法
    • 9.2.2 双标志先检查法
    • 9.2.3 双标志后检查法
    • 9.2.4 peterson算法
  • 9.3 硬件同步机制
    • 9.3.1 关中断
      • (1) 关中断的定义
      • (2) 关中断的缺点
    • 9.3.2 Test-and-Set 指令(TS指令)
    • 9.3.3 Swap指令
  • 9.4 信号量机制
    • 9.4.1 整型信号量
    • 9.4.2 记录型信号量
      • (1) 利用信号量实现进程互斥
      • (2) 利用信号量实现进程同步


并发的进程或者程序在执行的时候会失去封闭性,也就是说如果有两个程序分别地区使用一个共享的资源,可能会导致每一次运行的结果都不一样
在这里插入图片描述
原因就是我们没有保护程序a和程序b都要去访问的这个共享资源x


9.1 同步互斥的基本概念

9.1.1 同步关系

相互制约的关系就是同步,同步通俗一点理解就是它们进程之间执行的时候要有一个次序
在这里插入图片描述


9.1.2 互斥关系

间接相互制约的关系就称为互斥关系,eg.打印机
在这里插入图片描述


9.1.3 临界资源

  • 在一段时间内只允许一个进程访问的资源,称为临界资源(或独占资源)
  • 对于临界资源的共享,各进程之间应该采用互斥方式

“生产者和消费者模型”
在这里插入图片描述counter+ +

首先把变量放到寄存器里面
register1 = counter;
接下来对寄存器进行一个自增
register1 = register1 + 1;
再把结果返回到counter里
counter = register1;

counter- -

首先把变量放到寄存器里面
register2 = counter;
接下来对寄存器进行一个自减
register2 = register2 - 1;
再把结果返回到counter里
counter = register2;

在这里插入图片描述

解决办法:把counter当做临界资源处理,令进程互斥地访问变量counter(后面会学到同步机制)


9.1.4 临界区

不管是硬件临界资源还是软件的临界资源,多个进程必须互斥地访问
在这里插入图片描述
这些区本质都是代码

  • 进入区
  • 临界区
  • 退出区
  • 剩余区

9.1.5 同步机制应遵循规则

  • 空闲让进

无进程处于临界区时,表明临界区资源空闲,应允许一个请求进入临界区的进程立即进入自己的临界区,有效利用资源。

  • 忙则等待

已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问

  • 有限等待

对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,避免陷入”等死“状态

  • 让权等待

进程不能进入自己的临界区时,应立即释放处理机(CPU),以免进程陷入”忙等“状态


9.2 软件同步机制

9.2.1 单标志法

  • 设置一公用整型变量来标明是否有进程在临界中,如果已有进程在临界区,则在进入区通过循环检查进行等待,进程离开临界区后则在退出区修改标志
  • 单标志法设置一个公用整型变量turn,指示允许进入临界区的进程编号,turn=0时允许进程P0进入临界区
  • turn=1时允许进程P1进入临界区,退出临界区将临界区使用权赋予另一个进程(Pi推出临界区时,令turn=j)

在这里插入图片描述
在这里插入图片描述
两个进程必须交替进入临界区,若一个进程不再进入临界区,则另一个进程也无法进入临界区,违背了“空闲让进”准则


9.2.2 双标志先检查法

双标志先检查法设置一个布尔型数组flag[2],用来标记各个进程想进入临界区的意愿,flag[i]=true,表示Pi想进入临界区。

  • Pi进入临界区前,先检查对方是否进入临界区,若想,则等待
  • 否则,将flag[i]设置为true后,再进入临界区
  • 当Pi退出临界区时,将flag[i]设置为false

在这里插入图片描述

在这里插入图片描述

  • while循环相当于红绿灯机制
  • 设置对方的flag相当于改对方的红绿灯
  • 但由于两个进程都是先检查flag[先看红绿灯],初始时均为false[均为绿灯],所以可能两个进程同时通过红绿灯,一起进入临界区

9.2.3 双标志后检查法

双标志后检查法会检查对方的标志再设置自己的,这俩操作无法一气呵成,于是两个进程可能同时进入临界区;所以想出了后检查法,先设置自己的标志,再检查对方的标志,若对方标志位true则等待;否则进入临界区

在这里插入图片描述
在这里插入图片描述


9.2.4 peterson算法

peterson算法结合了单标志法双标志后检查法的思想,利用flag[]解决互斥访问问题,在利用turn解决饥饿问题。

若双方都争着进入临界区,则可让进程将进入临界区的机会让给对方。
每个进程进入临界区之前,设置自己的flag标志,在设置允许进入turn标志,之后,再同时检测对方的flag和turn,以保证双方同时要求进⼊临界区时,只允许⼀个进程进入
在这里插入图片描述
没有做到让权等待
在这里插入图片描述


9.3 硬件同步机制

软件解决各个进程互斥进入临界区的问题有难度,而且有很大的局限性,所以计算机提供一些特殊的硬件指令来解决问题

9.3.1 关中断

(1) 关中断的定义

  • 关中断在计算机组成原理里面接触过,它指的是去修改CPU中PSW这个寄存器里面的一位,这一位会去控制现在CPU会不会去相应中断,这个中断只能挡住可屏蔽中断,不可屏蔽中断挡不住
  • 操作系统里面进程的调度都是依赖中断去实现的,比如时钟中断
  • 有进程再临界区执行期间,计算机系统关中断,从而不会引发调度,也就不会有进程或线程切换

(2) 关中断的缺点

  • 滥用终端会导致严重后果
  • 关中断时间过长,会影响系统效率
  • 关中断方法不适用于多CPU系统,在一个处理器上关中断不能防止进程在其他处理器上执行相同临界代码

9.3.2 Test-and-Set 指令(TS指令)

在这里插入图片描述

TS指令可以看作一个执行过程不可分割的函数过程(原语)

  • lock有两种状态:
    • *lock=FALSE表示资源空闲
    • *lock=TRUE表示资源正被使用

使用TS管理临界区,要为每个临界资源设置一个lock

  • 初值为FALSE,表示临界资源空闲
  • 进程进入临界区之前,先用TS测试lock,如果是FALSE,则可以进入,并将TRUE值赋给lock,关闭了临界资源

9.3.3 Swap指令

在这里插入图片描述
称为对换指令,用于交换两个字的内容

  • 为每个临界资源设置一个全局布尔变量lock,初值FALSE
  • 利用上面的硬件指令完成进程互斥
  • 但是这种方法也会造成访问进程不断进行测试,处于“忙等”状态,不符合“让权等待”原则

9.4 信号量机制

9.4.1 整型信号量

被定义为一个用于表示资源数目的整型量S,对于这个整型信号量的操作只有三种:初始化(赋初值)、wait(自减)、signal(自增)
在这里插入图片描述

  • wait和signal均为原子操作,执行时不可中断
  • 当一个进程在修改某信号量时,没有其他进程可以同时对该信号量进行修改

9.4.2 记录型信号量

不存在“忙等”现象的进程同步机制

  • 除了一个用于代表资源数目的整型变量value外
  • 还需要增加一个进程链表L,用于链接所有等待该资源的进程

在这里插入图片描述

  • wait操作等价于P操作
  • signal操作等价于V操作
  • 只是两种不同的称呼,功能完全一致
  • wait(A) = P(A)
  • signal(B) = V(A)

(1) 利用信号量实现进程互斥

设置一个互斥信号量mutex=1,然后把各进程访问临界资源的临界区放在wait(mutex)和signal(mutex)之间
在这里插入图片描述


(2) 利用信号量实现进程同步

设置一个同步信号量S=0,让需要先执行的语句signal(S),后执行的wait(S)
在这里插入图片描述

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

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

相关文章

Rust代码优化的九大技巧

一.使用 Cargo 内置的性能分析工具 描述:Cargo 是 Rust 的包管理器,带有内置工具来分析代码性能,以识别性能瓶颈。 解释: 发布模式:在发布模式下编译启用优化,可以显著提高性能。 cargo build --release基…

匠芯创汽车电子方案应用

汽车电子是指应用于汽车中的各种电子技术、电子设备和电子控制系统。它覆盖了车辆的信息娱乐系统、车辆控制系统、车辆通讯系统等多个方面。汽车电子通过增强车辆的性能、安全和乘坐体验,成为现代汽车设计和制造中不可或缺的一部分。 匠芯创ArtInChip应用芯片&#…

什么是敏捷本地化

快速、敏捷的多语言产品和服务交付正逐渐成为众多行业的常态。在这种情况下,重点从传统的期望(即在合理的时间框架内翻译大量内容)转变为翻译工作量非常大的小片段,通常在2-3到12-24小时之间,通常在周末或假期。 Logr…

海狐外卖O2O商城系统:技术架构与运营模式的深度解析

摘要: 本文深入探讨了海狐外卖O2O商城系统的技术架构、功能特性以及运营模式。海狐外卖作为一款专注于细分市场领域的外卖餐饮解决方案,不仅拥有先进的技术栈支持,还通过丰富的系统插件和灵活的运营模式,为商户和用户提供高效、便…

构建未来对话:从零开始实现基于Vue 3的AI聊天页面

大家好,今天我们将一起探索如何从零开始,使用Vue 3构建一个AI对话页面。这个过程不仅会让我们了解Vue 3的新特性,还会让我们对构建交互式Web应用有一个全新的认识。如果你是编程新手,别担心,我会用通俗易懂的语言&…

AI大模型API:开启智能应用的新纪元

AI大模型API是当今技术领域的重要突破,它们以其卓越的性能和强大的计算能力引领着人工智能的发展。这些API不仅仅是一种技术工具,更是推动智能化时代的核心驱动力。通过AI大模型类API,我们可以利用先进的算法和深度学习模型,实现各…

LeetCode之最长回文子串

1.题目链接 5. 最长回文子串 - 力扣(LeetCode)https://leetcode.cn/problems/longest-palindromic-substring/description/ 2.题目解析 对于这道题目我们可以使用动态规划的思路来求解,具体思路是,对于一个长度大于2的子串&…

Python爬虫教程第5篇-使用BeautifulSoup查找html元素几种常用方法

文章目录 简介find()和find_all()字符串通过id查找通过属性查找通过.方式查找通过CSS选择器查找通过xpath查找正则表达自定义方法总结 简介 上一篇详细的介绍了如何使用Beautiful Soup的使用方法,但是最常用的还是如何解析html元素,这里再汇总介绍下查询…

Sprint Boot 2 核心功能(一)

核心功能 1、配置文件 application.properties 同基础入门篇的application.properties用法一样 Spring Boot 2 入门基础 application.yaml(或application.yml) 基本语法 key: value;kv之间有空格大小写敏感使用缩进表示层级关系缩进不允…

Doze和AppStandby白名单配置方法和说明

机制 配置路径 配置案例 说明 影响机制 调试命令 Doze /platform/frameworks/base /data/etc/platform.xml allow-in-power-save 【系统应用Doze白名单配置】 Doze\Job\AppStandby\Alarm\WakeLock\Sync 查看Doze白名单:adb shell dumpsys deviceidle 添加Doze白名单…

系统服务综合实验

实验需求: 现有主机 node01 和 node02,完成如下需求: 在 node01 主机上提供 DNS 和 WEB 服务dns 服务提供本实验所有主机名解析web服务提供 www.rhce.com 虚拟主机该虚拟主机的documentroot目录在 /nfs/rhce 目录该目录由 node02 主机提供的…

Mocreak:一键自动化部署Microsoft Office,高效办公必备

Mocreak是一款用于自动化下载、安装和部署 Microsoft Office 的办公增强工具。这款软件完全免费、无GG、绿色、无毒,并且具备简约、高效和安全的特点。它支持一键快速下载、安装和部署最新版的 Microsoft Office 软件,并提供了一个简约且可自定义的图形界…

xcode项目添加README.md文件并进行编辑

想要给xcode项目添加README.md文件其实还是比较简单的,但是对于不熟悉xcode这个工具的人来讲,还是有些陌生,下面简单给大家讲一下流程。 选择“文件”>“新建”>“文件”,在其他(滚动到工作表底部)下…

2022 RoboCom省赛题目解析

题目解析&#xff1a;这就是一题很简单的模拟&#xff0c;直接上代码&#xff1b; #include<iostream> using namespace std; const int N 10010; int arr[N]; int main() {int n , m;cin >> n >> m;int sum 0;int res 0;for(int i 0; i < n;i ) cin…

【计算机组成原理 | 第一篇】计算机硬件的发展

前言&#xff1a; 在信息时代&#xff0c;计算机已经成为我们生活和工作中不可或缺的工具。它们以各种形态存在&#xff0c;从个人电脑到智能手机&#xff0c;再到庞大的数据中心&#xff0c;计算机的应用无处不在。然而&#xff0c;无论计算机的形态如何变化&#xff0c;它们的…

甘蔗基因组--文献精读30

A chromosomal-scale genome assembly of modern cultivated hybrid sugarcane provides insights into origination and evolution 现代栽培杂交甘蔗的染色体级基因组组装提供了起源和进化的洞见&#xff0c;确实甘蔗好几个基因组了~ 摘要 甘蔗是一种具有重要经济和工业价值…

完美解决:MySQL8报错:Public Key Retrieval is not allowed

在配置数据源的时候直接将属性allowPublicKeyRetrieval设置为true即可 &AutoReconnecttrue

Dify中的知识库API列表

1.知识库API列表 通过文本/文件创建/更新/删除文档/查询文档嵌入状态&#xff0c;知识库创建/知识库查询/文档列表查询&#xff0c;分段增/删/改/查。 接口名字功能描述请求示例POST/datasets/{dataset_id}/document/create_by_text通过文本创建文档此接口基于已存在知识库&a…

【常见开源库的二次开发】一文学懂CJSON

简介&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。它基于JavaScript的一个子集&#xff0c;但是JSON是独立于语言的&#xff0c;这意味着尽管JSON是由JavaScript语法衍生出来的&#xff0c;它可以被任何编程语言读取和生成…

CSS 【实用教程】(2024最新版)

CSS 简介 CSS 是层叠样式表( Cascading Style Sheets ) 的简写&#xff0c;用于精确控制 HTML 页面的样式&#xff0c;以便更好地展示图文信息或产生炫酷/友好的交互体验。 没有必要让所有浏览器都显示得一模一样的&#xff0c;好的浏览器有更好的显示&#xff0c;糟糕的浏览器…