有限缓冲区问题的实现.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
有限缓冲区问题的实现

摘 要本程序实现有限缓冲区问题。设计了两个进程,在一个地址空间运行,一个生产者进程producer模拟生产产品,并把每个产品放到一个空缓冲中供消费者consumer消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。优先缓冲区问题的实现,其目的是为了了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序,编写程序实现有限缓冲区问题。关键词: 有限缓冲区问题;进程同步;生产者消费者目录1绪论31.1设计任务31.2设计思想31.3基础知识41.4 运行环境51.4.1 Unix/Linux 的历史51.4.2 VMWare基本介绍61.4.3 GCC编译器62各模块伪码算法82.1包含的头文件82.2主函数92.3生产者进程122.4 消费者进程143函数调用关系图194测试结果225源程序266设计总结31参考文献32致 谢331绪论1.1设计任务了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。编写程序实现有限缓冲区问题。要求设计两个线程,在一个地址空间运行,一个生产者线程生产产品,并把每个产品放到一个空缓冲中供消费者消费;消费者从缓冲区中取出产品,然后释放到空的缓冲池中。如果没有满缓冲,消费者被阻塞,直到生产者生产出新的产品。如果当生产者生产了配件后,没有空缓冲可用时,生产者被阻塞,直到消费者线程释放出一个空缓冲。1.2设计思想生产者消费者问题也称有限缓冲问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。PV操作是原子操作,也就是不可以中断的,在一定的时间内,只能够有一个进程的代码在CPU上面执行。对于生产者,如果缓存是满的就去睡觉。消费者从缓存中取走数据后就叫醒生产者,让它再次将缓存填满。若消费者发现缓存是空的,就去睡觉了。下一轮中生产者将数据写入后就叫醒消费者。不完善的解决方案会造成“死锁”,即两个进程都在“睡觉”等着对方来“唤醒”。生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是一个相互协作的关系,只有生产者生产之后,消费者才能消费,他们也是同步关系。在系统当中,有时候为了顺利的使用和保护共享资源,提出了信号量的概念。信号量的使用主要是来保护共享资源,使得资源在一个时刻只有一个进程所拥有。为此可以使用一个信号灯,当信号灯的值为某个值的时候,就表明此时资源不可以使用,否则就表示可以使用。为了提供效率,Linux系统提供可下面几个函数:int sem_init(sem_t*sem,int pshared,unsigned int value);int sem_destroy(sem_t*sem);int sem_wait(sem_t*sem);int sem_trywait(sem_t*sem);int sem_post(sem_t*sem);int sem_getvalue(sem_t*sem);sem_init 创建一个信号灯,并初始化其值为value.pshared决定了信号量能否在几个进程间共享。由于目前Linux还没有实现进程间共享信号灯,所以这个值只能够取0.sem_destroy是用来删除信号灯的。Sem_wait调用将阻塞进程。直到信号灯的值大于0.这个函数返回的时候自动将信号灯的值的件一sem_post和sem_wait相反,是将信号灯的内容加一同时发出信号唤醒等待的进程。Sem_trywait和sem_wait相同,不过不阻塞的,当信号灯的值为0的时候返回EAGAIN,表示以后重试。Sem_getvalue得到信号灯的值。这几个函数的使用相当的简单,比如我们有一个程序要向一个系统请求一个资源时,首先创建一个信号灯。并使其初始值为1,表示有一个资源可用,然后一个进程调用sem_wait由于这个信号灯的值为1,所以这个函数返回,打印机开始打印了,同时信号灯的值为0了。如果第二个进程要使用,调用sem_wait时候,有一信号灯的值为0,资源不可用,于是被阻塞了。当第一个进程对资源的使用完毕后,调用sem_post信号灯的值为1了,这个时候系统通知第二个进

文档评论(0)

yigang0925 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档