定制高端网站建设报价/百度人气榜排名
1,进程同步的几种方式
1.1信号量
用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。
P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。
基本原理是两个或多个进程可以通过简单的信号进行合作,一个进程可以被迫在某一位置停止,直到它接收到一个特定的信号。该信号即为信号量s。
为通过信号量s传送信号,进程可执行原语semSignal(s);为通过信号量s接收信号,进程可执行原语semWait(s);如果相应的信号仍然没有发送,则进程会被阻塞,直到发送完为止。
可把信号量视为一个具有整数值的变量,在它之上定义三个操作:
- 一个信号量可以初始化为非负数
- semWait操作使信号量s减1.若值为负数,则执行semWait的进程被阻塞。否则进程继续执行。
- semSignal操作使信号量加1,若值大于或等于零,则被semWait操作阻塞的进程被解除阻塞。
1.2管程
管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,其主要特点如下:
- 局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
- 一个进程通过调用管程的一个过程进入管程。
- 在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。
管程通过使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问。有两个函数可以操作条件变量:
- cwait©:调用进程的执行在条件c上阻塞,管程现在可被另一个进程使用。
- csignal©:恢复执行在cwait之后因为某些条件而阻塞的进程。如果有多个这样的进程,选择其中一个;如果没有这样的进程,什么以不做。
1.3消息传递
消息传递的实际功能以一对原语的形式提供:
- send(destination,message)
- receive(source,message)
这是进程间进程消息传递所需要的最小操作集。
一个进程以消息的形式给另一个指定的目标进程发送消息;
进程通过执行receive原语接收消息,receive原语中指明发送消息的源进程和消息。
2、进程互斥
由于进程具有独立性和异步性等并发特征,计算机的资源有限,导致了进程之间的资源竞争和共享,也导致了对进程执行过程的制约。
1.临界区相关概念:
临界资源:也就是一次只允许一个进程操作使用的计算机资源,这里的资源可以是物理资源,也可以是逻辑上的变量等。
临界区:把不允许多个并发进程交叉执行的一段程序称为临界区(critical region)或临界部分(critical section)。
当一个进程使用该临界资源时,其他需要访问该资源的进程必须阻塞,直到占用者释放该资源。
2、间接制约
把这种由于共享某一公有资源而引起的在临界区内不允许并发进程交叉执行的现象,称为由共享公有资源而造成的对并发进程执行速度的间接制约。这里的“间接”二字主要是指各种并发进程的速度受公有资源的制约,而非进程之间的直接制约。
3.进程互斥
在并发进程中,一个或多个进程要对公用资源进行访问时,必须确保该资源处于空闲状态,也就是说,在并发进程中,临界区只允许一个进程进入,而其他进程阻塞,等待该共享临界资源释放。
4.并发进程之间必须满足以下特征:
- **平等竞争:**即各并发进程享有平等地、独立地竞争共有资源的权利,且在不采取任何措施的条件下,在临界区内任意指令结束时,其他并发进程可以进入临界区。
- 互斥使用:当并发进程中的时候 多个进程同时申请进入临界区时,它只允许一个进程进入临界区。
- **不可独占:**当进程不在临界区后,它不能阻止其他进程进入临界区。
- **有限等待:**也就是在就绪队列中的进程等待资源时间必须是有限的。并发进程中的某个进程从申请进入临界区时开始,应在有限时间内得以进入临界区。
3、互斥的实现
2.1互斥的加锁实现
对互斥的临界区进行加锁处理,即当一个进程进入了 临界区之后,对此临界区进行加锁,直到该进程退出临界区为止。而其他并发进程在申请进入临界区之前,必须测试该临界区是否加锁,如果是,则阻塞等待!
加锁实现是系统的原语:lock(key[S])和Unlock(key([S]))均保持原子操作。系统实现时锁定位key[S]总是设置在公有资源所对应的数据结构中的。
2.2互斥加锁实现的缺点
1.在进行锁测试和定位中将耗费CPU资源
2、进程加锁实现可能会对进程不公平
例如:
进程A:
lock(key[S])
<S>
unlock(key[S])
Goto A进程B:
lock(key[S])
<S>
unlock(key[S])
Goto B
如上面所示,进程A和B之间的一个进程运行到Goto之后,会使得另一个进程无法得到处理机资源运行。而处于永久饥饿状态(starvation)。
分析可以知道,一个进程能否进入临界区取决于进程自己调用lock过程去测试相应的锁定位。也就是说,每个进程能否进入临界区是依靠进程自己的测试判断。这样,没有获得执行机会的进程当然无法判断,从而出现不公平现象。
那么是否有办法解决这个问题呢?当然,很明显,办法是有的,我们可以为临界区设置一个管理员,由这个管理员来管理相应临界区的公有资源,它代表可用资源的实体,这个管理员就是信号量。
2.3信号量和P、V操作
信号量和P、V原语是荷兰科学家E. W. Dijkstra提出来的。
**P原语:**P是荷兰语Proberen(**测试)的首字母。为阻塞原因,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作方法:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程会被阻塞;
V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。
【信号量semaphore】 在操作系统中,信号量sem是一个整数。
- sem >= 0时,代表可供并发进程使用的资源实体数;
- sem < 0时,表示正在等待使用临界区的进程数。
显然,用于互斥的信号量sem的初值应该大于0,而建立一个信号量必须说明所建信号量代表的意义,赋初值,以及建立相应的数据结构,以便指向那些等待使用该临界区的进程。sem初值为1。
【P、V原语】
信号量的数值仅能由P、V原语操作改变。采用P、V原语,可以把类名为S的临界区描述为:When S do P(sem) 临界区 V(sem) od。
- 一次P原语操作使信号量sem减1
- 一次V原语操作使信号量sem加1
P原语操作:
sem减1;
若sem减1后仍大于或等于0,则P原语返回,该进程继续执行;
若sem减1后小于0,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
V原语操作:
sem加1;
若相加结果大于0,V原语停止执行,该进程返回调用处,继续执行;
若相加结果小于或等于0,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程继续执行或转进程调度。
这里给出一个使用加锁法的软件实现方法来实现P、V原语:
P(sem):begin封锁中断;lock(lockbit)val[sem]=val[sem]-1if val[sem]<0保护当前进程CPU现场当前进程状态置为“等待”将当前进程插入信号sem等待队列转进程调度fiunlock(lockbit);开放中断end
V(sem):begin封锁中断;lock(lockbit)val[sem]=val[sem]+1if val[sem]<=0local k从sem等待队列中选取一个等待进程,将其指针置入k中将k插入就绪队列进程状态置位“就绪”fiunlock(lockbit);开放中断end
2.3用P、V原语实现进程互斥
设信号量sem是用于互斥的信号量,且其初始值为1表示没有并发进程使用该临界区。显然,由前面论述可知,只要把临界区置于P(sem)和V(sem)之间,即可实现进程之间的互斥。
用信号量实现两个并发进程PA和PB互斥的描述如下:
(1)设sem为互斥信号量,其取值范围为(1,0,-1)。其中sem=1表示进程PA和PB都未进入类名为S的临界区,sem=0表示进程PA或PB已进入类名为S的临界区,sem=-1表示进程PA和PB中,一个进程已进入临界区,而另一个进程等待进入该临界区。
(2)实现过程:
Pa:P(sem)<S>V(sem)...
Pb:P(sem)<S>V(sem)...
4,进程互斥的软件实现方法:
1,单标志法
1)在进入区只检查,不上锁
2)在退出区把临界资源的使用权交给另一个进程
3)主要问题:不遵循空闲让进的原则
2,双标志先检查
1)在进入区先检查后上锁,退出区解锁
2)主要问题:不遵循原则等待原则
3,双标志后检查
1)在进入区先
上锁后检查,退出区解锁
2)主要问题:不遵循空闲让进,有限等待原则,可能导致饥饿
4,Peterson算法
1)在进入区主动争取——》主动谦让——》检查对方是否想进,己方是否谦让
2)主要问题:不遵循让则等待原则,会发送忙等
5、进程同步
【进程间的直接制约】:一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。这里的异步环境主要是指各并发进程的执行起始时间的随机性和执行速度的独立性。
【进程间的同步】:把异步环境下的一组并发进程因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。具有同步关系的一组并发进程称为合作进程,合作进程间相互发送的信号称为消息或事件。
用消息实现进程同步:
用
wait(消息名)
表示进程等待合作进程发来的消息。
用
signal(消息名)
表示向合作进程发送消息。
过程wait的功能是等待到消息名为true的进程继续执行,而signal的功能则是向合作进程发送合作进程所需要的消息名,并将其值置为true。
进程互斥和进程同步】:
进程同步不同于进程互斥,进程互斥时它们的执行顺序可以是任意的。一般来说,也可以把个进程之间发送的消息作为信号量看待。与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关,而不是与整租并发进程有关。因此,称该信号量为私用信号量(private semaphore)。一个进程Pi的私用信号量semi是从制约进程发送来的进程Pi的执行条件所需要的信息。与私用信号量相对应,称互斥时使用的信号量为公用信号量。
【用P、V原语实现进程同步】:
首先为各并发进程设置私用信号量,然后为私用信号量赋初值,最后利用P、V原语和私用信号量规定各进程的执行顺序。
进程之间发送的消息作为信号量看待。与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关,而不是与整租并发进程有关。因此,称该信号量为私用信号量(private semaphore)。一个进程Pi的私用信号量semi是从制约进程发送来的进程Pi的执行条件所需要的信息。与私用信号量相对应,称互斥时使用的信号量为公用信号量。
【用P、V原语实现进程同步】:
首先为各并发进程设置私用信号量,然后为私用信号量赋初值,最后利用P、V原语和私用信号量规定各进程的执行顺序。
相关文章:

