生产者消费者实验收获

2024-07-04

生产者消费者实验收获(共7篇)

篇1:生产者消费者实验收获

南京信息工程大学 实验(实习)报告

实验(实习)名称 生产者-消费者问题的模拟实现 实验(实习)日期 2014.11.30 得分 指导教师 陈遥

系 计算机

专业 计科 年级 12级

班次 2 姓名 唐薇 学号 20122308061

一、实验目的

本实验的目的是通过编写和调试一个解决生产者–消费者问题的简单模拟程序,进一步深入理解课堂教学中讲授的进程同步问题,以及用于解决同步问题的信号量机制的基本思想,即通过研究进程同步和信号量机制实现生产者消费者问题的并发控制,以便阶段性地巩固学习成果。

二、实验内容

(1)概述

说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数。

编制程序模拟解决生产者-消费者同步问题。具体设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费线程的标识符。(2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。(2)设计原理

通过一个有界缓冲区把生产者和消费者联系起来。假定生产者和消费者的优先级是相同的,只要缓冲区未满,生产者就可以生产产品并将产品送入缓冲区。类似地,只要缓冲区未空,消费者就可以从缓冲区中取走产品。应该禁止生产者向满的缓冲区送入产品,同时也应该禁止消费者从空的缓冲区中取出产品,这一机制由生产者线程和消费者线程之间的互斥关系来实现。与计算打印两进程同步关系相同,生产者和消费者两进程Producer和Consumer之间应满足下列两个同步条件:

• 只有在缓冲池中至少有一个缓冲区已存入消息后,消费者才能从中提取信息,否则消费者必须等待。

• 只有缓冲池中至少有一个缓冲区是空时,生产者才能把消息放入缓冲区,否则生产者必须等待。

为了满足第一个同步条件,设置一个同步信号量full,它代表的资源是缓冲区满,它的初始值为0,它的值为n时整个缓冲池满。这个资源是消费者进程Consumer所有,Consumer进程可以申请该资源,对它施加P操作,而Consumer进程的合作进程生产者进程Producer对它施加V操作。同样为了满足第二个同步条件,设置另一个同步信号量empty,它代表的资源是缓冲空区,它的初始值为n,表示缓冲池中所有缓冲区空。信号量full表示可用缓冲区数量,信号量empty表示缓冲区数量,设置整型变量:存入指针in和取出指针out。

为解决生产者/消费者问题,应该设置两个资源信号量,其中一个表示空缓冲区的数目,用g_hFullSemaphore表示,其初始值为有界缓冲区的大小SIZE_OF_BUFFER;另一个表示缓冲区中产品的数目,用g_hEmptySemaphore表示,其初始值为0。另外,由于有界缓冲区是一个临界资源,必须互斥使用,所以还需要在设置一个互斥信号量g_hMutex,初始值为1.P原语的主要动作是:

• sem(信号量)减1;

• 若sem减一后仍大于或等于零,则进程继续执行;

• 若sem减一后小于零,则该进程被阻塞后入与该信号相对应的队列中,然后转进程调度。V原语的操作主要动作是:

• sem加1;

• 若相加结果大于零,进程继续执行;

③若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程然后再返回原进程继续执行或转进程调度。

采用的同步方法:

1)利用函数CreateMutex(NULL,FALSE,NULL)创建互斥信号量g_hMutex,表示缓冲区当前的状态,若为true时,则表示缓冲区正被别的进程使用。三个参数表示的意义分别为:指向安全属性的指针,初始化互斥对象的所有者,指向互斥对象名的指针。

2)利用函数CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1, NULL)创建缓冲区空的信号量g_hFullSemaphore,值为true时表示缓冲区已满。四个参数分别为:表示是否允许继承、设置信号机的初始计数、设置信号机的最大计数、指定信号机对象的名称(-1是因为计数从开始)。

3)利用函数CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)创建缓冲区满的信号量g_hEmptySemaphore,该值为true时表示缓冲区为空。

程序清单 1.存储结构定义

利用信号量解决生产者消费者问题

const unsigned short SIZE_OF_BUFFER = 20;//缓冲区长度 unsigned short ProductID = 0;//产品号

unsigned short ConsumeID = 0;//将被消耗的产品号

