当前位置: 首页 > news >正文

操作系统之进程同异步、互斥

引入

异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进。
但是在一定的条件之下,需要进程按照一定的顺序去执行相关进程:
举例说明1:
在这里插入图片描述
举例说明2:
在这里插入图片描述
读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中,又必须按照“写数据>读数据”的顺序来执行的。所以需要解决这种异步的问题,就是进程同步所讨论的内容。

进程互斥软件实现方法

一、临界区

1、临界资源
在这里插入图片描述
2、临界区的控制结构
在这里插入图片描述
3、临界区遵循的四个原则
在这里插入图片描述
二、进程互斥

1、为什么要进程互斥?

假设进程A在执行程序的时候需要调度打印机的资源,但是调度到一半的时候,操作系统给A分配的时间片用完了,这个时候进程B上处理机,也需要使用打印机,这个时候如果进程不互斥的话,就会将A、B的内容混在一起;因此需要进程互斥;

2、单标记法
两个进程在访问临界区的时候,使用临界区的权限由使用完临界区的进程转交给下一个需要使用临界区的进程;
在这里插入图片描述
在这里插入图片描述
缺点:只能轮流访问,当进程A访问打印机临界区的时候,时间片使用完毕之后,退出处理机,这时候进程B进入处理机,同时进程B也需要访问打印机,但是这个时候打印机的标记只能给进程A使用,所以进程B只能干等待,等待A下一次进入并且使用完临界区的时候,自己才能进入临界区处理资源, 显然不符合临界区的空闲让进原则;

3、双标志前检查法
在这里插入图片描述
使用数组记录想进入临界区的意愿,当进程A进入临界区的时候,需要将自己的意愿数组赋值为TRUE,其他进程进入时候,会判断A进程是否已经进入临界区,如果已经进入则自旋等待,等待A进程执行完毕后,将自己的意愿变为false,这时候其他进程可以进入;

缺点:使用数组表示想进入临界区意愿,若按照 ①⑤②⑥③⑦…的顺序执行,PO 和 P1将会同时访问临界区。因此,双标志先检查法的主要问题是:违反“忙则等待”原则。原因在于,进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查”后, “上锁”前可能发生进程切换。

4、双标志后检查法
通过先上锁,后进入的方式
在这里插入图片描述
缺点:如果并发执行的话,同时上锁会导致都进不了临界区,违反了空闲让进和有限等待的原则,使得进程长期无法访问资源而产生饥饿现象;

5、Peterson算法
结合双标志方法,如果双方都争着想进入临界区,那可以谦让。
在这里插入图片描述
虽然Peterson算法解决了进程互斥,遵循空闲让进,忙则等待,有限等待三个原则,但是未遵循让权等待。

进程互斥硬件实现方法

一、中断屏蔽方法

类似原语,用“开/关中断指令” 实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
在这里插入图片描述
优点:简单、高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中忻指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

二、TestAndSet指令

简称TS 指令,也有地方称为 TestAndsetlock 指令,或TSL 指令,TSL指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成。相当于存在一个全局变量,利用全局变量的值来控制访问临界区,以下是用C语言描述的逻辑
在这里插入图片描述
若刚开始lock 是false,则TSL返回的old 值为false,while 循环条件不满足,直接跳过循环,进入临界区。若刚开始lock是true,则执行TLS后old 返回的值为 true, while 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行 “解锁”相比软件实现方法,TSL指令把 “上锁”和“检查” 操作用硬件的方式变成了一气呵成的原子操作。
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足让权等待原则,不满足条件的时候会一直等待;

三、Swap指令
在这里插入图片描述
使用的方式TestAndSet一致,只是硬件层面实现不同,都是通过一个全局变量来控制是否能进入临界区;

四、互斥锁
加粗样式
特性:
•需忙等,进程时间片用完才下处理机,违反“让权等待”
•优点:等待期问不用切换进程上下文,多处理器系统中,若上锁的时间短,则等待代价很低
•常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
•不太适用于单处理机系统,忙等的过程中不可能解锁

注:如果是多核的时候,一个进程自旋等待只会吃掉一个核,其他核访问完临界区之后,就会释放临界区,等待的进程也能进入临界区操作资源,但是在单核的时候,自旋的进程需要等待自己的时间片用完,并且等待使用临界区的进程上CPU释放临界区的资源才能继续使用临界区;