Linux操作系统进程同步的几种方式及基本原理
1,进程同步的几种方式 1.1信号量 用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。 P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于…...

android 责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连成一条链,并沿着这条链传递请求,直到有一…...

【可控图像生成系列论文(四)】IP-Adapter 具体是如何训练的?1公式篇
系列文章目录 【可控图像生成系列论文(一)】 简要介绍了 MimicBrush 的整体流程和方法;【可控图像生成系列论文(二)】 就MimicBrush 的具体模型结构、训练数据和纹理迁移进行了更详细的介绍。【可控图像生成系列论文&…...

堆的实现详解
目录 1. 堆的概念和特点2. 堆的实现2.1 堆向下调整算法2.2堆的创建2.3 建堆时间复杂度2.4 堆的插入2.5 堆的删除2.6 堆的代码实现2.6.1 结构体2.6.2 初始化2.6.3 销毁2.6.4 插入2.6.5 删除2.6.6 获取堆顶2.6.7 判空2.6.8 个数2.6.9 向上调整2.6.10 向下调整3. 堆的实现测试测试…...

iptables配置NAT实现端口转发
加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…...

【启明智显产品介绍】Model3C工业级HMI芯片详解专题(一)芯片性能
【启明智显产品介绍】工业级HMI芯片Model3C详解(一)芯片性能 Model3C 是一款基于 RISC-V 的高性能、国产自主、工业级高清显示与智能控制 MCU,配置平头哥E907,主频400MHz,强大的 2D 图形加速处理器、PNG/JPEG 解码引擎…...

