生产计划课程设计报告

2023-02-15

在日常工作中计划是我们完成工作,实现目标的重要工具,你在拟写计划时会感到无从下手吗?以下是小编精心整理的《生产计划课程设计报告》,欢迎大家借鉴与参考,希望对大家有所帮助!

第一篇:生产计划课程设计报告

企业的资源计划课程设计报告

《企业资源计划ERP》

题目: 课程设计

ERP实施后对供应链管理的影响探讨

班 级 信管 091 专 业 信息管理和信息系统 学 号 姓 名 地 点 经济与管理学院实验室

指导老师 朱宗乾

设计日期 2012-6-24 — 2012-6-29

2012 年 春季 学期

1 设计背景、意义及目标. 1.1 设计背景„„„„„„„„„„„„„„„„„„„1 1.2 设计意义及目的„„„„„„„„„„„„„„„„2

2 设计内容

2.1ERP实施之前供应链管理的现状及存在问题„„„„„„3 2.2 ERP实施后对供应链管理产生的作用„„„„„„„„4 2.3供应链管理的优化 „„„„„„„„„„„„„„„5 2.4供应链管理的发展趋势 „„„„„„„„„„„„„5

3 课程设计心得体会 „„„„„„„„„„„„„„„6 4 参考资料„„„„„„„„„„„„„„„„„„„6

ERP实施后对供应链管理的影响的探究

1 设计背景、意义及目标

概述:“ERP”及“供应链”及“物流”。ERP是企业资源计划的简称,通常指ERP软件,但同时也是一种先进的管理理念。ERP系统是一种主要面向制造行业进行物质资源、资 金资源和信息资源集成一体化管理的企业信息管理系统。通过运用 ERP,企业能够利用计算机对企业的资金、货物、人员和信息等资源进行自动化管理,具有制造,办公操作,供应链 管理,人力资源管理,项目管理,财务管理,客户服务,销售与市场营销等商业功能。ERP 对于在企业高度普及计算机辅助管理, 实现企业管理信息化和自动化, 提高工作效率和增强 快速反应能力,都具有十分重要的意义。供应链指原材料供应商、零部件供应商、生产商、分销商、零售商、运输商等一系列企业组成的价值增值链,他包括的主要环节有:顾客、 制造、分发、运输、库存计划、预估和供应计划等。供应链管理是通过前馈的信息流(需方 向供方流动)和反馈的物料流和信息流(供方向需方的物料流及伴随的供给信息流),将供 应商、制造商、分销商直到最终用户连成一个整体的模式。从企业网络来看,表明供应链是组织之间的一系列交易活动构成的交易关系,并且这种交易关系将最终增值于产品和服务。物流是供应链的一部分,是为了满足客户需要而对商品,服务以及相关信息从产地到消费地的高效低成本流动和存储进行的规划,实施和控制过程。

供应链管理体系比较复杂,可以分成企业间、企业中部门间和企业中生产工序间的三个不同层次的供应链:

1.1 设计背景

从20世纪60年代开始,企业开始了管理信息化的应用 ,从MRP到ERP,逐步

第二篇:操作系统课程设计生产者消费者

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

(操作系统课程设计)

生 产 者 和 消 费

1 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

学生姓名: 学生学号: 班 级:

031140

1、0

2、0

3、04班制

二〇一三年十二月

一、课程题目分析

这个题目是生产者向消费者提供商品,消费者消耗商品,并且两组人共用同一缓冲区。生产者提供了商品之后消费者才能去取商品,消费者若不取走商品则当缓冲区用完之后生产者则不能再向缓冲区中添加新的商品。

思考问题:

(1)对于生产者进程:每产生一个数据,则需去访问共用缓冲区是否有已满,未满则可以将该数据存入并通知消费者进程,否则不能。

(2)对于消费者进程:每当想去消费(取出数据)时,则需访问缓冲区是否为空,为空则不能消费(取出数据),否则可以取,并通知生产者。

(3)缓冲区是个临界资源,所有的进程对于该空间都是共享的,所以,还有互斥问题存在。

二、课程设计目的

通过实验模拟生产者与消费者之间的关系,了解并掌握他们之间的关系及原理。由此增加对进程同步问题的了解:

(1)掌握基本的同步互斥算法,理解生产者与消费者模型

