进程与线程:同步和互斥

news2024/11/18 1:46:47

进程与线程:同步&互斥

同步&互斥的概念

​ 进程具有异步性的特征。异步性是指各并发进程执行的进程的以各自独立的,不可预知的速度向前推进

image-20230424102655276

同步

同步 亦称为直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程的直接制约关系就是源于它们之间的相互合作。

互斥

互斥 也称为间接制约关系,是指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源后另一个进程才能去访问临界资源。

临界资源

一次仅允许一个进程使用的资源称为临界资源。对临界资源的访问,必须互斥地进行,可把临界资源的访问过程分为4个部分:

  1. 进入区。 在进入临界区使用临界资源前,检查是否可进入临界区,若能进入则设置正在访问的临界区的标志,以防止其他进程同时进入临界区。
  2. 临界区。 进程中访问临界资源的代码
  3. 退出区。 将正在访问临界资源的清除(类似于解锁)
  4. 剩余区。 代码中的其余部分

注:进入区和退出区是负责实现互斥的代码段;临界区是进程访问临界资源的代码段

image-20230424104158778

进程互斥需要遵守以下原则:

  1. 空闲让进。 临界区空闲时,可允许一个请求进入临界区的进程立即进入临界区
  2. 忙则等待。 当已有进程进入临界区时,其他试图进入临界区的进程必须等待
  3. 有限等待。 对请求访问的进程,应保证能在有限时间内进入临界区
  4. 让权等待。 当进程不能进入临界区时,应立即释放处理机,防止进程忙等待

进程互斥的基本实现方法

软件实现方法

单标志法

单标志法算法思想:两个进程在访问临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予

image-20230424104936974

代码的逻辑其实就是,刚开始通过turn变量控制只能让一个进程进入临界资源,当该进程访问结束后再修改trun的值让别的进程可以访问。

缺陷:使用单标志法,只能让进程进行交替地轮流访问,如果此时允许进入的临界区的进程是P0,但是P)一直不访问,那么虽然临界区空闲,但是并不允许,P1访问。违反了空闲让进的原则。

双标志先检查

双标志先检查算法思想:使用一个bool数组flag[],数组中各元素用来标记各进程想进入临界区的意愿。所以当进程要进入临界区前会去检查别的进程在flag中表达的是否访问临界资源。

image-20230424110002660

这个算法的过程大致如下:每次在进入区通过flag数组来检查别的进程是否访问临界资源,若无访问则通过flag[i] = true来表达自己开始访问了。

缺陷:当两个进程同时进入进入区时,将会导致两个进程同时进入临界区而导致错误。可以设想P0进程刚通过上图中的第①条语句后,发生进程的切换,P1进程开始运行,此时flag[0]还未修改,所以P1进程也能进入临界区。所以,双标志的主要问题是违反了忙则等待的原则。原因在于,进入区的检查和上锁两个处理并不是一气呵成的

双标志后检查

双标志后检查算法思想:双标志先检查的改版,其实就是先“上锁”后“检查”的方法。

image-20230424111123869

这个算法的缺陷和双标志先检查的差不多,都是当一个进程执行了第①条语句后发生切换时,将会导致两个进程同时标志flag[i]=true,将导致两个进程都无法进入临界区。所以双标志后检查法违反了“空闲让进”和“有限等待”原则,各进程会长期无法访问临界资源而产生饥饿现象

Peterson算法

Peterson 算法思想:结合双标志法、单标志法的思想。

image-20230424112127828

这个算法符合空闲让进、忙则等待、有限等待三个原则的核心是,在用while语句检查进入临界区前,使用了trun值的唯一性保证了进程之间的互斥性。但是未遵守让权等待原则,会发生忙等。

硬件实现方法

image-20230424130107690

关中断屏蔽

利用开/关中断指令实现(与原语的实现思想相同,即进程开始访问临界资源到结束访问的行为都不允许被中断,也就不能发生进程的切换,因此不会发生两个同事访问临界区的情况)

image-20230424113643377

缺点:不适合多处理机只适用于操作系统内核进程,不试用于用户进程(因为开中断和关中断指令只能运行在内核态)

