操作系统:进程同步与互斥之生产者-消费者问题(含报告和源码)

14 篇文章 1 订阅

目录

第一章 实验相关概述 

第二章 实验的目的及要求 

1. 目的 

2. 要求 

第三章 实验的实现思路及步骤 

第四章 实验结果分析 

1. 结果分析 

2.实现代码及截图 

第五章 实验心得 

参考文献 

致谢 

  • 实验相关概述

有两个进程分别为消费者进程和生产者进程,对同一个临界资源进行访问,生产者不断地将生产的产品加入缓存区,而消费者不断地消费缓存区中的资源,利用信号量实现两个进程的同步和互斥。

  • 实验的内容、目的及要求
  1. 内容

有n个生产者与m个消费者,连接在一个有k个单位缓冲区的有界缓冲区上。其中,pi和cj都是并发进程,只要缓冲区未满,生产者pi生产的产品就可以投入缓冲区;只要缓冲区不空,消费者进程cj就可以从缓冲区中取走并消耗产品。

2.目的

通过实验有效的协调同步操作和互斥操作的先后关系,以及如何利用信号量实现进程同步。

3.要求

(1)理解并掌握进程同步与互斥的原理;

(2)了解进程同步与互斥过程中的基本概念:原语、信号量、临界区以及临界资源等。

(3)了解信号量的分类。

  • 实验的实现思路及步骤

  • 实验结果分析
  1. 结果分析

例先创建两个线程producer和consumer。生产者Producer往队列里不断向尾部添加元素,消费者Consumer不断消耗队列中的元素,当生产者生产达到10个元素时,队列已经满了会发生阻塞一直等待空间,以加入元素,此时消费者依然在不断消耗队列中的元素。当队列里的元素为空时,线程阻塞,此时消费者就会暂停运行,直到生产者继续向队列中添加元素。

2.实现代码及截图

package Customer;

import java.util.Random;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.LinkedBlockingQueue;

public class Customer {

private BlockingQueue queue = new LinkedBlockingQueue(10);  //创建阻塞队列对象,实现生产者与消费者模式

class Producer extends Thread {

public void run() {

producer();

}

private void producer() { //具体实现生产者方法

while(true) {

try {

queue.put(1);   //向队列尾部添加一个元素,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("生产者生产一条任务,当前队列长度为" + queue.size());

try {

Thread.sleep(new Random().nextInt(1000)+500); //每1000ms-1500ms

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class Consumer extends Thread {

public void run() {

consumer();

}

private void consumer() {

while (true) {

try {

queue.take();  //take方法,从队列中消费数据,当队列为空时,线程阻塞

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("消费者消费一条任务,当前队列长度为" + queue.size());

try {

Thread.sleep(new Random().nextInt(1000)+500);//每1000ms-1500ms

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

Customer pc = new Customer();

Producer producer = pc.new Producer();

Consumer consumer = pc.new Consumer();

producer.start();

consumer.start();

}

}

  • 实验心得

通过这一段时间的操作系统课程的学习,我们小组完成了“进程同步与互斥之生产者-消费者问题 ”,我们将其用代码成功实现了。但在此次课程学习与实验中,我们各自都发现了许多问题。

在此次实验过程中暴露出了前期我在这一方面知识欠缺和经验不足。实践出真知,通过亲自动手实验,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在实验中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的实验检测环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次实验终于顺利完成了,在实验中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到困难就想要退宿,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上披荆斩棘,而不是知难而退,那样永远不可能获得成功,收获喜悦,也永远不可能得到社会及其他人对你的认可。

回顾起此次实验,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说是苦多于甜,但是学到了很多很多东西,不仅巩固了以前的知识,还学到了很多书本上没有学到的知识。通过此次实验使我懂得了理论和实际结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识和实际相结合,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。实验过程中,也对团队精神进行了考察,让我们在合作中更加默契,在成功之后一起体会喜悦的心情。果然是团结就是力量,只有相互之间默契融洽的配合才能换来最终完美的结果。

参考文献

[1]汤子瀛 ,哲凤屏.《计算机操作系统》[M].西安电子科技大学出版社.

[2]王清,李光明.《计算机操作系统》[M].冶金工业出版社.

[3]孙钟秀等.《操作系统教程》[M].高等教育出版社.

[4]曾明.《Linux操作系统应用教程》[M].陕西科学技术出版社.

[5]张丽芬,刘利雄.《操作系统实验教程》[M].清华大学出版社.

[6]孟静.《操作系统教程——原理和实例分析》[M].高等教育出版社.

[7]周长林.《计算机操作系统教程》[M].高等教育出版社.

[8]张尧学.《计算机操作系统教程》[M].清华大学出版社.

[9]任满杰.《操作系统原理实用教程》[M].电子工业出版社.

[10]张坤.《操作系统实验教程》[M].清华大学出版社.

致谢

首先非常感谢学校能开设这个实验,为我日后从事计算机方面的工作有所助益,奠定了基础。

其次,我要特别感谢熊婷老师对我的悉心指导,在实验期间老师帮助我理清实验思路,指导操作方法。老师渊博的知识、严谨的作风、诲人不倦的态度和学术上精益求精的精神让我受益终生。这期间凝结了老师很多的心血,在此我表示由衷的感谢。没有他的帮助,我将无法顺利完成这次实验。

再次,学校在这方面也给我们提供了很大的支持和帮助,学校领导比较重视,给我们安排了较多的上机次数和足够的计算机,让我们有尽可能多的时间上机;并为我们开通了网线,方便我们上网查找信息;另外提供了专门的教室方便我们上机调试;对于学校和老师为我的实验所提供的极大帮助和关心,在此我致以衷心的感谢!

  • 10
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲戴王冠♛必承其重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值