(2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步于互斥

(3)学习使用windows中基本的同步对象,掌握相应的API。

三、 课程设计内容

有n个生产者和m个消费者,连接在具有k个单位缓冲区的有界环转缓冲上,

2 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

故又称有界缓冲问题。其中Pi和Cj都是并发进程,只要缓冲区未满,生产者进程Pi所生产的产品就可投入缓冲区;类似地,只要缓冲区非空,消费者进程Cj就可以从缓冲区取走并消耗产品。

四、开发环境

操作系统:Windows系统 编写语言:C++语言

五、系统分析设计

(一)算法原理

生产者——消费者问题是典型的进程同步问题,这些进程必须按照一定的生产率和消费率来访问共享缓冲区,用P、V操作解决生产者和消费者共享单缓冲区的问题,可设置两个信号量empty和full,其初值分别为1和0,empty指示能否向缓冲区放入产品,full指示能否从缓冲区取出产品。为了使其协调工作,必须使用一个信号量mutex(初值为1),以限制生产者和消费者互斥地对缓冲区进行存取,另用两个信号量empty1(初值为缓冲区大小)和full1(初值为0),以保证生产者不向已满的缓冲区中放入产品,消费者不从空缓冲区中取产品。

(二)功能描述

生产者功能描述:在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。

消费者功能描述:消费者线程从缓冲区获得物品,然后释放缓冲区,当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

(三)算法流程图

生产者流程图: 消费者流程图:

3 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

总的流程图:

湖北民族学院信息工程学院11级计算机专业操作系统课程设计

开始Int i=1,n键盘输入数字,初始化 n SeqSquare *b; b=new SeqSquare(n);键盘输入数字,改变i的值i==0?Y退出Ncout<<"请输入正确的菜单项进行操作!"<

(四)数据结构及部分函数描述

(1)类SeqSquare:对类SeqSquare的声明及其中一些函数

class SeqSquare { public:

SeqSquare(int n); ~SeqSquare(); void P(int x); //p操作 void V(int x); //v操作 bool IsEmpty(); //判断是否为空

5 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

bool IsFull(); //判断是否已满 void deca(); void decb(); int getSize(); int getmaxSize(); int gettop(); int geta(); int getb(); protected: private:

}; 说明:①用动态整型数组*elements来代表缓冲区,不管是生产产品还是对已有产品的消费都需要访问该缓冲区。②函数IsFull()用于判断缓冲区是否已满,生产者能否使用缓冲区。③函数IsEmpty()用于判断缓冲区是否为空,消费者能否使用缓冲区。

(2)生产者和消费者操作及显示函数showbuf:

void producer(SeqSquare *a) //生产者操作 { }

void consumer(SeqSquare *a) //消费者操作 { }

//缓冲区显示

void showbuf(SeqSquare *a) { } (3)在实现本程序的生产者消费者模型时,具体地通过以下同步对象实现互斥:

6 int *elements; int top,a,b,maxSize; a->P(1); a->V(1); int i=a->getSize(); 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

①设一个互斥量Mutex,以实现生产者在查询和保留缓冲区的下一个空位置时进行互斥。

②每一个生产者用一个信号量与消费者同步,通过设置Full实现,该组信号量用于表示相应产品以生产。同时用一个表示空缓冲区数目的信号量Empty进行类似的同步,指示缓冲区中是否存在空位置,以便开始生产下一个产品。

(四)调试过程

为解决生产者、消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用Full表示,其初值为用户输入的缓冲区的大小,另一个表示缓冲区中产品的数目,用Empty表示,其初值为0.另外,由于缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量Mutex,其初值为1. 在生产者、消费者问题中,信号量实现两种功能。首先,他是生产产品和消费产品的计数器,计数器的初值是可使用的资源数目(缓冲区的长度)。其次,他是确保产品的生产者和消费者之间的动作同步的同步器。

生产者要生产一个产品时,首先对资源信号量Full和互斥信号量Mutex进行P操作,申请资源。如果可以通过的话,就生产一个产品,并把产品送人缓冲区。然后对互斥信号量Mutex和资源信号量Empty进行V操作,释放资源。

消费者要消费一个产品时,首先对资源信号量Empty和互斥信号量Mutex进行P操作,申请资源。如果可以通过的话就从缓冲区取出一个产品并消费掉。然后对互斥信号量Mutex和资源信号量Full进行V操作,释放资源。

如果缓冲区中已经没有可用资源,就把申请资源的进程添加到等待队列的队尾。如果有一个资源被释放,在等待队列中的第一个进程被唤醒并取得这个资源的使用权。

(五)参考资料

《操作系统教程》 孙钟秀 高等教育出版社 《C++程序设计》 谭浩强 高等教育出版社

六、运行实例及结果分析

(一)运行实例

缓冲区大小为3,先生产一件产品,显示缓冲区,再接着生产一件产品,消耗一件产品,显示缓冲区,在消耗两件产品,再生产4件产品,改变缓冲区的大小为6,显示缓冲区,选择一个未出现的选项,退出程序。

(二)结果显示

7 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

8 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

(三)结果分析

(1)在每个程序中需要先做P,后做V,二者要成对出现,夹在二者中间的代码段就是该进程的临界区。

(2)对同步信号量full和empty的P,V操作同样必须成对出现,但它们分别位于不同的程序中。

(3)无论在生产者进程中还是消费者进程中,两个P操作的次序不能颠倒:应先执行同步信号量的P操作,然后执行互斥信号量的P操作。否则可能造成进程死锁。

七、个人体验

虽然我也很想用java语言写这个程序,但是由于自己学艺不精,所以只能用C++写。通过这个实验我发现我以前有很多知识都忘记了,重新拿起课本学习 9 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

时发现原来很多不懂得问题都有了新的认识,有一种豁然开朗的感觉。也为我考研开了一个好的开头。

我认为我完成的这个设计做的比较出色的地方是对C++语言中类以及数组的运用,其实这里我对数组的操作是按照“先进先出”的方法进行运作的,这是参考了栈的工作原理,因为缓冲区一般也是堆栈,比较符合设计要求。

这次实验中我感觉做的很粗糙,自己所想的模拟过程的确得到实现了,但是感觉灵活性不太高,思考还不过全面,应该以后多注意一下,多考虑考虑才是。

在这次实验中我重新将《C++程序设计》和《数据结构》的几个重要章节复习了一遍,对类、数组、C++的I/O流类库以及堆栈的语句格式、注意细节都再一次熟悉,感觉蛮有趣的。不过,在编程过程中许多语句的小问题还真是出现不少,而且感觉自己对C++强大丰富的语句方法用得太呆板,不够灵活,总是想到那些常用的,而忽略了颗粒让语句更简短的方法,以后要多多注意才是。

八、附录

// 生产者消费者1.cpp : Defines the entry point for the console application. //

#include "stdafx.h" #include "iostream" using namespace std; class SeqSquare { public: SeqSquare(int n); ~SeqSquare(); void P(int x);

//p操作

void V(int x);

//v操作

bool IsEmpty();

//判断是否为空

bool IsFull();

//判断是否已满

void deca(); void decb(); int getSize(); int getmaxSize(); int gettop(); int geta(); int getb(); protected: private: int *elements; int top,a,b,maxSize; }; 10 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

