`
arganzheng
  • 浏览: 104355 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于生产者-消费者问题的一些思考

阅读更多

关于生产者-消费者问题的一些思考

写过一些多线程程序之后,回过头来重新翻开《APUE》和《UNP:IPC》,感觉特别有收获。这里小小总结一下。

1. 定义
Producer-Consumer Problem: also known as the bounded buffer problem.
One or more producers (threads or processes) are creating data times that are then processed by one or moree consumers (threads or processes). The data items are passed between the producers and consumers using some type of IPC.

2. 参与者
Producers:生产者,负责往bounded buffer(一般是队列)里插入数据(一般是任务job)。
Consumers:消费者,负责从bounded buffer中取出数据(一般是job),进行处理。

3. 数据共享或消息传递
有些数据需要各个进程都看得到和操作的到。比如队列和里面的数据。
数据共享方式一般有:共享内存(用户级别,多线程天生共享内存),文件系统
消息传递机制有:Pipe和FIFO(内核级别的数据共享),Socket(内核级别,本地用Unix Domain Socket),文件系统。
 
4. 协作点
1. 并发控制——因为有多个生产者和消费者,他们会对同一个队列同时进行操作,这必然需要并发控制。
并发控制一般使用各种锁机制(Lock),如mutex,reader-writer lock, 还有信号量(带通知机制的计数锁)。

2. 通知机制——生产者需要知道队列什么时候有空间可以放数据;消费者需要知道队列什么时候有数据可以消费。另外,在现实世界,任务一般是有限的,消费者需要知道什么时候自己可以停止了(队列不可能有数据了),这一般要求生产者告诉消费者他已经不再创建任务了。一种简单的做法是直到生产者将所有任务创建完成才启动消费者,这样就只需要同步消费者,但是如果创建任务是一件很耗时的操作,那么显然边创建边消费是一件更快速的做法。如果没有通知机制的引入,那么各个线程可能需要轮询(polling),这是对CPU资源的一种浪费。
线程/进程间的通知机制一般有条件变量(Condition Variables)或者信号量(Semaphone)。

其中第三点和第四点其实是有点互斥的。数据越不共享,越不需要并发控制,但是进程间通讯就越困难。

实战——数据迁移
目标:将Oracle的PRODUCT_DETAIL表给定范围数据迁移到MySQL集群中。

方案1:Map-Reduce思想,尽量减少并发控制。
将任务划分为N个不相干的子集,分配给每个进程/线程处理,各个进程和线程自己使用自己的数据结构,这样就不需要与其他进程/线程同步。父进程/线程等所有的子进程/线程处理完任务之后,将他们的结果进行汇总(不一定需要)。比如我们这个例子,可以这么做:
将迁移到数据区间[minId, maxId]划分成N个小区间,比如[minId, maxId_1],[maxId_1+1, maxId_2],... ,[maxId_n+1, maxId],对每个区间进行独立迁移。由于每个区间变小了,所以该区间的操作就可以单进程/线程执行,减少复杂性。
这种方案中,子进程/线程既是生产者也是消费者,只是每个人都工作量减少了。所有子线程走的是同样的程序。

方案2:传统的Producer-Consumer思想。
一个或者多个生产者进程/线程,负责从Oracle数据库中取出给定区间需要迁移到记录id,放在一个队列里。
一个或者多个消费者进程/线程,每次从队列中取出一个产品id,对该id对应的记录进行迁移。直到任务完成。
不同与方案1,方案2有明确的生产者消费者分工,生产者和消费者走到是完全不同的程序。这种协作其实类似与工厂里面的流水线操作,每个进程只是负责迁移工作的一部分(生产或者消费)。
如果消费者在生产者结束生产之前启动,需要生产者告诉消费者它已经创建完所有任务了,以让消费者知道什么时候可以停止。

数据迁移其实最困难的部分在于迁移到算法,如何保证迁移过程不产生脏数据和数据丢失。另外,对数据库连接数的控制也是要考虑的。由于迁移过程比较耗时,打印迁移进度和统计迁移信息也是必要的。

分享到:
评论

相关推荐

    操作系统中哲学家就餐问题和生产者消费者问题实验报告

    ### 操作系统中哲学家就餐问题和生产者消费者问题实验报告 #### 一、BACI并发程序设计系统概述 BACI(Berkeley ACI)是一个专为并发编程设计的系统,它允许程序员在诸如C++、C、Java等高级语言中嵌入特定的并发...

    基于队列的状态机—生产者消费者架构

    ### 基于队列的状态机—生产者消费者架构知识点详解 #### 一、状态机的概念与作用 **状态机**是一种广泛应用于程序设计中的模式,尤其在LabVIEW这类图形化编程环境中,状态机被用来控制程序流程和状态转换。在...

    电子科大操作系统课程报告信号量哲学家就餐,生产者消费者实验_信号量生产者消费者pv完整代码

    《电子科大操作系统课程报告:信号量在哲学家就餐与生产者消费者问题中的应用》 在计算机科学领域,操作系统课程中的经典实验常常涉及到进程的同步和互斥问题,其中信号量是解决这些问题的重要工具。本实验主要研究...

    《操作系统》实验报告-生产者——消费者.pdf

    《操作系统》实验报告中的“生产者-消费者”问题是一个经典的多进程同步问题,它涉及到操作系统中的进程同步、互斥机制,以及如何通过编程实现这些问题的解决方案。在这个实验中,学生需要深入理解进程间的同步和...

    生产者与消费者问题算法实现.txt

    ### 生产者与消费者问题算法实现 #### 一、引言 在计算机科学领域中,“生产者-消费者问题”(Producer-Consumer Problem)是多线程编程中的一个经典问题,通常用于解决进程间的同步问题。该问题的核心在于如何...

    操作系统实验报告(哲学家就餐问题、读者写入者问题)

    有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从...

    用C#实现操作系统中银行家算法、读者写者、哲学家进餐、消费者生产者的窗体

    银行家算法、读者写者问题、哲学家进餐问题以及生产者消费者问题是这方面的经典示例,它们都是解决并发控制和资源管理的经典模型。本文将详细介绍如何用C#编程语言实现这些算法,并探讨它们在实际操作系统的应用。 ...

    经典进程同步问题(代码+文档)

    2. **生产者-消费者问题**:这是一个典型的资源分配问题,涉及生产者进程生成产品并放入缓冲区,而消费者进程则从缓冲区取出产品消费。问题的关键在于避免生产者过快填满缓冲区或消费者过快清空缓冲区,导致进程间...

    陈瑜-消费者也能成为“资本家”:消费资本化理论

    消费资本化理论的出现,挑战了传统经济学中关于资本和消费的划分,它强调了消费者在市场经济中的主体地位。同时,这一理论也为政策制定者提供了新的思考方向,如何通过法规和政策引导,鼓励企业和消费者参与到消费...

    java代码-wait-notify 生产者消费者

    在Java编程中,"生产者消费者"模型是一种常见的多线程问题解决策略,它通过共享资源来实现数据的生产和消费。在这个模型中,通常有两个线程:一个扮演生产者的角色,负责生成数据;另一个扮演消费者的角色,负责处理...

    操作系统 实验报告(含代码) 死锁和饥饿2 哲学家就餐问题

    本实验主要针对操作系统中的“死锁”与“饥饿”问题展开研究,通过经典案例——哲学家就餐问题,加深对这两种资源分配问题的理解及解决策略。 #### 实验目标 1. **理解死锁与饥饿现象的产生原因**:死锁是指多个...

    操作系统的几个经典算法

    本文将深入探讨四个经典的操作系统算法:理发师问题、哲学家问题、生产者-消费者问题以及读者-写者问题。 1. **理发师问题**: 理发师问题是多线程并发控制的一个典型例子,描述了一个小镇理发师既要给自己理发,...

    电商平台折扣定价预售对消费者购买意愿的影响研究--基于顾客感知价值视角.pdf

    通过文献回顾和实证研究,本文尝试从顾客感知价值的角度出发,深入探讨这些问题,并期望为电商平台提供一些营销启示,帮助其通过预售模式来赢得消费者的青睐。 综上所述,本文的研究不仅从理论上丰富了预售模式的...

    操作系统课后习题答案

    本节习题答案将着重介绍操作系统中的一些关键概念,包括临界资源、临界区、同步机构、信号量、生产者-消费者问题等。 1. 临界资源和临界区 临界资源是指只能被一个进程访问的资源,而临界区是指访问临界资源的那段...

    基层烟花爆竹安全生产管理工作的思考-安全管理-行业安全-石油化工.docx

    - 教育消费者正确购买和燃放烟花爆竹的方法。 5. **优化零售布局**: - 合理规划烟花爆竹零售网点布局,避免过度集中。 - 鼓励发展专业化经营,提高服务质量。 6. **增强基层监管能力**: - 加大对基层监管...

    进程同步问题文.pdf

    尽管代码有部分OCR扫描错误,但从代码的结构和使用的PV操作可以推断出这是关于使用信号量解决生产者-消费者问题、哲学家就餐问题等同步问题的示例。在解决这些问题时,通常需要合理分配信号量,以及编写正确的P和V...

    操作系统实训报告

    - **生产者-消费者问题**:利用EOS提供的信号量机制来解决生产者-消费者问题。 - **源代码分析**:跟踪并分析EOS信号量的实现细节。 - **功能扩展**:对EOS信号量的实现进行改进,增加等待超时唤醒和批量释放的...

    操作系统(OS, Operating System) 课件:第2章进程管理2.pdf

    以下是针对生产者-消费者问题、哲学家就餐问题以及读者-写者问题的详细解释: **生产者-消费者问题**: 这是一个经典的并发控制问题,涉及到生产者进程生成数据并将其放入缓冲区,而消费者进程则从缓冲区中取出并...

Global site tag (gtag.js) - Google Analytics