實驗二 進程同步實驗
一、實驗目的
加深對並發協作進程同步與互斥概念的理解,觀察和體驗並發進程同步與互斥
操作的效果,分析與研究經典進程同步與互斥問題的實際解決方案。了解 Linux 系
統中 IPC 進程同步工具的用法,練習並發協作進程的同步與互斥操作的編程與調試
技術。
二、實驗內容
抽煙者問題。假設一個系統中有三個抽煙者進程,每個抽煙者不斷地卷煙並抽
煙。抽煙者卷起並抽掉一顆煙需要有三種材料:煙草、紙和膠水。一個抽煙者有煙
草,一個有紙,另一個有膠水。系統中還有兩個供應者進程,它們無限地供應所有
三種材料,但每次僅輪流提供三種材料中的兩種。得到缺失的兩種材料的抽煙者在
卷起並抽掉一顆煙后會發信號通知供應者,讓它繼續提供另外的兩種材料。這一過
程重復進行。 請用以上介紹的 IPC 同步機制編程,實現該問題要求的功能。
三、實驗要求
總結和分析示例實驗和獨立實驗中觀察到的調試和運行信息,說明您對與解決
非對稱性互斥操作的算法有哪些新的理解和認識? 為什么會出現進程飢餓現
象?本實驗的飢餓現象是怎樣表現的?怎樣解決並發進程間發生的飢餓現象?您
對於並發進程間使用消息傳遞解決進程通信問題有哪些新的理解和認識?根據實
驗程序、調試過程和結果分析寫出實驗報告。
四、實驗步驟
1) 打開一終端命令行窗體,新建一個文件夾,在該文件夾中建立以下名為ipc.h 的C語言程序,該程序皆為頭文件,該程序代碼為:




2) 新建一個文件夾,在該文件夾中建立以下名為ipc.c 的C語言程序,該程序皆為頭文件,該程序代碼為:




3) 新建一個文件夾,在該文件夾中建立以下名為consumer.c的C語言程序,該程序皆為頭文件,該程序代碼為:


4) 新建一個文件夾,在該文件夾中建立以下名為producer.c的C語言程序,該程序皆為頭文件,該程序代碼為:



5)輸入gcc -c consumer.c ipc.c

報錯,如下圖

修改程序代碼

6)輸入gcc consumer.o ipc.o -o consumer
7)輸入gcc -c producer.c ipc.c
8)輸入gcc producer.o ipc.o -o producer

五、實驗結果
1) 新建終端打開輸入./producer 0
2) 新建終端打開輸入./producer 1
3) 新建終端打開輸入./consumer 0
4) 新建終端打開輸入./consumer 1
5) 新建終端打開輸入./consumer 2
運行如下圖所示:


六、實驗小結
通過這次實驗加深了我對並發協作進程同步與互斥概念的理解,在消費者和生產者執行中存在着同步與互斥,通過實驗更清楚的了解了他們運行的過程以及如何去實現他們,同時還有如何有效的設置信號量。面對具體的進程同步與互斥問題,如何清晰的去理清楚他們之間的關聯也讓我在這次實驗中學習了解到了。