bool SeqSquare::IsEmpty()

//判断是否为空 { return(top==-1)?true:false; }

bool SeqSquare::IsFull()

//判断是否已满 { return(top>=maxSize-1)?true:false; }

void SeqSquare::deca() { a--; }

void SeqSquare::decb() { b--; }

int SeqSquare::getSize() { return top+1; }

int SeqSquare::getmaxSize() { return maxSize; }

int SeqSquare::gettop() { return top; }

int SeqSquare::geta() { return a; }

int SeqSquare::getb() {

11 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

return b; }

SeqSquare::SeqSquare(int n) { top =-1; a = b =0; maxSize = n; elements = new int[maxSize]; }

void SeqSquare::P(int x) { if(IsFull()==true) {

a=a+1; } else

{

elements[++top] = x;

} }

void SeqSquare::V(int x) { if(IsEmpty()==true) {

b = b+1; } else

{

x = elements[top--];

} }

12 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

void producer(SeqSquare *a)

//生产者操作 { a->P(1); }

void consumer(SeqSquare *a)

//消费者操作

{ a->V(1); }

SeqSquare::~SeqSquare() { delete elements; }

//缓冲区显示

void showbuf(SeqSquare *a) { int i=a->getSize();

}

int main() { int i,n; cout<<"请输入缓冲区大小:"<>n; SeqSquare *s; s = new SeqSquare(n); while(i!=4) {

cout<<"请选择操作:

"<

4.退出系统。

"<

"<>i;

switch(i)

{

case 1:

producer(s);

if (s->geta()==0)

{

13 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

cout<

}

else

{

cout<

s->deca();

}

break;

case 2:

consumer(s);

if (s->getb()==0)

{

cout<

}

else

{

cout<

}

break;

case 3:

showbuf(s);

cout

"<<"可用空间为:"<<(n-s->getSize())<

break;

case 4:

cout<

break;

case 5:

cout<

cin>>n;

s = new SeqSquare(n);

cout<

break;

default:

cout<

}

}

return 0; }