信号量机制

一、概述
1、由迪杰斯特拉提出信号量机制;
2、信号量是一种变量,表示系统中的一种变量;
3、使用一对原语来对信号量进行操作,wait(s)原语和signal(s)原语,可以把原语比做一个函数,括号里面的s其实就是函数调用的时候传入的一个参数;一般把原语简称为 P,V操作;

二、整型信号量
用一个整数表示系统资源的变量,用来表示系统中某种资源的数量

int S=1;
void wait(int S){ //wait原语,相当于:进入区while(S<=0);  //如果资源数不够,就意志循环等待S=S-1;        //如果资源数够,则占用一个资源
}void signal(int S){//signal原语,相当于“退出区”S=S+1;         //使用完资源后,在退出区释放资源
}

相当于通过一个整形变量上锁,但是如果一个进程占用了临界区的资源,另一个进程需要访问临界区的资源的时候,会等待上一个进程使用完资源,这个时候会一直忙等待;

三、记录型信号量
1、记录型的信号量增加了等待队列,当进程发现临界区的资源已经被别的进程占用的时候,将自己设置为阻塞状态,并且放入新增的等待队列中,等待临界区的释放被唤醒;

//记录型信号量的定义
typedef struct{int value;struct process *L;
} semaphore;
//某进程需要使用资源时,通过wait原语申请
void wait (semaphore S){S.value--;if(S.value<0){block (S.L);//将该进程加入到消息队列中}
}
//进程使用完资源后,通过signal原语释放
void signal (semaphore S){S.value++;if(S.valie<=0){wakeup(S.L);}
}

在这里插入图片描述

五、使用信号量机制实现互斥
1、实现进程互斥
设置互斥信号量mutex,初值为1,对不同的临界资源需要设置不同的互斥信号量,PV必须成对出现

2、实现进程同步
保证一前一后的操作顺序,设置同步信号量S,初始为0,在“前操作”之后执行V(S,在“后操作”之后执行(V)

3、实现进程的前驱关系
(1)要为每一对前驱关系各设置一个同步变量
(2)在“前操作”之后对相应的同步变量执行V操作
(3)在“后操作”之前对相应的同步变量执行P操作

前V后P:信号量代表了某种资源,P2执行的时候需要P1来释放这种资源,这样就限制了P1一定在P2的后面执行;
在这里插入图片描述

进程同步问题

一、生产者消费者问题
只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待,只有缓冲区不空时,消费者才能从中取出产品,否则必须等待,缓冲区是临界资源,各个进程互斥访问,实现互斥的P操作要放在实现同步的P操作之后,不然会发生死锁,V操作不会导致进程发生阻塞的状态,所以可以交换,使用操作不要放在临界区,不然并发度会降低·
在这里插入图片描述
重点:生产消费问题为两个互斥同步的综合问题,需要两个信号量来控制;并且实现互斥的P操作一定需要在实现同步的P操作之后;

二、多生产者多消费者问题
在这里插入图片描述
在这里插入图片描述
三、吸烟者问题
解决“可以让生产多个产品的单生产者”问题提供一个思路;若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的“事件”发生之后的位置
在这里插入图片描述

四、读者、写者问题

1、允许多个读者同时对文件执行读操作
2、只允许一个写者往文件中写信息
3、任一写者在完成写操作之前不允许其他读者或写者工作
4、写者执行写操作前,应让已有的读者和写者全部退出

1、直接全部加锁,但是不能读进程同步
在这里插入图片描述
2、加上count变量,第一个加锁即可
在这里插入图片描述
在这里插入图片描述
所以需要让对count的操作是互斥的
在这里插入图片描述
但是如果一直读进程进入的时候,写进程一直无法执行,导致饿死;所以在新增一个信号量w;用于实现写优先;当有写操作进入的时候,前面的读进程结束后就应该触发写进程了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终代码逻辑:

semaphore rw=1;//用于实现对文件的互斥访问。表示当前是否有进程在访问共享文件
int count=0;//记录当前有几个读进程在访问文件
semaphore mutex=1;//用于保证对count变量的互斥访问
semaphore w=1; //用于实现“写优先”writer(){while(1){P(w);P(rw); //写之前“加锁”写文件。。。V(rw);//写之后“解锁”V(w);}
}reader(){while(1){P(w);P(mutex);   //各读进程互斥访问countif(count==0) P(rw);  //第一个读进程的读进程数+1count++;	//访问文件的读进程数+1V(mutex);	V(w);读文件...P(mutex);	//各读进程互斥访问countcount--;	//访问文件的读进程数-1if(count==0)V(rw);	//最后一个读进程负责“解锁”V(mutex);}
}

五、哲学者进餐问题
在这里插入图片描述
五个人,必须拿左右的筷子才能吃饭避免死锁发生,解决方案:
1、可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐,这样可以保证至少有一个哲学家是可以拿到左右两只筷子的。
2、要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这就避免了占有一只后再等待另一只的情况。
3、仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子

管程

心得:相当于C++的类,管程是数据放在private中,函数放在public中
在这里插入图片描述

相关文章:

操作系统之进程同异步、互斥

引入 异步性是指&#xff0c;各并发执行的进程以各自独立的、不可预知的速度向前推进。 但是在一定的条件之下&#xff0c;需要进程按照一定的顺序去执行相关进程&#xff1a; 举例说明1&#xff1a; 举例说明2: 读进程和写进程并发地运行&#xff0c;由于并发必然导致异步性…...

你了解这2类神经性皮炎吗?常常预示着这5类疾病!

神经性皮炎属于慢性皮肤病&#xff0c;患者皮肤可出现局限性苔藓样变&#xff0c;同时伴有阵发性瘙痒。神经性皮炎易发生在颈部两侧和四肢伸侧&#xff0c;中年人是高发人群。到目前为止神经性皮炎病因还并不是很明确&#xff0c;不过一部分病人发病前常常出现精神神经方面异常…...

二叉搜索树【Java】

文章目录 二叉搜索树的性质二叉搜索树的操作遍历查找插入删除 二叉搜索树又称为二叉排序树&#xff0c;是一种具有一定性质的特殊的二叉树&#xff1b; 二叉搜索树的性质 若它的左子树不为空&#xff0c;则左子树上结点的值均小于根节点的值&#xff1b; 若它的右子树不为空&a…...

二叉树的遍历方式

文章目录 层序遍历——队列实现分析Java完整代码 先序遍历——中左右分析递归实现非递归实现——栈实现 中序遍历——左中右递归实现非递归实现——栈实现 后续遍历——左右中递归实现非递归实现——栈加标志指针实现 总结 层序遍历——队列实现 给你二叉树的根节点 root &…...

SpringCloud01

SpringCloud01 微服务入门案例 实现步骤 导入数据 实现远程调用 MapperScan("cn.itcast.order.mapper") SpringBootApplication public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}…...

SpringBoot整合Redis实现点赞、收藏功能

前言 点赞、收藏功能作为常见的社交功能&#xff0c;是众多Web应用中必不可少的功能之一。而redis作为一个基于内存的高性能key-value存储数据库&#xff0c;可以用来实现这些功能。 本文将介绍如何使用spring boot整合redis实现点赞、收藏功能&#xff0c;并提供前后端页面的…...

【Java入门合集】第一章Java概述

【Java入门合集】第一章Java概述 博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.理解JVM、JRE、JDK的概念&#xff1b; 2.掌握Java开发环境的搭建,环境变量的配置&#xff1b; 3.掌握Java程序的编写、编译和运行&#xff1b; 4.学会编写第一个Java程序&#x…...

Android无线调试操作说明

1.首先通过手机机蓝牙将jackpal.androidterm-1.0.70.apk(终端模拟器)传的设备上安装 链接: https://pan.baidu.com/s/151SzEgsX0b_VTWowzfUrsA?pwdrn75 提取码: rn75 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 2.打开这个终端模拟器&#xff0c;输入以下命…...

什么是 Python ?聊一聊Python程序员找工作的六大技巧

最近我一直在思考换工作的事情。因此&#xff0c;这段时间我会看一些题目&#xff0c;看一些与面试相关的内容&#xff0c;以便更好地准备面试。我认为无论你处于什么阶段&#xff0c;面试中都会有技术面试环节。无论是初级职位还是高级职位&#xff0c;都需要通过技术面试来检…...

RabbitMQ 01 概述

什么是消息队列 进行大量的远程调用时&#xff0c;传统的Http方式容易造成阻塞&#xff0c;所以引入了消息队列的概念&#xff0c;即让消息排队&#xff0c;按照队列进行消费。 它能够将发送方发送的信息放入队列中&#xff0c;当新的消息入队时&#xff0c;会通知接收方进行处…...

面经|曹操出行供需策略运营

1.自我介绍 面试官表示看了简历之后&#xff0c;表示对专业能力比较放心。想了解下对于专业能力之外&#xff0c;关于其他方面的介绍。 2.策略运营&#xff0c;除了工具之外&#xff0c;还有哪些能力是需要具备的 回答&#xff1a;主要是从做项目的维度逻辑先去回答的。 分析思…...

【Python】selenium工具

目录 1. 安装 2. 测试 3. 无头浏览器 4. 元素定位 5. 页面滑动 6. 按键、填写登录表单 7. 页面切换 Selenium是Web的自动化测试工具&#xff0c;为网站自动化测试而开发&#xff0c;Selenium可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff0c;可以接…...

实验六~Web事件处理与过滤器

1. 创建一个名为exp06的Web项目&#xff0c;编写、部署、测试一个ServletContext事件监听器。 BookBean代码 package org.example.beans;import java.io.Serializable;/*** Created with IntelliJ IDEA.* Description:* User: Li_yizYa* Date: 2023—04—29* Time: 18:39*/ Su…...

刷题4.28

1、 开闭原则软件实体&#xff08;模块&#xff0c;类&#xff0c;方法等&#xff09;应该对扩展开放&#xff0c;对修改关闭&#xff0c;即在设计一个软件系统模块&#xff08;类&#xff0c;方法&#xff09;的时候&#xff0c;应该可以在不修改原有的模块&#xff08;修改关…...

做了一年csgo搬砖项目,还清所有债务:会赚钱的人都在做这件事 !

前段時间&#xff0c;在网上看到一句话&#xff1a;有什么事情&#xff0c;比窮更可怕&#xff1f; 有人回答说&#xff1a;“又忙又窮。” 很扎心&#xff0c;却是绝大多数人的真实写照。 每天拼死拼活的996&#xff0c;你有算过你的時间值多少钱&#xff1f; 我们来算一笔…...

线性回归模型(7大模型)

线性回归模型&#xff08;7大模型&#xff09; 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中&#xff0c;线性回归都是非常有用的&#xff0c;例如金融、医疗、社交网络、推荐系统等等。 在机器学习中&#xff0c;线性回归是最基本的模型之一&am…...

VP记录:Codeforces Round 868 (Div. 2) A~D

传送门:CF A题:A-characteristic 构造一个只有 1 , − 1 1,-1 1,−1的数组,满足乘积为 1 1 1的数对的个数为 k k k. 发现 n n n的范围很小,考虑直接暴力枚举数组中 1 1 1的个数,记为 i i i,那么对于1的所有数对来说,我们有 i ∗ ( i − 1 ) / 2 i*(i-1)/2 i∗(i−1)/2个,然后…...

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2

【VQ-VAE-2论文精读】Generating Diverse High-Fidelity Images with VQ-VAE-2 0、前言Abstract1 Introduction2 Background2.1 Vector Quantized Variational AutoEncoder3 Method3.1 Stage 1: Learning Hierarchical Latent Codes3.2 Stage 2: Learning Priors over Latent C…...

并发编程基石:管程

大家好&#xff0c;我是易安&#xff01; 如果有人问我学习并发并发编程&#xff0c;最核心的技术点是什么&#xff0c;我一定会告诉他&#xff0c;管程技术。Java语言在1.5之前&#xff0c;提供的唯一的并发原语就是管程&#xff0c;而且1.5之后提供的SDK并发包&#xff0c;也…...

电路中噪声来源

电路包括不同的部件和芯片&#xff0c;所有都有可能成为噪声的来源。例如&#xff0c;电阻会带来热噪声&#xff0c;这个噪声为宽频噪声&#xff0c;几乎涵盖所有频率范围&#xff1b;运算放大器其芯片内部会产生噪声&#xff1b;而 ADC产生的量化噪声相较于其他器件&#xff0…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)

题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...