OS_同步与互斥

news2024/9/20 16:50:03

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)
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows安装Docker Desktop及国内镜像

简介 Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。通过Docker工具,简化了应用的部署、配置和管理过程,提高…

Python 核心编程

Python 核心编程 1. 数据类型1.1 整型 int1.2 浮点数 float1.3 布尔类型 bool1.4 字符串 str1.5 列表 list1.6 元组 tuple1.7 集合 set1.8 字典 dict 2. 逻辑结构、文件操作2.1 分支结构和三元表达2.2 循环和遍历2.3 目录和路径2.4 文件操作 3. 函数、类、异常处理3.1 函数3.2 …

int类型变量表示范围的计算原理

文章目录 1. 了解2. 为什么通常情况下int类型整数的取值范围是-2147483648 ~ 21474836473. int类型究竟占几个字节4. 推荐 1. 了解 通常情况下int类型变量占4个字节,1个字节有8位,每位都有0和1两种状态,所以int类型变量一共可以表示 2^32 种状…

p15 p16 c语言实现三子棋

具体的实现代码 game.c #include "game.h"void InitBoard(char board[ROW][COL], int row, int col) {int i 0;int j 0;for (i 0; i < row; i) {for (j 0; j < col; j) {board[i][j] ;}} }void DisplayBoard(char board[ROW][COL], int row, int col) …

C++:组合和继承的区别

组合介绍以及与继承对比 什么是组合 (1)composition&#xff0c;组合&#xff0c;就是在一个class内使用其他多个class的对象作为成员 (2)用class tree做案例讲解 (3)组合也是一种代码复用方法&#xff0c;本质也是结构体包含 #include <iostream> #include <vector…

达梦数据库中的线程和进程

达梦数据库中的线程和进程 在达梦数据库中&#xff0c;线程和进程的概念与操作系统中的定义类似&#xff0c;但有一些特定的实现细节和用途。以下是达梦数据库中线程和进程的一些关键点&#xff1a; 进程&#xff08;Process&#xff09;&#xff1a; 在达梦数据库中&#x…

在亚马逊云科技AWS利用IaC(基础设施即代码)设计和搭建云原生架构(附免费学习教程和证书)

今天小李哥为大家介绍的是利用IaC(基础设施即代码)设计和搭建亚马逊云科技AWS云原生架构。本篇文章将会介绍如何在亚马逊云科技上搭建云原生Serverless服务&#xff0c;所使用的开发服务介绍&#xff0c;并展示搭建云原生架构的cdk代码。小李哥同时会给大家分享快速学习亚马逊云…

第一关:Linux基础知识

Linux基础知识目录 前言LinuxInternStudio 关卡1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH&#xff1f;2.2 如何使用SSH远程连接开发机&#xff1f;2.2.1 使用密码进行SSH远程连接2.2.2 配置SSH密钥进行SSH远程连接2.2.3 使用VScode进行SSH远程连接 2.3. 端口映射…

Linux 程序卡死的特殊处理

一、前言 Linux环境。 我们在日常编写的程序中&#xff0c;可能会出现一些细节问题&#xff0c;导致程序卡死&#xff0c;即程序没法正常运行&#xff0c;界面卡住&#xff0c;也不会闪退... 当这种问题出现在客户现场&#xff0c;那就是大问题了。。。 当我们暂时还无法排…

1、项目目录设计

文章目录 前言一、项目目录设计 前言 本项目我们将会完成一个Go项目开发框架&#xff0c;该项目不会包含具体的CRUD业务代码&#xff0c;而是从头搭建一个工作中实用的开发框架。让开发者能够熟悉整个项目的搭建流程&#xff0c;能够独立完成项目从0到1的搭建&#xff0c;而且…

【爬虫】解析爬取的数据

目录 一、正则表达式1、常用元字符2、量词3、Re模块4、爬取豆瓣电影 二、Xpath1、Xpath解析Ⅰ、节点选择Ⅱ、路径表达式Ⅲ、常用函数 2、爬取豆瓣电影 解析数据&#xff0c;除了前面的BeautifulSoup库&#xff0c;还有正则表达式和Xpath两种方法。 一、正则表达式 正则表达式…

Pandas数学函数大揭秘:让数据处理变得如此简单高效,轻松玩转数据分析新纪元!

1.导包 # 导包 import numpy as np import pandas as pd2.聚合函数 df pd.DataFrame(datanp.random.randint(0,100,size(5,3))) df01203550281552376231419335895434679917 # 列非空元素的数量 df.count()0 5 1 5 2 5 dtype: int64# 行非空元素的数量 df.count(ax…

tableau范围-线图与倾斜图绘制 - 14

范围-线图与倾斜图 1.范围-线图1.1 含义1.2 范围-线图1.2.1 折线图绘制1.2.2 设置计算字段1.2.3 添加详细信息1.2.4 添加参考线1.2.5 结果 2. 倾斜图2.1 含义2.2 倾斜图绘制2.2.1 数据导入2.2.2 创建计算字段2.2.3 排名编辑表计算2.2.4 显示标签2.2.5 标签格式设置2.2.6 修改排…

系统服务综合作业01

题目&#xff1a; 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

RK3568平台开发系列讲解(内存篇)Linux进程内存的消耗统计

🚀返回专栏总目录 文章目录 一、VSS(Virtual Set Size)二、RSS(Resident Set Size)三、PSS(Proportional Set Size)四、USS(Unique Set Size)五、其他工具Linux 提供了多种进程内存占用的度量指标, 它们反映了不同的内存使用特征: VSS 反映进程虚拟内存总需求, 包括未…

启航IT之旅:为新生绘制的学习路线图

随着七月的热浪悄悄席卷而来&#xff0c;各地高考成绩陆续放榜&#xff0c;对于刚迈过高考这座独木桥的你们&#xff0c;这不仅仅是一个故事的终章&#xff0c;更是另一段冒险的序曲。特别是那些心中有一团IT火焰燃烧的少年们&#xff0c;暑假的钟声已经敲响&#xff0c;是时候…

多目标螳螂搜索算法MOMSA求解无人机三维路径规划,可以自行修改障碍物位置(MATLAB代码)

无人机路径规划多目标优化求解是一个复杂的过程&#xff0c;涉及到多个目标的考量和优化算法的应用。以下是一些关键点和相关算法的概述&#xff1a; 1. **多目标优化策略**&#xff1a;在无人机路径规划中&#xff0c;需要同时考虑多个目标&#xff0c;如路径长度、安全性、飞…

初学SpringMVC之接收请求参数及数据回显

pom.xml 文件导入 lombok 的依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示这是一个控制器 RequestParam 表示从前端接收…

SD卡讲解

SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了&#xff0c;控制器对 SD 卡进行读写通信 操作一般有两种通信接口可选&#xff0c;一种是 SPI 接口&#xff0c;另外一种就是 SDIO 接口。SDIO 全称是安全数 字输入/输出接口&#xff0c;多媒体卡 (MMC)、SD 卡、…

Elon Musk开源Grok

转载自&#xff1a;AILab基地 早在6天前&#xff0c;马斯克就发文称xAI将开源Grok 图片 13小时前&#xff0c;马斯克开源了旗下公司X的Grok训练模型&#xff0c;并喊话OpenAI&#xff0c;你名字里的Open到底在哪里 图片 下面是xai-org的GitHub开源地址[https://github.com/x…