第三篇:学习课程:如何做好生产计划与物料控制

单选题

1.下列哪项不是鼓点式交货方式的特征 回答:正确

1. A

2. B

3. C

4. D 实现可预测性交货标准包装下游成本转移至上游库存量由客户指定

2.在实施推进式生产计划时,企业内部下订单的是下列哪个部门 回答:正确

1. A

2. B

3. C

4. D 市场部门物料部门装配部门包装部门

3.在制造业企业的订购和存量方式中,被称之为货窗式管理方式的是 回答:正确

1. A

2. B

3. C

4. D 定期的订购方式存量管制S-s管制法批对批法MRP输入系统管理

4.关于呆料,下列说法不正确的是 回答:正确

1. A

2. B

3. C

4. D 呆料是物料从进入货仓时产生的呆料是指那些在货仓中一段时期内不进也不出的物料有些物料往往从采购之时开始就成为了呆料物料部门成立专门的呆料小组非常有必要

5.生产物料可以量化成一个管理项目,即备料到位率。那么,备料到位率的分母是 回答:正确

1. A

2. B

3. C

4. D 准时交货的发料单数备货的单数生产的发料单数总的生产的发料生产单数

6.在建立准时化采购流程时,企业首先要关注 回答:正确

1. A

2. B

3. C

4. D 小批量请购时的合理单价建立最适当的安全库存最佳采购时间与采购数量控制物料库存量

7.在具体制定考核指标时,生产计划与物料控制部门要依据三个渠道。其中依据岗位职责说明书的是 回答:正确

1. A

2. B

3. C

4. D 任务导向PQCD SME管理要求以上都不是

8.物料部门需要处理的工程更改包括客户提出的整改和企业内部整改。下列哪项是两者的区别 回答:正确

1. A

2. B

3. C

4. D 更改前的物料处理时间上的规定更改后的物料处理产品单价的变化

9.传统上认为,下列哪项工作不属于物料管理的范畴 回答:正确

1. A 物料计划

2. B

3. C

4. D 采购物料控制仓储

10.下列哪项不是货仓的功能 回答:正确

1. A

2. B

3. C

4. D 组成物料包管物料采购物料跟催物料

11.下列哪项不是物料准时备料的考量标准 回答:正确

1. A

2. B

3. C

4. D 供应商能够准时交货物料控制部门能否跟进计划货仓是否准时备料物管是否能够及时发料到生产线上

12.下列哪项可能是企业出现物料短缺的原因 回答:正确

1. A

2. B

3. C

4. D 紧急订单供应商脱期产品设计临时改变以上都有可能

13.精益采购的极限目标是 回答:正确

1. A

2. B

3. C 原材料和外购件的库存为零实现企业内部JIT系统的延伸成为实施JIT经营的必然要求和前提条件

4. D 完全暴露物料采购中的问题

14.在导致物料短缺的原因中,下列哪项不是物料控制部门的责任 回答:正确

1. A

2. B

3. C

4. D 生产计划出现变更物料计划不合理未设定合理的安全存量对物料进度没有进行有效控制

15.在实施拉动式生产计划的过程中,负责解决技术问题以及产品品质问题的是 回答:正确

1. A

2. B

3. C

4. D 生产部门生产计划与物料控制部门市场部门客服部门

第四篇:经典的课程:生产计划与物料控制PMC

生产计划与物料控制高级研修班(PMC)

 培训对象:生产总监、生产经理、生产计划经理、生产计划员、车间主任、物料主管、采购主管及相关人员 课程简介: 生产计划和物料控制部门是一个企业“心脏”,统筹营运资金、物流、信息等动脉,其制度和流程决定公司盈利成败.),这个部门(PMC)掌握企业生产及物料运作的总调度和命脉.直接涉及影响生产部、生产工程部、采购、货仓、品控部、开发与设计部、设备工程、人力资源及财务成本预算控制等.生产及物料控制部门和相关管理层必须充分了解:物料计划、请购、物料调度、物料的控制(收、发、退、借、备料等)、生产计划与生产进度控制,并谙熟运用这门管理技朮来解决问题。

第一室:销售计划/生产计划/物料计划协调接口管理