TestAndSet

简称TS指令,也可称为TestAndSetLock,或TSL指令。

TSL指令由硬件实现,执行过程不允许被中断,只能一气呵成。下图为用c语言描述的逻辑:

image-20230424114158163

TSL其实借助了硬件的实现,与软件的实现方法相比,将上锁检查两个操作变成原子操作。

优点:实现简单;适合多处理机环境

缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致忙等

Swap指令

也叫Exchange指令,或简称XCHG指令。

Swap指令通过硬件实现,执行过程不允许被中断,只能一气呵成,以下是用C描述实现的逻辑

image-20230424115157437

逻辑上来看Swap和TSL并无太大的区别,都是先记录下此时临界区是否已经被上锁,再将上锁标志设置lock设置为true,最后检查old,若old为false则说明之间没有别的进程对临界区上锁,可进入临界区

缺点:不满足让权等待原则,暂时无法进入临界区的进程会占用CPU并循环执行Swap指令,从而导致忙等

​ 解决临界区最简的工具就是互斥锁(mutex lock)。一个进程在进入临界区时获得锁;在退出临界区时释放锁。函数acquire()获得锁,函数release()这两个函数的执行都是原子操作,因此互斥锁通常采用硬件机制实现

​ 互斥锁通过设置一个bool变量available,表示锁的是否可用。若锁是可用的,调用acquire()会成功,当锁不再可用,试图获取不可用锁时,会被阻塞,知道锁被释放。

image-20230424130948791

互斥锁的主要缺点是忙等待,互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。

需要连续忙等的互斥锁,都可称为 自旋锁(spin lock),如TSL指令、Swap指令、单标志法。

特征:

  • 需要忙等,进程时间片用完才下处理机,违反“让权等待”
  • 优点:等到期间不用切换进程上下文,多处理器系统中,若上锁时间段,则等待代价低(因为当进程在正在阻塞的这个时间片内,有可能被解锁)
  • 常用于多处理器系统,一个核忙等,其他核照常工作,并快速释放临界区
  • 不太实用单处理机系统,忙等的过程中不可能解锁

✨✨✨信号量机制

用户进程可以通过操作系统提供的一对原语来对信号量进行操作,从而实现进程的互斥、同步

信号量其实就是一个变量(可以是整数,也可以是更复杂的记录型变量),可以用于一个信号量来表示系统中某种资源的数量,比如,系统中有一个打印机,就可以设置一个初值为1的信号量

原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语的实现是由关中断/开中断指令实现

一对原语wait(S)(申请资源)原语和 signal(S)(释放资源)原语,其中的S,其实就是信号量

wait、signal原语常简称为P、V操作(对应荷兰语的proberen和verhogen)。因此,做题时常把wait(S)、signal(S)两个操作分别写为P(S)、V(s)

整型信号量

用一个整数类型的变量作为信号量,用来表示系统中某种资源的数量。依然不满足让权等待的原则。

image-20230424133512841

✨👀记录型信号量

​ ==记录型信号量机制是一种不存在“忙等”现象的进程同步机制。==记录型信号量,相对于之前的做法多了一个等待队列,当进程需要的信号量不够时,则将该进程通过等待队列记录下来,并且将该进程从运行态改为阻塞态

image-20230424134425500

注意记录型信号量机制中,信号量的变化位置,可以关注以下几点:

  • 当信号量s为负数, ∣ s ∣ |s| s表示了正在等待的进程数
  • 每当有进程进程调用signal释放资源时,就从等待队列中调出一个等待的进程,并给信号量加一表示等待的进程数量减少1
  • 信号量初始值s,当每个进程运行时,只需要1个信号量时,s即表示该资源,最多被多少个进程共享

信号量机制实现进互斥

实现进程的互斥:

  1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问应该放在临界区)
  2. 设置互斥信号量mutex,初值为1
  3. 在进入区P(mutex)——申请资源
  4. 在退出区V(mutex)——释放资源

注意:对不同的临界资源需要设置不同的互斥信号量。P、V操作必须成对出现

image-20230424144512796

信号量机制实现进程同步

