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


推荐阅读
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • linux网络子系统分析(二)—— 协议栈分层框架的建立
    目录一、综述二、INET的初始化2.1INET接口注册2.2抽象实体的建立2.3代码细节分析2.3.1socket参数三、其他协议3.1PF_PACKET3.2P ... [详细]
  • c语言二元插值,二维线性插值c语言
    c语言二元插值,二维线性插值c语言 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细探讨了Spring框架中遇到的NoSuchBeanDefinitionException异常,具体涉及com.thinkplatform.dao.UserLogDao Bean未定义的问题,并提供了相应的解决方案。 ... [详细]
  • 本文介绍了读写锁(RWMutex)的基本概念、实现原理及其在Go语言中的应用。读写锁允许多个读操作并发执行,但在写操作时确保互斥,从而提高并发性能。 ... [详细]
  • 本文详细介绍了JVM内存分配的相关知识,包括内存规整、内存分配方式以及并发指针碰撞问题的解决方案。 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • pypy 真的能让 Python 比 C 还快么?
    作者:肖恩顿来源:游戏不存在最近“pypy为什么能让python比c还快”刷屏了,原文讲的内容偏理论,干货比较少。我们可以再深入一点点,了解pypy的真相。正式开始之前,多唠叨两句 ... [详细]
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社区 版权所有