操作系统生产者消费者问题实验报告
操作系統實驗報告
進程通信
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. 實驗結果與分析
? ?
結果分析
客戶端從控制臺每次讀入一個元素,使用字符緩沖輸出流寫入到緩沖池share.txt中,客戶端向服務器報告狀態信息:我已經向共享池寫入了第i個元素,你可以使用該數據了。服務器端使用綁定到10086端口的ServerSocket服務器套接字對象,調用其accept方法監聽客戶端,返回一個Socket對象,調用該對象的getInputStream方法得到字節輸入流對象,使用InputStreamReader將其轉化為字符流,從此字符緩沖輸入流中得到客戶端的反饋:生產者已經向共享池放入了第i個元素,我可以使用它了,于是消費者從共享池文件讀出數據元素,輸出在控制臺上,并銷毀該元素,完成從共享池拿走數據元素這一操作。
實驗心得
本實驗涉及Java的文件讀寫操作,比如說使用字符流讀寫數據、文件轉換操作,比如說將字節流轉化為字符流,方便用戶讀寫數據、使用TCP通信,本次實驗的代碼是自己獨立完成的,較好地實現了生產者與消費者問題,但是還存在不足,生產者向緩沖池放入一個數據元素,生產者從緩沖池拿走一個數據元素,每一次操作之后,緩沖池里剩余的元素個數為0,沒有實現當緩沖池滿時,生產者不能生產元素;當緩沖池為空時,消費者不能拿走數據。但是如果使用線程,我可以實現該功能。
總結
以上是生活随笔為你收集整理的操作系统生产者消费者问题实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch学习笔记(1)nn.Seq
- 下一篇: 我们能做出量子计算机却至今摸不透量子力学