unsigned short in = 0;//产品进缓冲区时的缓冲区下标 unsigned short out = 0;//产品出缓冲区时的缓冲区下标 int g_buffer[SIZE_OF_BUFFER];//缓冲区是个循环队列 bool g_continue = true;//控制程序结束 HANDLE g_hMutex;//用于线程间的互斥

HANDLE g_hFullSemaphore;//当缓冲区满时迫使生产者等待 HANDLE g_hEmptySemaphore;//当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID);//生产者线程 DWORD WINAPI Consumer(LPVOID);//消费者线程

2.算法相关的函数

(1)创建各个互斥信号以及生产者线程和消费者线程的函数在如下主函数里面所示: int main(){ //创建各个互斥信号

g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);//调整下面的数值,可以发现,当生产者个数多于消费者个数时,//生产速度快,生产者经常等待消费者;反之,消费者经常等待。const unsigned short PRODUCERS_COUNT = 3;//生产者的个数 const unsigned short CONSUMERS_COUNT = 1;//消费者的个数 //总的线程数

const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreads[THREADS_COUNT];//各线程的handle DWORD producerID[PRODUCERS_COUNT];//生产者线程的标识符 DWORD consumerID[CONSUMERS_COUNT];//消费者线程的标识符 //创建生产者线程

for(int i=0;i< PRODUCERS_COUNT;++i){ hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if(hThreads[i]==NULL)return-1;} //创建消费者线程