用信号量实现进程同步

  1. 分析在什么地方需要实现“同步关系”,必须保证“一前一后”执行的两个操作
  2. 设置同步信号量S,初始值为0
  3. 在“前操作”之后执行V(S)
  4. 在“后操作”之前执行P(S)

可以记为前VP后

理解:要实现进程的同步,就是让上进程做到按一定先后次序执行。利用刚开始设置信号量为0,让直接执行P操作的进程进入阻塞态(因为此时信号量为0,表示无任何资源),而先执行的进程则直接执行,在执行完后执行V操作,类似地给系统增加这个信号量,从而唤醒被阻塞的进程,所以可以发现当两个同步的进程执行完后信号量S变为了1

信号量机制实现前驱关系

进程P1中有句代码S1,P2中有句代码S2,P3中有句代码S3……S6中有代码S6,要让这些代码按照一定的顺序关系来执行。对于这种前驱关系都是一个进程同步问题(需要保证一前一后的操作),所以其实就是多次进程的同步,所以只要:

  1. 每一对前驱关系各设置一个同步信号
  2. 在“前操作”之后相应的信号量(注意区分不同的信号量)执行V操作
  3. 在“后操作”之前相应的信号量执行P操作

image-20230424150322869

经典同步问题

生产者消费者问题

image-20230424155654354

image-20230424155751917

image-20230424155939319

改变相邻P、V操作的顺序,将会出现死锁

image-20230424160429703

若将前面的生产消费的代码进行更改,如上图。

若此时生产者执行①使mutex变为0,再执行②,由于没有空闲缓冲区,因此生产者被阻塞。由于生产者被阻塞,因此换回消费者进程。消费者进程执行③,由于mutex为0,即生产者还没有释放对临界区资源的“锁”,因此消费者也被阻塞。

这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁”。

实现互斥P操作一定要在实现同步操作P操作之后(只调换一个也不行)V操作不会导致进程阻塞,因此两个V操作顺序可以交换。

另外的思考:可以这么理解为什么上述互斥操作的P和同步操作的P不能互换位置,可以这么考虑,若实现互斥操作的P在前,实现同步操作的P在后,说明此时实现同步的操作的P也变为了互斥的关系,而实际上原来需要的同步操作的两个P是不互斥的,两者必定能实现一个。所以原来的循环才得以实现。而当互斥的P在前时,则打破了这种循环使得进入死锁

多生产者—多消费者

image-20230424164055338

image-20230424164106861

不过这里,可以将上述图片中的对盘子资源的互斥给去除。

吸烟者问题

image-20230424165816036

问题的关键点:

  • 如何实现轮流smoke
  • 如何表达消费者所需的资源

image-20230424165925435

image-20230424165957941

实现的关键:

  • 使用变量i来实现生产者对不同产品的按顺生产
  • 将消费者所需的资源抽象成一个整体

读者写者文件

image-20230424170656398

image-20230424170717551

