热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux进程管理之进程同步

并发进程存在的问题系统当中的多个进程,从资源访问的角度来看,一个进程的运行,有没有可能受到其他进程的制约。有可能一个和时间有关的错误共享变

并发进程存在的问题
系统当中的多个进程,从资源访问的角度来看,一个进程的运行,有没有可能受到其他进程的制约。有可能
一个和时间有关的错误
请添加图片描述
共享变量的修改冲突一竞争关系
进程之间的同步关系
请添加图片描述
进程间的制约关系
(1)竞争关系:有些资源需要互斥使用,因此各进程竞争使用这些资源一独占分配到的部分或全部共享资源,进程的这种关系为进程的互斥
(2)同步关系:系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。即一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前该进程处于等待状态,获得消息后被唤醒进入就绪态.进程的这种关系为进程的同步
请添加图片描述
临界区(critical section)
什么叫临界区

(1)并发进程中与共享变量有关的程序段成为临界区。
(2)共享变量代表的资源成为临界资源。
(3)当多个并发进程访问资源时,结果依赖于他们执行的相对速度,便称出现了竞争条件。

一个和时间有关的错误
请添加图片描述
临界区的管理
计算机专家Di jkstra 1968年 提出临界区设计原则,即一组并发进程互斥执行时必须满足:
①每次至多有一个进程处于临界区。
②当若干进程同时要求进入它们的临界区时,应在有限时间内使一进程进入临界区,它们不应相互堵塞而致使彼此不能进入临界区。
③进程仅在临界区内逗留有限的时间
进入区、退出区
请添加图片描述
同步机制应遵循的规则
1)空闲让进。
临界资源空闲时,允许请求进入的进程立即进入临界区
2)忙则等待。.
有其他进程访问临界资源时,必须等待
3)有限等待。
对请求进入临界区访问资源的进程,应该保证它在有限的时间内能进入自己的临界区
4)让权等待
进程由于无法进入临界区处于等待状态时,应该释放处理机,避免进程陷入忙等 的状态
请添加图片描述
一个进程互斥问题
描述:
一个系统中有2台打印机,多个进程如何互斥地访问它们?
请添加图片描述
信号量的提出
信号量: 1965年,由荷兰学者Dijkstra提出的一种特殊整型变量。
信号量定义: 1个数据结构+2个基本操作(ADT)
2个基本操作分别是P、V操作,使用于访问临界资源的“进入区”和“退出区”
一个简单的信号量实现
1.整型信号量
(1)信号量S -整型变量,信号量代表可用资源实体的数量。
(2)除了初始化之外,仅能通过两个不可分割的[原子]操作访问
这两个操作一直被分别称为P、V操作
P操作和V操作可分别描述为:
请添加图片描述
2、记录型信号量
在整型信号量机制中的wait操作&#xff0c;只要是信号量S<&#61;0&#xff0c;就会不断地测试。因此&#xff0c;该机制并未遵循“让权等待”的准则&#xff0c;而是使进程处于“忙等”的状态。
记录型信号量机制&#xff0c;则是-种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后&#xff0c;又会出现多个进程等待访问同一临界资源的情况。
区别:在记录型信号量机制中&#xff0c;除了需要一个用于代表资源数目的整型变量value外&#xff0c;还应增加一个进程链表L&#xff0c;用于链接上述的所有等待进程。
记录型信号量的结构可描述为:

typedef struct{int value;struct process_ control_ block *list;}semaphore;

value: 临界资源的数目;
list:等待访问资源的进程PCB链表;
wait(S)和signal(S)操作可描述为:
请添加图片描述
wait(S)和signal(S)操作可描述为:

请添加图片描述
请添加图片描述
信号量和P、V原语
(1)S是与临界区内所使用的公用资源有关的信号量
S>&#61;0可供并发进程使用的资源数
S<0正在等待进入临界区的进程数
(2)信号量只能通过初始化和两个标准的原语来访问一作为OS核心代码执行&#xff0c;不受进程调度的打断
初始化指定一个非负整数值&#xff0c;表示空闲资源总数.
信号量的使用例子
某系统中接入了2台打印机&#xff0c;使用信号量实现打印机的互斥使用
1、初始化Semaphore s &#61; 2;
2、所有使用打印机的代码使用P、V操作保护
P(s);
使用打印机;
V(s)
练习题
&#xff08;1&#xff09;信号量S的初值为8,在S上执行了10次wait操作&#xff0c; 6次signal操作后&#xff0c; S的值为(4)
&#xff08;2&#xff09;有3个进程&#xff0c;两台打印机&#xff0c;用wait和signal操作来实现互斥访问打印机&#xff0c;则信号量S的取值范围是(2,1,0, -1)
&#xff08;3&#xff09;两个并发进程&#xff0c;设互斥信号量mutex(初值为1)&#xff0c;若信号量&#61;0,则(表示有一个进程进入临界区)
利用信号量实现互斥
请添加图片描述
&#xff08;1&#xff09;如果信号量的value为1&#xff0c;表示只允许一个进程访问临界资源&#xff0c;此时的信号量转化为互斥信号量,也称作互斥锁
&#xff08;2&#xff09;为临界资源设置一个互斥信号量mutex (MUTual Exclusion)&#xff0c;其初值为1;
&#xff08;3&#xff09;在每个进程中将临界区代码置于P(mutex)和V(mutex)原语之间
一个和时间有关的错误
请添加图片描述
利用信号量来描述前趋关系
&#xff08;1&#xff09;前趋关系:并发执行的进程P1和P2中&#xff0c;分别有代码C1和C2&#xff0c;要求C1在C2开始前完成;
&#xff08;2&#xff09;为前趋关系设置一个信号量S12,其初值为0
请添加图片描述
请添加图片描述
一个经典的进程同步问题
例:生产者-消费者问题
描述:
一个具有n个缓冲区的缓冲池&#xff0c;生产者进程每次放入一个产品到缓冲区中;消费者进程可从一个缓冲 区中取走产品去消费。
约束条件:
它们之间必须保持同步&#xff0c;即不允许消费者进程到一个空缓冲区去取产品;也不允许生产者进程向一个已装满产品且尚未被取走的緩冲区中投放产品。
生产者和消费者共同操作同一个缓冲区。
生产者消费者问题中的“同步”问题
&#xff08;1&#xff09;生产者必须先生产产品&#xff0c;消费者才能消费&#xff0c;即:缓冲区空时, 消费者进程需要等待。
&#xff08;2&#xff09;消费者如果一直不消费&#xff0c;生产者将缓冲区填满后&#xff0c;无法再继续生产&#xff0c;只能等消费者再次消费产品后才能继续。即:缓冲区满时&#xff0c;生产者进程需要等待。
生产者消费者问题中的“互斥”问题
对于共享变量counter,生产者做加1操作&#xff0c;消费者做减1操作&#xff0c;可用下面的形式描述:
请添加图片描述
请添加图片描述
解决生产者消费者问题.
若干进程通过有限的共享缓冲区交换数据

“生产者”进程不断写入
“消费者”进程不断读出
共享缓冲区共有N个
任何时刻只能有一个进程可对共享缓冲区进行操作

请添加图片描述
(1)假定在生产者和消费者之间的公用缓冲池中&#xff0c;具有n个缓冲区&#xff0c;这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;
&#xff08;2&#xff09;利用信号量empty和full分别表示缓冲池中空缓冲区满缓冲区的数量。
&#xff08;3&#xff09;假定这些生产者和消费者相互等效&#xff0c;只要缓冲池未满&#xff0c;生产者便可将消息送入缓冲池;只要缓冲池未空&#xff0c;消费者便可从缓冲池中取走一个消息。
生产者-消费者问题算法描述
请添加图片描述
请添加图片描述
注意:
◆在每个程序中 用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现:
◆对资源信号量empty和full的wait和signal操作&#xff0c;同样需要成对地出现&#xff0c;但它们可以分别处于不同的程序中。
例如&#xff0c;wait (empty)在生产者进程中&#xff0c;而signal (empty)则在消费者进程中&#xff0c;生产者进程若因执行wait (empty)而阻塞&#xff0c;则 以后将由消费者进程将它唤醒;
◆在每个程序中 的多个wait操作顺序不能颠倒。
应先执行对资源信号量的wait操作&#xff0c;然后再执行对互斥信号量的wait操作&#xff0c;否他的进程死锁。
P.V操作总结
信号量的物理含义:

S>0表示有S个资源可用
S&#61;O表示无资源可用
S<0|S|表示S等待队列中的进程个数
P(S):表示申请一个资源V(S):表示释放一个资源
信号量的初值应该大于等于0

2、P. V操作必须成对出现&#xff0c;有一个P操作就一定有一个V操作

&#xff08;1&#xff09;当为互斥操作时&#xff0c;它们处于同一进程
&#xff08;2&#xff09;当为同步操作时&#xff0c;则不在同一进程中出现
&#xff08;3&#xff09;对于前后相连的两个P(S1)P(S2)&#xff0c;顺序是至关重要的:同步P操作应该放在互斥P操作前,而两个V操作顺序则无关紧要


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
MING1981岁月
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有