for(i=0;i

//生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce(){ std::cerr << “Producing ” << ++ProductID << “ *** ”;std::cerr << “Succeed” << std::endl;}(3)把新生产的产品放入缓冲区的函数: //把新生产的产品放入缓冲区 void Append(){ std::cerr << “Appending a product *** ”;g_buffer[in] = ProductID;in =(in+1)%SIZE_OF_BUFFER;std::cerr << “Succeed” << std::endl;}(4)输出缓冲区当前的状态的代码: //输出缓冲区当前的状态

for(int i=0;i

for(int i=0;i

DWORD WINAPI Producer(LPVOID lpPara){ while(g_continue){ WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);} return 0;}(2)消费者算法: //消费者

DWORD WINAPI Consumer(LPVOID lpPara){ while(g_continue){ WaitForSingleObject(g_hEmptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);} return 0;} • 运行结果分析

输入输出数据说明和分析:

该程序设置的缓冲区数据长度为20,生产者个数为3,消费者个数为1,程序启动后,生产者先进行生产,当3个生产者全部生产完之后,消费者开始从缓冲区中取出产品,当消费者取出一个后,生产者开始继续生产,当生产完3个之后,消费者开始从缓冲池中取产品,依次循环。

三、小结

通过本次试验,我对操作系统中线程,进程同步互斥等知识的应用有了更深的了解,我知道了生产者—消费者问题是很著名的同步问题,的确是既简单又复杂。

篇2:生产者消费者实验收获

——生产者和消费者问题

姓名:丛菲 学号:20100830205 班级:信息安全二班

一、实习内容

• •

1、模拟操作系统中进程同步和互斥

2、实现生产者和消费者问题的算法实现

二、实习目的

• • • • •

1、熟悉临界资源、信号量及PV操作的定义与物理意义

2、了解进程通信的方法

3、掌握进程互斥与进程同步的相关知识

4、掌握用信号量机制解决进程之间的同步与互斥问题

5、实现生产者-消费者问题,深刻理解进程同步问题

三、实习题目

• 在Linux操作系统下用C实现经典同步问题:生产者—消费者,具体要求如下:

(1)一个大小为10的缓冲区,初始状态为空。

(2)2个生产者,随机等待一段时间,往缓冲区中添加数据,若缓冲区已满,等待消费者取走数据之后再添加,重复10次。

(3)2个消费者,随机等待一段时间,从缓冲区中读取数据,若缓冲区为空,等待生产者添加数据之后再读取,重复10次。• 提示

本实验的主要目的是模拟操作系统中进程同步和互斥。在系统进程并发执行异步推进的过程中,由于资源共享和进程间合作而造成进程间相互制约。进程间的相互制约有两种不同的方式。

(1)间接制约。这是由于多个进程共享同一资源(如CPU、共享输入/输出设备)而引起的,即共享资源的多个进程因系统协调使用资源而相互制约。

(2)直接制约。只是由于进程合作中各个进程为完成同一任务而造成的,即并发进程各自的执行结果互为对方的执行条件,从而限制各个进程的执行速度。

生产者和消费者是经典的进程同步问题,在这个问题中,生产者不断的向缓冲区中写入数据,而消费者则从缓冲区中读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入数据才能读取数据。

在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制在本实验中,进程之间要进行通信来操作同一缓冲区。一般来说,进程间的通信根据通信内容可以划分为两种:即控制信息的传送与大批量数据传送。有时,也把进程间控制信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。

目前,计算机系统中用得比较普遍的高级通信机制可分为3大类:共享存储器系统、消息传递系统及管道通信系统。

• 共享存储器系统

共享存储器系统为了传送大量数据,在存储器中划出一块共享存储区,诸进程可通过对共享存储区进行读数据或写数据以实现通信。进程在通信之前,向系统申请共享存储区中的一个分区,并为它指定一个分区关键字。信息的交换称为低级通信,而把进程间大批量数据的交换称为高级通信。

目前,计算机系统中用得比较普遍的高级通信机制可分为3大类:共享存储器系统、消息传递系统及管道通信系统。

• 消息传递系统

在消息传递系统中,进程间的数据交换以消息为单位,在计算机网络中被称为报文。消息传递系统的实现方式又可以分为以下两种:(1)直接通信方式

发送进程可将消息直接发送给接收进程,即将消息挂在接收进程的消息缓冲队列上,而接收进程可从自己的消息缓冲队列中取得消息。(2)间接通信方式

发送进程将消息发送到指定的信箱中,而接收进程从信箱中取得消息。这种通信方式又称信箱通信方式,被广泛地应用于计算机网络中。相应地,该消息传递系统被称为电子邮件系统。

• 管道通信系统

向管道提供输入的发送进程,以字符流方式将大量的数据送入管道,而接收进程从管道中接收数据。由于发送进程和接收进程是利用管道进行通信的,故称为管道通信。为了协调发送和接收双方的通信,管道通信机制必须提供以下3方面的协调功能。(1)互斥

当一个进程正在对pipe文件进行读或写操作时,另一个进程必须等待。(2)同步

当写进程把一定数量的数据写入pipe文件后,便阻塞等待,直到读进程取走数据后,再把写进程唤醒。

(3)确认对方是否存在 只有确定对方已存在时,才能进行管道通信,否则会造成因对方不存在而无限制地等待。在这个问题当中,我们采用信号量机制进行进程之间的通信,设置两个信号量,空的信号量和满的信号量。在Linux系统中,一个或多个信号量构成一个信号量集合。使用信号量机制可以实现进程之间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P、V操作不限于减1或加1,而是可以加减任何整数。在进程终止时,系统可根据需要自动消除所有被进程操作过的信号量的影响

1.缓冲区采用循环队列表示,利用头、尾指针来存放、读取数据,以及判断队列是否为空。缓冲区中数组大小为10;

2.利用随机函数rand()得到A~Z的一个随机字符,作为生产者每次生产的数据,存放到缓冲区中;

3.使用shmget()系统调用实现共享主存段的创建,shmget()返回共享内存区的ID。对于已经申请到的共享段,进程需把它附加到自己的虚拟空间中才能对其进行读写。

4.信号量的建立采用semget()函数,同时建立信号量的数量。在信号量建立后,调用semctl()对信号量进行初始化,例如本实习中,可以建立两个信号量SEM_EMPTY、SEM_FULL,初始化时设置SEM_EMPTY为10,SEM_FULL为0。使用操 作信号的函数semop()做排除式操作,使用这个函数防止对共享内存的同时操作。对共享内存操作完毕后采用shmctl()函数撤销共享内存段。

5.使用循环,创建2个生产者以及2个消费者,采用函数fork()创建一个新的进程。6.一个进程的一次操作完成后,采用函数fflush()刷新缓冲区。7.程序最后使用semctl()函数释放内存。模拟程序的程序流程图如下所示: 1.主程序流程图:

2.生产者进程流程图

3.消费者进程流程图

4.P操作流程图

5.V操作流程图

四、实现代码为:

// exet5.cpp //#include “stdafx.h” #include #include #define mSIZE 3 #define pSIZE 20 staticintmemery[mSIZE] = {0};staticint process[pSIZE] = {0};//static int process[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};//static int process[pSIZE]

= {7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};void build();void LRU();

int main(intargc, char *argv[]){ printf(“Random sequence is as follows:n”);build();printf(“nInvoking LRU Algorithn: n”);LRU();return 0;}

void build(){ inti = 0;for(i=0;i

{ process[i] =(int)(10.0*rand()/(RAND_MAX));printf(“%d ”,process[i]);

} printf(“n”);}

void LRU(){ int flag[mSIZE] = {0};inti = 0, j = 0;int m =-1, n =-1;int max =-1,maxflag = 0;int count = 0;for(i = 0;i

//Find the first free Physical Block

for(j=0;j

{

if(memery[j] == 0)

{

m = j;break;

}

}

//Find if there are same processes for(j = 0;j

{

if(memery[j] == process[i])

{

n = j;

}

}

//Find free PB for(j = 0;j

{

if(flag[j]>maxflag)

{

maxflag = flag[j];max = j;

}

}

if(n ==-1)// Find no same process

{

if(m!=-1)// find free PB

{

memery[m] = process[i];flag[m] = 0;for(j = 0;j <= m;j++)

{ flag[j]++;

}

m =-1;

}

else //NO find free PB

{

memery[max] = process[i];flag[max] = 0;

for(j = 0;j

{ flag[j]++;

} max =-1;maxflag = 0;count++;

}

} else // Find same process

{ memery[n] = process[i];flag[n] = 0;if(m!=-1)//find free PB

{ flag[m] = 0;

} for(j = 0;j

{ flag[j]++;

} max =-1;maxflag = 0;

n =-1;

}

for(j = 0;j

{

printf(“%d ”,memery[j]);

} printf(“n”);}

printf(“nThe is: %dn”,count);}

times

of

page

conversion

五、在虚拟机上的具体操作及结果

执行exe5.c文件

选择ApplicationsAcecessoriesTerminal,执行文件:

依次预处理编译汇编连接执行用文件,编译通过之后-o执行。报错!!错误显示为很多头文件没有预定义。连续查找之后得知原因是链接不上pthread库

在执行命令后面加上-pthread,即新命令格式为:gcc-oexe5exe5.c–lpthread,重新执行后的结果显示如下截图:

其中1表示缓冲区被生产者producer1或者二producer2写入了Item,0表示没有写入数据或者被消费者consumer1或者consumer2消耗掉

六、实验总结及思考

1、本次实验是关于生产者与消费者之间互斥和同步的问题。问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。

2、实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。加深了对于本部分内容的理解

篇3:演示小实验收获大效果

一、演示小实验能培养学生的学习兴趣,激发学生的求知欲望

演示实验具有真实、形象、生动等特点,超出学生预期的实验现象容易唤起他们的好奇心,对中学生有很强的吸引力,容易激发学生的学习兴趣,使他们从内心产生浓厚的求知欲望,而不是仅停留在所观察的物理现象的表面。

一旦学生对物理学习有了兴趣,学习便变得积极且主动,教学的效果就能达以升华。在物理课堂教学初教师可以通过演示小实验为学生展现出直观生动的学习情景,极大限度地吸引学生的注意,激发学生的求知欲和兴趣。学生在观察的基础上,很自然会产生一种自已操作并探究的欲望,为课堂探究的开展提供了条件,可以提高学生对探索知识和规律的兴趣,进而上升为学生的认知兴趣。当学生对物理产生浓厚兴趣的时候,学习起来便会感到轻松愉快,同时,他们的学习欲望越强烈就越有利于形成正确的、主动的学习方法,学好物理的信心就会越来越强。

二、演示小实验能给学生提供一个直观的、符合认知规律的物理情境

在物理学习过程中,要形成对物理规律、概念理性的认识,首先就要有一定的感性认识为基础。这种感性认识除了来源于学生的生活环境,更多的来源于实验所提供的物理情景。生活中的经验作为学生的原有认识对物理概念的建立不一定都是起到正作用的,而运用实验则能为学生可提供经过精心选择的、简化和纯化的素材,它能够使学生对物理事实获得直观、简明、具体的认识。

在演示实验所创设的物理情境中,学生在教师启发下,通过自己的观察可以获得最典型的感性认识,思维组织后能建立概念,形成规律,完成理论知识和实践相结合,将课堂所学内化为自己的知识和技能。更重要的是在观察实验现象后,学生能生成一定的物理问题,教师只要组织得当,可以逐步激发学生探索物理知识的主体意识,在新问题的探究和解决中掌握学习方法,强化探究能力。

三、让学生参与实验的演示效果更佳

单纯的教师演示实验的效果会使得实验现象的可见度低下,有些细小的演示实验可以借助于学生手边的工具,这样就可以让学生也参与到小实验中来,通过教师提出问题,让学生自主动手实践,探索问题发生的原因,从而得到结论,把演示实验改成了边教边实验的形式,这样做有利于培养学生分析问题解决问题的能力、实验操作能力和创新能力。例如:在实验探究音调与频率的关系时,可以指导每个学生都将塑料尺一端紧压在桌面上,另一端伸出桌面,改变钢尺伸出桌面的长度,控制好每次拔动的力度,听其振动时发出声音的高低有无变化?对于摩擦起电现象,教师可让每个学生都用塑料尺在衣服上摩擦几下,然后吸引碎纸屑。让学生参与到小实验演示中来,不是只让学生的注意力停留在表面现象和事物上,而是引导他们逐步深入、扩散思维,提高了学生学习的积极性和主动性,学生们通过边实验边观察,加深了对物理规律和概念的认识。

四、小实验让学生感受到物理方法

小实验最基本的作用就是教会了学生物理上最常用的观察法,有些是通过教师提前的引导和任务的交代,如如做气体膨胀对外做功的实验时,学生只听到“嘭”的一声,注意点不是去看瓶塞跳得很高,而专注于塑料瓶口出现的酒精烟雾;有些是通过现象的对比,如探究沸点与气压的关系时,观察到增大气压,沸点升高,减小气压,沸点降低。

小实验可以将抽象的、看不见、摸不着或是微小变化的物理现象、规律,转化为学生熟知的看见的现象来认识它们,如测曲线的长短时利用学生所熟悉的棉线贴着曲线弯曲将测量量转换成测细棉线的长度,将测不规则小石块的体积转换成测石块排开水的体积,还有测硬币的直径、测一页纸的厚度;测量滑动摩擦力大小转换成测拉力的大小;研究电热与电阻、电流的关系时,可以将产生的电热多少转换成液柱上升的高度;磁场看不见、摸不着,可以根据地磁场的基本性质来认识;测量灯泡的电功率,转化成灯泡两端电压U用电压表测出,通过灯泡的电流I利用电流表测出,再通过P=IU计算得出电功率P;测量大气压强值转换成求被大气压压起的水银柱的压强。

五、演示实验可以扩大教学资源

篇4:生产者消费者实验收获

黑龙江摇篮乳业股份有限公司创办于1998年,主导产品是摇篮牌系列婴幼儿配方奶粉,其宗旨是“让中国宝宝都喝到好营养、好品质的婴幼儿配方奶粉,健康成长”。经过十年的发展,摇篮乳业不仅具备了扎实的产品品质基础,还搭起了全国铺货渠道网络。

黑龙江摇篮乳业股份有限公司副总经理李佳君女士在接受记者采访时说,以前的摇篮主要是依靠消费者的口碑传承和渠道建设树立品牌形象,企业每年也都在发展,但是消费者口口相传的影响力毕竟有限。

品牌发展到此阶段,亟需投放大众媒体广告打造品牌知名度。为此2008年10月开始,摇篮乳业选择了CCTV-1黄金剧场的年度大戏《李小龙传奇》和11—12月份的《天气预报1+1》及《朝闻天下》等央视品牌栏目进行广告投放,取得了满意的广告效果。

在谈到央视这个平台时,李佳君副总经理表示摇篮看好央视主要有以下三个方面,一是央视的覆盖范围大,正好吻合企业铺货网络的覆盖面,特别是在帮助企业打造全国性品牌上独具优势,投放央视广告可以迅速带动产品在全国的销售,二是央视这么多年来在老百姓心目中的公信力、权威性和可信度,它代表着品质,这种公信力和可信度也会通过广告过渡到品牌;再一点是央视的广告环境好,广告审查严格,在央视投放广告的都是有实力的品牌,这种环境对企业品牌的形象也有很好的提升。

摇篮乳业十年辛勤耕耘积聚的能量在2008年末2009年初爆发。据李佳君副总经理介绍,奶粉事件后,摇篮抓住机会开始投放广告,特别是开始在央视投放广告,企业迈上了发展的快车道,产品供不应求。销量的增长是摇篮的员工、经销商以及消费者对摇篮及摇篮产品信心和品质信任的最佳肯定。

2009年,摇篮乳业将继续投放中央电视台黄金时段的广告。李佳君副总经理说,企业原来的广告投放计划是以其他电视媒体为主,央视为辅,但是经过一段时间的投放后,企业消费者调查结果显示80%以上的人都是从央视看到的广告。企业也因此修改了原来的投放策略,2009年的广告投放策略改为以CCTV-1为主,其他媒体投放为辅。

篇5:小实验大收获作文

小小实验大收获

五(1)班 科技是无穷的力量,科技是梦想的翅膀,是人类生活中的亮点。小小的我,心却很大,想借此科技节大显身手,做一次向往已久的发明。让我们在这片科技小天地去遨游创造吧。

其实,我很早就像发明一个名叫“飞旋小赛车”,乘着科技节的风帆,我立刻投身到酷爱的小发明中。首先拆出太阳能帽子中的发电片,再找四个瓶盖安装在四个边上。制造一种自我觉得很酷的外壳。一个小电风扇片,一根电线直插在太阳能片上,最后找个马达和开关安装在上面。我一开,失败了。车不跑也不飞,唉,太让人失望了。当时,我伤心的哭了,我突然想起老师的一句话,从哪里跌倒就从哪里站起来。我从新动手做起了实验,在这过程中,我付出了艰辛与汗水。只要肯努力,就会有回报。唐僧师徒取经才九九八十一难,我这才几难?我要为我的创造而努力。我的意外突然让他成功诞生了,我终于实现我的.要求。

我从这次发明中收获很多。我的创造对于科学而言,我的发明只是个破烂。但我坚信一点,今天我是小小发明家,明天我是大科学家。科技是无处不有的,她们全是意外创造的,我坚定我一定会成功。

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

(操作系统课程设计)

生 产 者 和 消 费 湖北民族学院信息工程学院11级计算机专业操作系统课程设计

学生姓名: 学生学号: 班 级: 0311401、02、03、04班制

二〇一三年十二月

一、课程题目分析

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

思考问题:

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

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

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

二、课程设计目的

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

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

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

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

三、课程设计内容

有n个生产者和m个消费者,连接在具有k个单位缓冲区的有界环转缓冲上,湖北民族学院信息工程学院11级计算机专业操作系统课程设计

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

四、开发环境

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

五、系统分析设计

(一)算法原理

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

(二)功能描述

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

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

(三)算法流程图

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

湖北民族学院信息工程学院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();//判断是否为空

湖北民族学院信息工程学院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)在实现本程序的生产者消费者模型时,具体地通过以下同步对象实现互斥: 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,显示缓冲区,选择一个未出现的选项,退出程序。

(二)结果显示

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

湖北民族学院信息工程学院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级计算机专业操作系统课程设计

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--];

} } 湖北民族学院信息工程学院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)

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

cout<

}

else

{

cout<

s->deca();

}

break;

case 2:

consumer(s);

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

{

cout<

}

else

{

cout<

}

break;

case 3:

showbuf(s);

cout<getSize()<<“

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

break;

case 4:

cout<

break;

case 5:

cout<

cin>>n;

s = new SeqSquare(n);

cout<

break;

default:

cout<

}

}