Socket编程【个人简单】
介绍 Socket是计算机网络中的一种通信端点,通过它应用程序可以在网络上发送和接收数据。它可以是基于TCP(传输控制协议)的流套接字,也可以是基于UDP(用户数据报协议)的数据报套接字。 TCP、UDP、HTTP和We…...

java入门 grpc测试案例
一、 参考资料 参考孙帅suns教程 https://www.bilibili.com/video/BV13M41157gU/?p3&spm_id_from333.880.my_history.page.click&vd_source4cd1b6f268e2a29a11bea5d2568836ee 二、 服务端 项目目录 maven构建项目 pom.xml <project xmlns"http://maven.a…...

【操作系统】信号处理与阻塞函数|时序竞态问题
🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 关于阻塞函数和…...

go语言day4 引入第三方依赖 整型和字符串转换 进制间转换 指针类型 浮点数类型 字符串类型
Golang依赖下载安装失败解决方法_安装go依赖超时怎么解决-CSDN博客 go安装依赖包(go get, go module)_go 安装依赖-CSDN博客 目录 go语言项目中如何使用第三方依赖:(前两步可以忽略) 一、安装git,安装程序…...

IOS Swift 从入门到精通:闭包第二部分,高级闭包
文章目录 当闭包接受参数时使用闭包作为参数当闭包返回值时使用闭包作为参数简写参数名称高级闭包: 具有多个参数的闭包高级闭包:从函数返回闭包高级闭包:捕获值总结当闭包接受参数时使用闭包作为参数 这是闭包开始变得有点像线路噪声的地方:传递给函数的闭包也可以接受它…...

爬虫超详细介绍
爬虫(Spider)是一种自动化程序,用于在互联网上获取信息。 其工作原理主要可以分为以下几个步骤: 发起请求: 爬虫首先需要向目标网站发起HTTP请求,以获取网页的内容。这个请求可以包含一些额外的信息&…...

双向长短期记忆神经网络BiLSTM
先说一下LSTM LSTM 是一种特殊的 RNN,它通过引入门控机制来解决传统 RNN 的长期依赖问题。 LSTM 的结构包含以下几个关键组件: 输入门(input gate):决定当前时间步的输入信息对细胞状态的影响程度。遗忘门ÿ…...