1.销售计划/生产计划角色和定位---订单总导演/总指挥

2.销售计划/生产计划/物料计划先进组织架构

◆东莞诺基亚公司销售计划/生产计划/物料计划组织架构

3.生产计划/物料控制五大职能----欠料分析跟进/备料功能/呆料预防--处理

4.生产计划与销售业务链接流程

◆准时生产计划VS市场业务部VS客户“三赢”规则

◆中兴通讯销售计划/生产计划/物料计划接口职能图/资源图实例分析

◆美的滚动周计划负荷分析和三天生产计划不能变职能图

◆控制扦单、急单、补单/加单五种措施--某公司

◆通过市场调查/信息反馈提高订单预测准确率三大做法

5.销售预测与主生产计划(MPS)与

月/周生产计划/物料计划(MRP)链接流程--ordermanagemen

◆销售预测/生产计划变化反馈和预测库存控制协调--

销售预测微调制度化降低预测库存成本原理分析

◆销售计划流程――销售预测流程/销售计划流程/备货计划流程/生产计划流程

6.制造业生产计划控制三种模式――

预期滚动计划系统/推进式生产控制系统/拉动式生产控制系统

◆世界五百强企业.施耐德电气Schneider新产品推进式生产控制系统

第二室销售计划/生产计划控制流程---ordermanagement-(包括项目计划)

1.销售预测计划/主生产计划(MPS)与月/周生产计划控制流程七途径--

讲师/学员点评某公司现场诊断

◆提升编制销售预测计划编制准确性六大步骤

◆华润集团销售预测计划编制六大步骤实例分析

◆青岛海尔新产品项目计划总体方案控制流程实例分析--ordermanagement

◆西门子月/周/项目计划时间节点协调流程分析

◆富士康SAP系统主生产计划流程案例---ordermanagement

◆大金空调计划控制流程ERP-ORACLE系统主界面实例分析

◆青岛海尔月/周/日项目计划协调流程实例分析

◆富士康集团(台湾)公司月度滚动产能负荷分析/

三天生产计划不能变的滚动产能负荷分析实例分析

2.透过准时化生产机制解决订单频繁变更三种方法--Productionplanchangemanagement

◆顺德美的日用集团扦单、急单、补单/加单/生产计划紧急控制流程实例分析

◆飞利浦扦单/急单计划紧急控制流程案例分析-Productionplanchangemanagement

◆飞利浦生产查询界面/生产删改信息查询界面/产品工艺流程查询界面

/产品作业报表查询界面实例解析

3.生产计划控制管理(精益)模式---均衡化/柔性化拉动计划

◆准时化/均衡化生产方式(JIT)运用方法四大独特之处

◆准时化生产方式---柔性化与同步化与均衡化

◆某法国著名企业(拉动)一周生产计划不能变控制流程实例分析

◆准时化生产方式双广告牌管理的基本原理解析

◆杭州博世(BOSCH)均衡化(拉动)一周生产计划板不能变

(生产广告牌)实例图片及说明分析

◆飞利浦负荷瓶颈库存量设定实例—离散型生产模式

第三室生产计划进度控制----deliverymanagement

1.缩短产品周期流程--leadtimereduction

◆西门子产品周期缩短流程价值流案例分享

◆某公司缩短产品周期电脑系统(用友)流程主界面实例分析

2.月/周生产计划产能连续滚动负荷分析制度化

◆中国某著名公司月度主排产计划制定十三依据

◆中国某著名公司三天生产计划依据制定九依据

3.月/周生产计划排程表制定与执行重点演练--

4.分析产能负荷七要素方面---人力负荷/机器负荷--

◆广州某公司2007/04月产能负荷分析会实录文件

5.生产进度监控三个阶段------事前/事中/事后

(1)如何统计分析生产数据

生产能力效率表/综合效率分析----事后管理

第四室物流计划跟进与存量管制

◆物流计划流程七步骤----某公司学员现场诊断(学员与讲师互动点评)

◆扦单、急单、补单/加单/生产计划紧急update物料计划流程解析

◆上海西门子ERP—SAP/R3系统RUN-MRP流程主界面分析

◆北京某公司NormalOrder/CONSIGNMENT/VMI/JIT/BufferControl

四种采购工作流程

1.供货商交期管制十大之道--leadtimereduction

◆伟创力(Flextronics)在物料欠料分析表实例分析

◆物料短缺八大原因和七种预防对策

2.物料管理相辅相成十四流程--warehousemanagement