篇7:生产者消费者实验收获

经历了漫长的七个月,再次回到教室里,感觉一切都那么的新鲜,仿佛是刚踏大学一样,当然这只是幻觉,回想起当时进入一汽大众焊装车间时,什么都觉得好奇,对未来充满无限的遐想。我学的是汽车制造与装配,对于我来说这个专业是需要大量的实践才能学到更多的知识,所以实践很重要;而汽车整车制造这个行业在中国正处于发张时期,全世界的汽车厂商都把目光放在亚洲市场在,而中国占的比例是最重的,因此对于我们来说这是一个机会也是一个挑战。

在去年的10月份,学校安排我们到了一汽大众成都三厂焊装车间进行了为期七个月的实习生活。说起一汽大众,肯定许多人并不陌生,的确,它是一个实力雄厚集汽车制造、销售于一体的中外合资企业。自1991年生产第一批捷达轿车至今,一汽大众从一个注册资本只有37.12亿元人民币的企业发展到现在拥有数千亿元人民币的大型汽车企业,目前,以前大众公司累计向国家上缴的税金达到1000多亿人民币,一汽大众一厂、二厂设在长春,在成都设有三厂,而我们实习就是在成都三厂,以及广东佛山的四厂。

经过动员,最后组成约200人的实习队伍,在公司班车的接送下来到了目的地,在刚到公司的停车场就有专门的负责人带我们到一个培训办公室,然后给我进行了一些公司的培训,在经过培训后,就由车间每个工段的负责人来分领人员,而我被带到了焊装车间的最后一个工段--装配调整工段,刚到装配调整工段的班组时,工段的办事员给我进行了一系列的讲解与辅导,没过多久每条生产线的班长就来到班组进行领人的工作,我被分到了装配一线乙班。到了第二天,我按照规定的上班时间提前到达班组,在班前开完会后我们在班组又进行了一次安全培训。在一汽大众,公司最关注的就是安全问题,我们不仅参加了公司的安全培训,在刚到班组的第二天又进行了一次工段的安全培训,由于当时劳保还没有发放完,所以班长都不允许我们上线,只准我们在生产线的线下观看,让我们知道了在一汽大众上班要注意些什么问题,能碰的和不能碰的,哪怕是我们自己工作的地方,都需要注意安全!公司里规定在车间里不能吸烟,不能追逐打闹,工作期间必须按照要求佩戴劳保用品。待培训完成后,我被分配到装配调整线的第七个工位--后盖装配调整工位,刚到后盖工位时,班长给我找了一位师傅,要师傅先给我讲解清楚各种操作以及各种注意事项。当师傅把后盖工位的标准化操作卡拿给我看时,并且还叮嘱我要记住上面的内容,以后的操作就的按照标准卡上面的操作,还给我说,在每天上班之前,必须先检查工具以及各种夹具,在点检表上标注清楚各种工具及夹具的情况,是否有损坏,如有损坏应该及时跟班长或者是班组的tpm反应情况,而且每天在完成工作后应该把本工位的卫生打扫一遍。