思考:总体上看写者进程和若干个读者进程形成互斥关系,读者和读者之间也成互斥关系。所以对文件的写操作,实际上是一种互斥操作。所以可以整体来看这个互斥关系,逻辑上两个互斥实事件AB只需要P(mutex)AV(mutex)P(mutex)BV(mutex).所以可以将读者写者问题转化为(P(mutex)写操作V(mutex)P(mutex)所有的读操作V(mutex))。然后只需表示出所有的读操作这个占用段,(P(mutex)写操作V(mutex)P(mutex)第一个读……最后一个读V(mutex)

解决读者进程“饿死”的实现:

image-20230424172628256

哲学家进餐问题

image-20230424175717815

image-20230424180901112

image-20230424180305209

这个问题的特点是,哲学家需要同时持有两个临界资源,才可以顺利执行,若临界资源总数少于消费者数时,需要可以将访问两种临界资源的看作一个整体的临界资源。这样可以保证起码有一个哲学家同时拿到一个临界资源(通过保证一次只有一个消费者征用),而当他完成任务后,就会释放自己的临界资源

管程

在信号量机制中,每个要访问临界资源的进程都必须自备同步操作,大量的同步操作会导致难以管理,于是就出现了管程

管程是一种特殊的软件操作,它由以下几个部分组成:

  1. 局部于管程的共享数据结构说=说明
  2. 对该数据结构进行操作的一组过程
  3. 对局于管程的共享数据设置初始值的语句
  4. 管程的名字

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问
  2. 一个进程只有通过调用管程内的进程才能进入管理程序访问共享数据
  3. 每次仅允许一个进程 在管程内执行某个内部过程

管程由编译器负责实现各进程互斥地进入管程的过程

image-20230425144702534

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

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

相关文章

虚拟主机解压/压缩功能说明

使用帮助说明 主机控制面板上点击文件管理,进入目录。 一、解压 windows操作系统: 鼠标移动到压缩文件,点击“解压” Linux操作系统: 压缩文件后点击解压按钮。 注意linux系统不支持rar在线解压,rar改名为zip也不能解压&…

JVM 调优

大部分的情况都是由于企业内部代码逻辑不合理导致。 JVM内部性能优化 栈上分配 方法内联 JVM的自适应调整 JVM改错 大并发内存不足OOM 内存泄漏GC频繁CPU飙升 JVM的调优的原则是让你各项指标尽可能的利用到你硬件的性能瓶颈。 JVM的性能优化可以分为代码层面和非代码层面。…

数据库系统工程师——第五章 网络基础知识

文章目录 📂 第五章、网络基础知识 📁 5.1 计算机网络概述 📖 5.1.1 计算机网络的概念 📖 5.1.2 计算机网络的分类 📖 5.1.3 网络的拓扑结构 📁 5.2 网络硬件基础 📖 5.2.1 网络设备 &…

Linux 文件内容相关命令使用汇总

Linux操作系统有很多强大的文件内容相关命令,这些命令可以让您查看、分析和编辑文件。其中,最基本和常用的命令包括cat、more、less和head/tail等。除了这些基本命令之外,grep和find命令也是文件搜索和过滤方面的有力工具。 前言 我们这篇主…

UM2080F32 低功耗32 位 Sub1GHz 无线SOC收发器芯片

产品描述 UM2080F32 是广芯微电子(广州)股份有限公司研制的基于 ARM Cortex M0 内核的超低功 耗、高性能的、单片集成 (G)FSK/OOK 无线收发机的 32 位 S o C 芯片。 UM2080F32 工作于 200MHz~960MHz 范围内,支持灵活可设的数据包格式&#xf…

危险试探,产品经理赋予AI人格来打造品牌忠诚度

图片来源:由无界 AI工具生成 你可能不会相信,你的手机很可能变成你的虚拟情人,升级情人需要升级手机,而你从此再也不想换其他品牌手机。 AI时代,赋予产品以人格,让用户爱上产品,这或许是接下来产…

Python整个颜色小网站,给刚刚失恋的他.........

一些过场剧情: 死党一直暗恋校花,但是校花对他印象也不差, 就是死党一直太怂了,不敢去找校花, 直到昨天看到校花登上了校董儿子的豪车, 死党终于彻底死心,大醉一场,作为他的兄弟&#xff0c…

井电双控智能取水计量设备-井电双控遥测终端机

井电双控遥测终端机/井电双控智能取水计量设备(MGTR-W4122C)是针对取水计量控制系统开发智能终端产品。集预收费、流量监测、电量监测、余额提醒、欠费停机、无线传输、远程控制等多种功能于一体,并可根据项目需求选择实体IC卡和APP电子卡取水…

【JavaEE】从收发消息的角度理解 TCP/IP 五层网络模型的封装与分用

文章目录 1 为什么需要分层?2 TCP/IP 五层网络模型3 数据的封装(发送消息为例)4 数据的分用(接收消息为例)5 实际网络环境上的封装与分用写在最后 1 为什么需要分层? 你问我为啥需要分层?那必然…

python+vue 健康体检预约管理系统

该专门体检预约管理系统包括会员和管理员。其主要功能包括个人中心、会员管理、体检服务管理、类型管理、订单信息管理、取消订单管理、 体检报告管理、通知信息管理、交流论坛、系统管理等功能。 目 录 一、绪论 1 1.1研发背景和意义 2 1.2 国内研究动态 3 1.3论文主…

US-DAT2-F、US-DAT2-A比例放大器接线

多路控制阀比例放大器接线端子定义: 序号 端口 名称 1 CMD1 1阀指令 2 CMD1- 1阀指令- 5 RS485_A - 6 RS485_B - 7 VREF_10V 参考电压10V 8 VREF_0V 参考电压0V 9 VAL1_A 1阀电磁铁A 10 VAL1_AB- 1阀电磁铁AB- 11 VAL1_B 1阀电磁铁B 12 PWR 电源 13 PWR…

Unreal5 实现角色动画重定向

解决问题: 有时候有的角色动画想用到另外的角色身上,不能直接用怎么办? 解决方案: 使用重定向 实现方式: 在资产里面创建IK绑定 在列表中选中需要绑定的骨骼网格体 需要创建两个,我这里是女人需要使用男…

【社区图书馆】PyTorch高级机器学习实战

PyTorch高级机器学习实战 作者:王宇龙,清华大学计算机博士,大型互联网公司算法专家,在国际学术会议及期刊发表过多篇论曾出版书籍《PyTorch深度学习入门与实战》,知乎"机器学习”话题优秀回答者。 亮点&#xf…

【Git 入门教程】第三节、Git的分支和合并

Git的分支和合并是Git中最重要的概念之一。使用Git可以轻松地创建、切换和合并分支,这为团队协作开发提供了极大的便利。在本文中,我们将介绍Git分支的基本概念和操作方式。 一、分支 在Git中,分支是指一个代码库的不同版本。分支允许开发者…

设计模式——设计模式简介、分类及面向对象设计原则

文章目录 前言一、什么是设计模式1、从面向对象谈起2、深入理解面向对象3、软件设计固有的复杂性4、软件设计复杂的根本原因——“变化”5、如何解决复杂性?6、软件设计的目标 二、常用设计模式及分类1、常用的七种设计模式2、设计模式分类 三、面向对象设计原则1、…

华为C++研发工程师编程题 ACM模式输入输出|| 1.汽水瓶,2.明明的随机数,3.进制转换

C ACM输入输出 1.汽水瓶题目描述思路代码如下 2.明明的随机数题目描述思路:代码如下: 3.进制转换题目描述思路:代码如下 题目链接: 华为研发工程师编程题 1.汽水瓶 题目描述 某商店规定:三个空汽水瓶可以换一瓶汽水…

手动泵DHP2-100、DHP-100

特性 变化的压力范围。 坚硬精密螺芯和阀套筒。 软调节。 铝制手柄和核心盘。 可以固化调节。 工业化紧凑尺寸。 可调顺序阀 DPS2-100 系列10 先导可调顺序阀 DPSK-100 系列10 先导可调顺序阀 DPSK2-100 系列10 梭阀 DSH-100 系列10 手动双向换向阀 DMP-080-2NCP 系…

vulnhub之lazysyadmin

vulnhub之lazysyadmin 一、信息收集 1.主机发现 sudo arp-scan -l发现了四台主机 192.168.158.2 00:50:56:e3:b7:e4 VMware, Inc. 192.168.158.1 00:50:56:c0:00:08 VMware, Inc. 192.168.158.248 00:0c:29:82:f1:15 VMware, Inc. 192.168.158.254 0…

PFSK164 3BSE021180R1自动调节励磁电流的方法

​ PFSK164 3BSE021180R1自动调节励磁电流的方法 在改变发电机的励磁电流中,一般不直接在其转子回路中进行,因为该回路中电流很大,不便于进行直接调节,通常采用的方法是改变励磁机的励磁电流,以达到调节发电机转子电流…

聚观早报|特斯拉资本支出预期至70亿-90亿美元;迪士尼再裁4000人

今日要闻:特斯拉资本支出预期至70亿-90亿美元;网易起诉暴雪要求退还3亿欠款;迪士尼再裁4000人;尼康Z8旗舰全画幅相机现身官网;“五一”民宿涨价毁约多平台发声 特斯拉资本支出预期至70亿-90亿美元 4 月 25 日消息&…