(1)物料管理精髓三个盲点和八大死穴--―

伟创力美资公司呆料预防/处理制度实例/工程更改流程分析

◆美的/一汽马自达公司/精工集团(日资)

补料/损耗控制案例分析--降低内循环成本

3.最新先进物流管理(精益)流程模式

◆物料管理---JIT三A政策六措施

◆深圳某著名台资企业(雷卫旭辅导)JIT供货推行十二步骤计划表实例解析

(1)内部物流配送管理流程解析--Internallogisticmanagement

◆格力空调JIT物料操作指导书解析--warehousemanagement

◆博世(BOSCH)现场利用电子标签发料实例分析

◆在线补充物料(RIP)KANBAN计算

◆物料补充时间间隔计算

◆在线物料标识及KANBAN卡设计

◆博世配送系统物料广告牌实物/图片实例分析

◆华晨宝马现场超市广告牌请购图片实例分析

◆ABB/AREVA现场超市双箱广告牌请购图片实例分析

(2)外部供应物流配送管理流程解析

◆通用汽车JIT供应商物流评审标准解析(SQE)

◆供应商管理库存(VMI)-某著名企业VMI协议实录分析

◆华强三洋供应商驻厂代表配送/退料/换料广告牌实物图片实例分析/

集货配送(Milk-Run)管理方法

◆ 使用条形码及与供货商进行电子数据交换(EDI)实例展示

◆ 存量管制--inventorymanagement

◆需求预测、物料计划与库存控制原理/四大策略

◆青岛海尔公司需求预测变化和库存相应调整控制流程实例

◆长虹采购订单模式实例分析----

大陆标准/通用物料采购/海外leantime长物料采购

◆安全存量VS最高存量VS.最低存量定义

◆安全存量三种设定方法

◆ABC控制法--warehousemanagement

◆长周期采购批量、库存控制与销售预测的量变关系

◆库存量降低五大方法

◆库存周转率定量计算

◆提高库存周转率的途径

尾声:当头棒喝—捅破窗纸

1.结合公司实际情况通过学员体会分享

2.讲师点评

3.实践/活用所学五步

讲师介绍

精益/JIT-生产/物料计划/采购方面的专家.“寓观念于谈笑间,蕴哲理于诙谐中”,风格生动、幽默,讲解深入浅出或浅入深出,不仅案例丰富,且提供多种实用的解决问题之工具及技巧.至今有四万九仟以上人次接受专业课程训练,其务实的作风深受好评.

第五篇:操作系统课程设计__用多线程同步方法解决生产者

临界区管理实现 本组组员:周琪皓,董泉伟,钟佳锋,张倬慎 0 引言 随着多处理机体系结构的演变和分布式与并行系统的发展,并发多任务的程序设计技术已愈来愈显得重要,多线程设计模式在这些技术的发展中起着重要作用。在现代操作系统中,利用进(线)程间的并发性实现程序中并发成分的并行执行,可大大提高系统的处理能力和效率,但也可能带来诸如执行结果的不确定性等不良现象,因此并发系统中处理好进(线)程间的互斥与同步就显得至关重要。C++语言中的多线程机制是解决线程间的互斥与同步问题的重要工具,其应用(如网络多媒体应用、工业自动化控制等)很广泛,很复杂且常易出错。因此在应用程序设计过程中,要考虑多个线程如何同步使用进程的共享资源,如何让一个线程与另一个线程协调合作,以免产生线程间的访问冲突

1.操作系统:Windows 2.程序设计语言:C++语言

3.有界缓冲区内设有20个存储单元,其初值为0。放入/取出的数据项按增序设定为1-20这20个整型数。

技术要求:

1、 生产者和消费者各有两个以上。多个生产者或 多个消费者之间须有共享对缓冲区进行操作 的函数代码。每个生产者和消费者对有界缓冲 区进行操作后,即时显示有界缓冲区的全部内 容,当前指针位置。

