热门标签 | 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操作顺序则无关紧要


推荐阅读
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期)
    清华大学出版社 | 杨丹:基于MATLAB机器视觉的黑色素瘤皮肤癌检测技术及源代码分析(第1689期) ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 手指触控|Android电容屏幕驱动调试指南
    手指触控|Android电容屏幕驱动调试指南 ... [详细]
  • 算法学习心得与经验总结
    在算法学习的过程中,我总结了一些宝贵的心得和经验。本文将重点探讨莫比乌斯反演技巧的应用,并提供详细的实例解析。通过不断的学习和实践,我逐步掌握了这一复杂但强大的工具。此外,文章还将分享一些实用的学习资源和参考资料,帮助读者更好地理解和应用这些算法。希望本文能为算法学习者提供有价值的参考和指导。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • 哈希表(Hash Table)是一种高效的查找算法,与传统的链表和树结构相比,其在查找过程中无需进行逐个元素的比较。本文将深入探讨哈希表的基本原理、应用场景以及优化策略,帮助读者全面理解其在实际开发中的优势和局限性。通过实例分析和代码示例,我们将展示如何有效利用哈希表提高数据处理效率,并解决常见的冲突问题。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 在Python网络编程中,多线程技术的应用与优化是提升系统性能的关键。线程作为操作系统调度的基本单位,其主要功能是在进程内共享内存空间和资源,实现并行处理任务。当一个进程启动时,操作系统会为其分配内存空间,加载必要的资源和数据,并调度CPU进行执行。每个进程都拥有独立的地址空间,而线程则在此基础上进一步细化了任务的并行处理能力。通过合理设计和优化多线程程序,可以显著提高网络应用的响应速度和处理效率。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 本文探讨了一种高效的算法,用于生成所有数字(0-9)的六位组合,允许重复使用数字,并确保这些组合的和等于给定的整数N。该算法通过优化搜索策略,显著提高了计算效率,适用于大规模数据处理和组合优化问题。 ... [详细]
  • 具备括号和分数功能的高级四则运算计算器
    本研究基于C语言开发了一款支持括号和分数运算的高级四则运算计算器。该计算器通过模拟手算过程,对每个运算符进行优先级标记,并按优先级从高到低依次执行计算。其中,加减运算的优先级最低,为0。此外,该计算器还支持复杂的分数运算,能够处理包含括号的表达式,提高了计算的准确性和灵活性。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
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社区 版权所有