python基础篇(4):range语句
1 功能介绍 range语句的功能是获得一个数字序列(可迭代类型的一种) 2 语法 语法1: range(num) 获取一个从0开始,到num结束的数字序列(不含num本身) 如range(5)取得的数据是:[0, 1, 2, 3, 4…...

基于STM32的简易计算器proteus仿真设计(仿真+程序+设计报告+讲解视频)
基于STM32的简易计算器proteus仿真设计 讲解视频1.主要功能2. 仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的简易计算器proteus仿真设计(仿真程序设计报告讲解视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 …...

小程序onLoad 和 onShow
onLoad 和 onShow 是小程序页面的生命周期函数,它们在不同的时机触发,具有不同的用途和执行顺序 1.onLoad: (1)onLoad 在页面加载时触发,仅执行一次。 (2)用于页面的初始化操作,例如…...

抖音直播违规规定有哪些?(直播违禁词汇总表)
全民直播的同时也有不少新手直播玩家处处碰壁,直播间没人气,直播不知道说什么甚至直播间被封。 收到直播封禁通知的朋友,轻者封禁直播账号两三天,严重着可能永久封禁直播间! 今天我们重点来说说直播间被封是怎么回事?如何避免抖音直播间被封?抖音直播间违规规定有哪些?抖音…...

安卓 jetpack compose
以下是 Jetpack Compose 中常用的一些组件的列表: 组件名称描述Text用于显示文本内容。Button可点击的按钮组件,常用于触发事件。TextField用于输入文本的文本框组件。Image用于展示图片。Column垂直布局容器,可以在其中垂直排列子组件。Row…...

JavaWeb系列十九: jQuery的DOM操作 上
查找节点, 修改属性 查找属性节点: 查找到所需要的元素之后, 可以调用jQuery对象的attr()方法用来 设置/返回 它的各种属性值 设置属性值 $(“img”).attr(“width”, “300”);返回属性值 $(“img”).attr(“width”); 创建节点 创建节点: 使用jQuery的工厂函数$(): $(html标…...

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)
韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…...

【激光雷达使用记录】—— 如何在ubuntu中利用ros自带的rviz工具实时可视化雷达点云的数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、查看雷达数据的 frame_id1. 查看雷达数据的话题2. 查看数据的frame_id 二、可视化雷达数据总结 前言 RViz(ROS Visualization)是机…...

一道session文件包含题
目录 环境说明 session文件包含getshell 审计源码 session包含 base64在session中的解码分析 题目: 链接:https://pan.baidu.com/s/1Q0BN08b8gWiVE4tOnirpTA?pwdcate 提取码:cate 环境说明 这里我用的是linux,也可以用p…...

vuex数据持久化
清空原因: 刷新页面vuex的数据会丢失属于正常现象,因为JS的数据都是保存在浏览器的堆栈内存里面的,刷新浏览器页面,以前堆栈申请的内存被释放,这就是浏览器的运行机制,那么堆栈里的数据自然就清空了。 解…...

MySQL之复制(十)
复制 改变主库 确定期望的日志位置 如果有备库和新主库的位置不相同,则需要找到该备库最后一条执行的时间在新主库的二进制日志中相应的位置,然后再执行CHANGE MASTER TO.可以通过mysqlbinlog工具来找到备库执行的最后一条查询,然后在主库上…...

Spring MVC数据绑定和响应——简单数据绑定(一)默认类型数据绑定
一、Spring MVC常见的默认类型 当使用Spring MVC默认支持的数据类型作为处理器的形参类型时,Spring MVC的参数处理适配器会默认识别这些类型并进行赋值。Spring MVC常见的默认类型如下所示。 • HttpServletRequest:获取请求信息。 • HttpServlet…...

短视频平台自动化插件编写需要用到的源代码分享!
随着短视频平台的蓬勃发展,自动化插件的需求也日益增长,这些插件能够帮助用户更高效地管理内容、分析数据、优化发布策略等。 一、登录验证模块 登录验证是自动化插件的基础功能之一,确保用户能够安全地访问平台并执行相关操作,…...

安卓下载以来总是要添加maven下载地址,放在哪?
放这里面的 repositories 里...

springboot多数据源应用,A服务依赖于B服务jar包,A服务和B服务业务数据分别入自己的库如何做?
上一节我们简单阐述了springboot多数据源如何配置。在实际的业务场景中我们常常遇到A服务依赖于B服务jar包,A服务和B服务业务数据分别入自己的库中。为何要这么做呢?比如B服务是日志SDK,A服务集成B服务来实现记录日志的功能,但是日…...

20240626 每日AI必读资讯
🌍警告!OpenAI宣布全面封锁中国API接入! - 7月9号开始封锁不支持的国家API - 如果在OpenAI不允许的国家使用其 API 将面临封杀 🔗 警告!OpenAI 宣布全面封锁中国 API 接入-CSDN博客 🎵索尼、环球音乐、华…...