2、 编写多线程同步方法解决生产者-消费者的程 序,并完成对进程进行模拟同步和互斥的控制。 2 设计总体思路 2.1 多线程编程思想 编写Windows下的多线程程序,需要使用头文件pthread.h以及windows.h.在LINUX下进行多线程编程首先要用到CreateThread()这个函数.函数CreateThread()用来创建一个线程,它的原型为:

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes DWORD dwStackSize, // initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId); // pointer to receive thread ID 第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。 第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。 第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明: DWORD WINAPI ThreadProc (PVOID pParam) ; 第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。 第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。 第六个参数是一个指标,指向接受执行绪ID值的变量。 2.1.1线程数据 在单线程的程序里,有两种基本的数据:全局变量和局部变量。但在多线程程序里,还有第三种数据类型:线程数据。它和全局变量很象,在线程内部,各个函数可以象使用全局变量一样调用它,但它对线程外部的其它线程是不可见的。这种数据的必要性是显而易见的。例如我们常见的变量errno,它返回标准的出错信息。它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全局变量,否则在A线程里输出的很可能是B线程的出错信息。 ThreadHandle[0]=CreateThread(NULL,0,Producer,NULL,0,&producer1)其六个参数分别表示为安全设置,堆栈大小,入口函数,函数参数,启动选项,输出线程 ID,返回线程句柄。 2.1.2 互斥锁 互斥锁用来保证一段时间内只有一个线程在执行一段代码,必要性显而易见:假设各个线程向同一个文件顺序写入数据,最后得到的结果一定是灾难性的.函数mutex = CreateMutex(NULL,FALSE,NULL);用来生成一个互斥锁.NULL参数表明使用默认属性.如果需要声明特定属性的互斥锁,须调用函数

CreateMutex(NULL,FALSE,NULL)

WaitForSingleObject(mutex,INFINITE)声明开始用互斥锁上锁,直至调用ReleaseMutex(mutex)为止,均被上锁,

即同一时间只能被一个线程调用执行.当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那么此线程被阻塞,即程序将等待到另一个线程释放此互斥锁. 2.1.3 信号量 信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数aitForSingleObject(empty,INFINITE)增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数WaitForSingleObject(full,INFINITE)减少信号量。

函数 ReleaseSemaphore(full,1,NULL)用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。函数ReleaseSemaphor()用来释放信号量。 2.2 设计原理 生产者线程和消费者线程共享同一个缓冲队列,生产者线程向缓冲区中写数据,消费者线程从缓冲区中取数据。但两者必须在使用缓冲队列资源时保持互斥,否则可能会导致在写入时产生数据覆盖,在读出时得到错误数据。因而要在程序中设置一个互斥锁或公用信号量,用于保证线程间的互斥执行。同时生产者线程和消费者线程必须保持同步关系,因为生产者线程的执行为消费者线程提供了需要的数据,是其执行的前提。反之,消费者线程的执行为生产者线程腾出了空闲的缓冲单元,为写数据提供了条件。即消费者线程执行的前提:缓冲队列中至少有一个单元有数据;生产者线程执行的前提:缓冲队列中至少有一个单元是空的。在设计过程中,利用信号量和wait 、signal原语操作来实现。如图1所示:

图1 生产者、消费者共享有界缓冲区

