操作系统生产者消费者问题实验报告

操作系统实验报告

进程通信

1. 问题描述及需求分析:

问题描述

本次实验实现生产者和消费者之间的通信,即生产者-消费者问题。生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素。生产者放入的元素个数要与消费者取出的元素个数一致。实验的输出要能跟踪生产者的每次“生产”行为,以及消费者的每次“消费”行为。本次实验旨在加深对进程概念的理解,学习和探寻进程间通信的方法并理解进程间通信的过程。

输入形式

定义还有5个元素的共享池,客户端根据提示信息依次向共享池输入5个元素(字符串),用来表示生产者总共生产了5个数据元素。

输出形式

服务器端收到客户端发送的状态信息,用来表示生产者向共享池生产的第几个元素,服务器端从共享池中拿到的元素。

测试数据:

客户端

服务器端

生产者生产第1个元素

输入生产者生产的第一个元素:cfqp,提示:生产者已经将第1个元素放入共享池,输入生产者生产的第一个元素:

收到反馈:生产者已经将第一个元素放入共享池,消费者拿到数据:cfqp

生产者生产第2个元素

键入:lty,提示:生产者已经将第2个元素放入共享池,输入生产者生产的第3个元素:

收到反馈:生产者已经将第2个元素放入共享池,消费者拿到数据:lty

生产者生产第3个元素

键入:juicy,提示:生产者已经将第3个元素放入共享池,输入生产者生产的第4个元素:

收到反馈:生产者已经将第3个元素放入共享池,消费者拿到数据:juicy

生产者生产第4个元素

键入:我爱java,提示:生产者已经将第4个元素放入共享池,输入生产者生产的第5个元素:

收到反馈:生产者已经将第4个元素放入共享池,消费者拿到数据:我爱java

生产者生产第5个元素

键入:你好,TCP,我来啦,提示:生产者已经将第5个元素放入共享池,

收到反馈:生产者已经将第5个元素放入共享池,消费者拿到数据:你好,TCP,我来啦!

2. 实验设计

思路:

该程序采用Java语言编写,包括客户端Client.java,服务器端Server.java和共享文件share.txt,进程之间采用TCP通信。实验思路为:客户端控制台依次输入5个元素到共享池中,每次向共享池存入一个字符串时,客户端和服务器端通信,向服务器报告本次放入的是第几个元素,服务器端接收到客户端的反馈,从共享池里拿到该数据元素,并清空缓冲池。

函数功能:

创建一个流套接字,并将其连接到命名主机上的指定端口号。

Socket s = new Socket("cfqp", 10086);  

将共享文件封装为字符缓冲输出流对象,用于向该字符流写数据

BufferedWriter bw = new BufferedWriter(new FileWriter("io\\src\\demo\\share.txt"));

创建一个使用默认大小的输入缓冲区的缓冲字符输入流,参数传入转换流InputStreamReader,从键盘读入数据

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

返回此套接字的输出流。

OutputStream os = s.getOutputStream();

读取一行文本。

line = br.readLine();

向字符缓冲输出流写数据

bw.write(line);

换行

bw.newLine();

刷新缓冲区

bw.flush();

关闭此套接字。

s.close();

创建绑定到指定端口的服务器套接字

ServerSocket ss = new ServerSocket(10086);

3. 实验结果与分析

操作系统生产者消费者问题实验报告_第1张图片   操作系统生产者消费者问题实验报告_第2张图片

结果分析

客户端从控制台每次读入一个元素,使用字符缓冲输出流写入到缓冲池share.txt中,客户端向服务器报告状态信息:我已经向共享池写入了第i个元素,你可以使用该数据了。服务器端使用绑定到10086端口的ServerSocket服务器套接字对象,调用其accept方法监听客户端,返回一个Socket对象,调用该对象的getInputStream方法得到字节输入流对象,使用InputStreamReader将其转化为字符流,从此字符缓冲输入流中得到客户端的反馈:生产者已经向共享池放入了第i个元素,我可以使用它了,于是消费者从共享池文件读出数据元素,输出在控制台上,并销毁该元素,完成从共享池拿走数据元素这一操作。

实验心得

本实验涉及Java的文件读写操作,比如说使用字符流读写数据、文件转换操作,比如说将字节流转化为字符流,方便用户读写数据、使用TCP通信,本次实验的代码是自己独立完成的,较好地实现了生产者与消费者问题,但是还存在不足,生产者向缓冲池放入一个数据元素,生产者从缓冲池拿走一个数据元素,每一次操作之后,缓冲池里剩余的元素个数为0,没有实现当缓冲池满时,生产者不能生产元素;当缓冲池为空时,消费者不能拿走数据。但是如果使用线程,我可以实现该功能。

你可能感兴趣的:(java,java)