到进厂开始工作的第二天,我的动作还是很迟缓,不怎么能跟上师傅们的进度,每次都要师傅等着我的工具他才能做他的工作,这使得我很烦恼,怕师傅说。但是师傅并没有同我想的那样,师傅安慰我说,“刚开始学都这样,不要有太大的压力,多看哈其他人的操作,尽可能的加快自己的速度,总之不要太着急”。而在当天完成工作时,在班组开会时,班长问我学的怎么样,我笑着说,“挺累的,不过能适应,只是在调试后盖时,对于后盖与侧围的间隙和后盖与侧围的平度还不能很好的控制”。我本来以为班长会很恼火我,但是却没有,班长笑着拍我肩膀说没有什么,别着急,慢慢来,只要用心努力就好。当时听了班长的话后,身心觉得轻松了许多,同时也想着一定得用心去学,逐渐的过了四天左右的时间我就能达到熟练并且能喝师傅一样。

流水线作业虽然效率高,但是劳动强度也跟着高了,一直在那里重复做一件事情,久了总会令人倦怠的,刚开始的时候累,无聊,总想着还是上课轻松,但是我明白我必须挺下去,这是一个锻炼的机会,是一个融入社会的过程,是一个成长的过程!走出校园,实习工作,心态的调整无疑是非常重要的,我们必须清楚我们的实习任务和要充分认识自己的不足,明确了改进的方向和方法。粉尘弥漫车间,光是嘈杂的噪音你就受不了,震的耳朵疼的嗡嗡发响,还有那看似很美很浪漫的“烟花”滚烫的飞溅,经常会被烫的一惊一乍的……但是就是这样的条件下,我挺下去了。渐渐地适应了工作的强度,我开始融入了这个环境中,开始从工作中发现问题,学习工作中的各种仪器的使用。转眼间就说实习快结束了,回想起发现时间过得也挺快的。在最后一天,班前开会时,班长当着所有班组成员的面点评了我实习以来的工作及对我的印象,对于我来说,实习中得到班长的认可,这是最大的收获,也是对我最大的鼓励。

就工作待遇而言,一汽大众是无数求职者向往的地方,我们能得到这样的机会已经想当不错了,如果能把握好,无疑将极大地改变自己的未来。

上一篇:小班科学优质课教案及教学反思《木头和玻璃》下一篇:计生督办卡整改方案