2.3 原语操作实现 The structure of the producer process do { // 生产产品 wait (empty); wait (mutex); // 往Buffer中放入产品 signal (mutex); signal (full); } while (true); The structure of the consumer process do { wait (full); wait (mutex); // 从Buffer中取出产品 signal (mutex); signal (empty); // 消费产品 } while (true); 3 开发环境与工具 系统平台:Windows环境 实现语言:C++语言 开发工具:Vs2012 4 概要设计 4.1 数据结构设计 通过分析课程设计要求,具体设计出如下数据结构: 1. int buffer[20]={0};//定义缓冲区空间大小 2.包含数据结构pthread_t 它记录一个线程的号,主要包括下面几个函数,完成不同的功能: ThreadHandle[0]=CreateThread(NULL,0,Producer,NULL,0,&producer1); //创建一个线程。 ExitThread(0); CloseHandle(ThreadHandle[0]); //等待一个线程结束。 4.2 程序模块实现 4.2.1 生产者(Producer)模块 生产者线程向一缓冲区中写入数据,且写入缓冲区的数目不能超过缓冲区容量。当生产者产生出数据,需要将其存入缓冲区之前,首先检查缓冲区中是否有“空”存储单元,若缓冲区存储单元全部用完,则生产者必须阻塞等待,直到消费者取走一个存储单元的数据,唤醒它。若缓冲区内有“空”存储单元,生产者需要判断此时是否有别的生产者或消费者正在使用缓冲区,若是有,则阻塞等待,否则,获得缓冲区的使用权,将数据存入缓冲区,释放缓冲区的使用权,其流程图如图2所示: 生产一条数据No是否可用存储单元等待资源,阻塞Yes被唤醒No是否可用Yes存入一条数据等待使用权,阻塞被唤醒归还使用权数据单元加1,唤醒消费者 图

2 生产者流程图

//生产者线程 DWORD WINAPI Producer(LPVOID lpPara) { do{ WaitForSingleObject(empty,INFINITE); 冲区减1 WaitForSingleObject(mutex,INFINITE); 上锁 //空缓//信号量 buffer[in]=in+1; //往Buffer中放入产品 in=(in+1)%BUFFER_SIZE; //放入指针调整,为下次送出做准备 printAll(); ReleaseMutex(mutex); //信号量解锁 ReleaseSemaphore(full,1,NULL); //满缓冲区加1,即当公共资源增加时,调用函数ReleaseSemaphore()增加信号量 }while(1); }

4.2.2 消费者(Consumer)模块 消费者线程从缓冲区中读取数据,且消费者读取的数目不能超过生产者写入的数目。消费者取数据之前,首先检查缓冲区中是否存在装有数据的存储单元,若缓冲区为“空”,则阻塞等待,否则,判断缓冲区是否正在被使用,若正被使用,若正被使用,则阻塞等待,否则,获得缓冲区的使用权,进入缓冲区取数据,释放缓冲区的使用权。其执行流程如图3所示:

No是否可用存储单元等待资源,阻塞Yes被唤醒是否可用No等待使用权,阻塞Yes被唤醒取出一条数据归还使用权空缓冲区加1,唤醒一个生产者消费数据 图3 消费者流程图 //消费者线程 DWORD WINAPI Consumer(LPVOID lpPara) { do{ WaitForSingleObject(full,INFINITE); 区减1 WaitForSingleObject(mutex,INFINITE); 量上锁 //满缓冲 //信号 buffer[out]=0; //从Buffer中取出产品 out=(out+1)%BUFFER_SIZE; //取指针调整,为下次取做准备 printAll(); ReleaseMutex(mutex); //信号量解锁 ReleaseSemaphore(empty,1,NULL); //空缓冲区加1 }while(1); } 5 详细设计 5.1 源程序代码 #include #include #include #include #include using namespace std; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); #define WINAPI_stdcall #define THREAD_NUM 20 #define BUFFER_SIZE 20 //20个缓冲区 int buffer[20]={0}; HANDLE empty; HANDLE full; HANDLE mutex; //for mutual exclusion进程信号量 int in=0; //point to the next free positon int out=0; //point to the first full positon //把所有的缓冲区输出到屏幕上 void printAll(){ int i; for(i=0;i<20;i++) cout<

进入Windows开发环境后,通过Vs2012编辑器在其中编写。进入Vs2012的命令,对程序执行编译运行命令后,即可在屏幕上显示出程序运行的结果,其运行结果如下图5所示:

7 总结

其实在做这道题目时花费了好长时间,第一点是书上大多介绍的是关于UNIX系统下的消费者生产者线程问题,因此一开始调试不出来,后来查阅了有一些资料知道要在windows平台下运行必须要导入以及两个库。 通过这次课程设计,不但加深了对操作系统这们课程的认识,而且还了解了操作系统中使用信号量解决生产者—消费者问题算法的实现。比如:用信号量解决生产者—消费者问题时,可以通过一个有界缓冲区(用数组来实现,类似循环队列)把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中去走产品并消费它。为了解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用full表示,其初始值为有界缓冲区的大小;另一个表示缓冲区中产品的数目,用empty表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要再设置一个互斥信号量mutex,起初值为1。在生产者/消费者问题中,信号量实现两种功能。首先,它是生产产品和消费产品的计数器,计数器的初始值是可利用的资源数目(有界缓冲区的长度)。其次,它是确保产品的生产者和消费者之间动作同步的同步器。 生产者要生产一个产品时,首先对资源信号量full和互斥信号量mute进行操作,申请资源。如果可以通过的话,就生产一个产品,并把产品送入缓冲区。然后对互斥信号量mutex和资源信号量empty进行操作,释放资源。消费者要消费一个产品时,首先对资源信号量empty和互斥信号量mutex进行操作,申请资源。如果可以通过的话,就从缓冲区取出一个产品并消费掉。然后对互斥信号量mutex和资源信号量full进行操作,释放资源。 另外,使我们体会最深的是:任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效。短短的课程设计就要结束了,不但对专业知识有了更深的理解,更使自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果,特别是程序语言的学习。

上一篇:市场监管局民主生活会下一篇:水车间安全生产责任制

本站热搜