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

进程管理——进程同步

为什么要进程同步生产者消费者问题了解进程同步之前,先来看这样一个例子,就是著名的生产者消费者模型,生产者消费者问题(英语
为什么要进程同步

生产者消费者问题

了解进程同步之前,先来看这样一个例子,就是著名的生产者消费者模型,

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

上面一段引用是百度百科的解释,大致意思是生产者生产一件商品放在仓库里,仓库的商品count+=1,消费者从仓库中取出一件商品,仓库商品count-=1。

在进程间可以理解为一群生产者进程生产商品提供给消费者进程使用,生产者进程和消费者进程可以并发执行,在两者之间设置一个可容纳n个缓冲区的缓冲池,生产者进程将生产的商品放在缓冲区中,消费者进程可以从缓冲区中取走消费商品。

这个模型在生活中是没有问题的,但是从计算机微观来分析就是存在问题的。在计算机中,缓冲区是在Cache上或主存上的,如果生产者进程或者消费者进程需要操作数据的时候必须分为三个步骤:第一步先把缓冲区的数据取出来放到计算机寄存器里面;第二步把寄存器里的数据+1或者-1,表示生产完成1个产品;第三步需要把这个数据放回到缓冲区里面。

两者并发执行的时候可能会出错,下面将生产者进程和消费者进程并行看待:

假设现在缓冲区内的数据count = 10;
1.执行第一步,生产者进程取出数据register = 10;
2.生产者进程register+=1得到register=11,
3.两个进程并发执行,第三步可能是消费者进程执行,消费者的register=10
4.是消费者进程的第二步,register-=1,消费者寄存器里存9
5.消费者的第三步,把寄存器里的值写入到缓存里,此时两者值都是9,消费者进程完成
6.生产者进程最后一步,把生产者寄存器里的值写入缓冲区,此时的count由9变为11。

这时的答案明显与预期不一致,原本的缓存器值为10,发生+1和-1的操作,此时的缓存器内的值应该还是10。

哲学家进餐问题

关于这个问题的描述摘自百度

有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时便试图取其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐,该哲学家进餐完毕后,放下左右两只筷子又继续思考。
约束条件
(1)只有拿到两只筷子时,哲学家才能吃饭。
(2)如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。
(3)任一哲学家在自己未拿到两只筷子吃完饭前,不会放下手中已经拿到的筷子。

哲学家吃饭的过程有三步:
1.拿起左边的筷子
2.拿起右边的筷子
3.吃饭

假设某一个哲学家饿了,它拿起了左边的筷子,发现右边筷子被拿了,他只能等待右筷子被释放,拿到右筷子后进餐。

在极端的情况下,如果这五个哲学家同时拿起了左筷子,他们都需要等待右筷子的释放,因为他们进餐后才能释放,最终他们拿不到右筷子而全部饿死。

发生上述两个问题的根源: 进程彼此之间没有通信,如果生产者通知了消费者我已经生产好了一件商品,或者哲学家告诉旁边的人我准备进餐了,别动我的筷子,这样就不会发生上述问题。

因此需要进程间的同步:
1.解决对竞争资源在多个进程间进行使用次序的协调
2.使得并发执行的进程之间可以有效的使用资源并相互合作

进程同步原则

临界资源指的是一些虽然作为共享资源但又无法同时被多个线程共同访问的共享资源。 当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用资源的进程释放资源才能重新竞争使用。比如上述例子中的筷子和商品。

为了对临界资源进行有效的约束,提出了进程间同步的四个原则:

  1. 空闲让进:临界资源如果没有被占用,操作系统允许某一进程使用临界资源
  2. 忙则等待:如果资源有进程占用,这时应该防止需要使用资源的进程继续使用资源,而应该让其他请求进程,等待资源被释放
  3. 有限等待:在忙则等待的基础上,临界资源被占用,也要保证别的需要使用资源等待的进程能够在有限的时间内使用资源,以避免等待进程僵时等待
  4. 让权等待:外面需要等待的进程等待时,进程应该让出CPU的使用权,进程从运行状态变为阻塞状态。

进程间同步的方法:
1.消息队列
2.共享存储
3.信号量

线程同步

在多线程并发使用进程资源的时候同样也会发生生产者消费者问题和哲学家进餐问题,因此进程间的多线程也需要同步。

线程同步的方法:


  1. 互斥量:多线程可以互斥的使用临界资源的一个锁
  2. 读写锁:应对多读少写,或者多写少读的情况
  3. 自旋锁
  4. 条件变量

推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
焦鹏666_479
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有