操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥

操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥

ID:6593642

大小:192.00 KB

頁數(shù):10頁

時(shí)間:2018-01-19

操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥_第1頁
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥_第2頁
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥_第3頁
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥_第4頁
操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥_第5頁
資源描述:

《操作系統(tǒng)實(shí)驗(yàn)-進(jìn)程同步與互斥》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、實(shí)驗(yàn)四:進(jìn)程的管道通信?實(shí)驗(yàn)題目進(jìn)程的管道通信?實(shí)驗(yàn)?zāi)康募由顚?duì)進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別。學(xué)習(xí)進(jìn)程創(chuàng)建的過程,進(jìn)一步認(rèn)識(shí)進(jìn)程并發(fā)執(zhí)行的實(shí)質(zhì)。分析進(jìn)程爭(zhēng)用資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法。學(xué)習(xí)解決進(jìn)程同步的方法。掌握Linux系統(tǒng)中進(jìn)程間通過管道通信的具體實(shí)現(xiàn)?實(shí)驗(yàn)內(nèi)容使用系統(tǒng)調(diào)用pipe()建立一條管道,系統(tǒng)調(diào)用fork()分別創(chuàng)建兩個(gè)子進(jìn)程,它們分別向管道寫一句話,如: Childprocess1issendingamessage! Childprocess2issendingamessage! 父進(jìn)程分別從管道讀出來自兩個(gè)子進(jìn)程的信息,顯示在屏幕上。 當(dāng)然,僅僅通過

2、屏幕上輸出這兩句話還不能說明實(shí)現(xiàn)了進(jìn)程的管道通信,為了能夠更好的證明和顯示出進(jìn)程的同步互斥和通信,在其中要加入必要的跟蹤條件,如一定的輸出語句等,來反映程序的并發(fā)執(zhí)行情況?實(shí)驗(yàn)要求這是一個(gè)設(shè)計(jì)型實(shí)驗(yàn),要求自行、獨(dú)立編制程序。兩個(gè)子進(jìn)程要并發(fā)執(zhí)行。實(shí)現(xiàn)管道的互斥使用。當(dāng)一個(gè)子進(jìn)程正在對(duì)管道進(jìn)行寫操作時(shí),另一個(gè)欲寫入管道的子進(jìn)程必須等待。使用系統(tǒng)調(diào)用lockf(fd[1],1,0)實(shí)現(xiàn)對(duì)管道的加鎖操作,用lockf(fd[1],0,0)解除對(duì)管道的鎖定。實(shí)現(xiàn)父子進(jìn)程的同步,當(dāng)父進(jìn)程試圖從一空管道中讀取數(shù)據(jù)時(shí),便進(jìn)入等待狀態(tài),直到子進(jìn)程將數(shù)據(jù)寫入管道返回后,才將其喚醒。為了清楚的反應(yīng)進(jìn)程

3、的同步,在子進(jìn)程完成相應(yīng)的操作后,調(diào)用sleep()函數(shù)睡眠一段時(shí)間(程序中定為3s)。父進(jìn)程先執(zhí)行wait()函數(shù),當(dāng)有子進(jìn)程執(zhí)行完畢后,會(huì)得到子進(jìn)程的返回結(jié)果并清理子進(jìn)程。若子進(jìn)程沒執(zhí)行完,父進(jìn)程一直執(zhí)行wait()進(jìn)行監(jiān)聽,知道有一個(gè)子進(jìn)程執(zhí)行完成為僵尸進(jìn)程。?程序中用到的系統(tǒng)調(diào)用因?yàn)槌绦驎r(shí)在linux系統(tǒng)上進(jìn)行編寫的,所以其中要利用到相關(guān)的linux提供的系統(tǒng)調(diào)用。所用到的系統(tǒng)調(diào)用包含在如下頭文件中。#include#include#include#include#include

4、dio.h>#includefork()用于創(chuàng)一個(gè)子進(jìn)程。 格式:intfork(); 返回值:在子進(jìn)程中返回0;在父進(jìn)程中返回所創(chuàng)建的子進(jìn)程的ID值;當(dāng)返回-1時(shí),創(chuàng)建失敗。 wait()常用來控制父進(jìn)程與子進(jìn)程的同步。 在父進(jìn)程中調(diào)用wait(),則父進(jìn)程被阻塞,進(jìn)入等待隊(duì)列,等待子進(jìn)程結(jié)束。當(dāng)子進(jìn)程結(jié)束時(shí),父進(jìn)程從wait()返回繼續(xù)執(zhí)行原來的程序。 返回值:大于0時(shí),為子進(jìn)程的ID值;等于-1時(shí),調(diào)用失敗。 exit()是進(jìn)程結(jié)束時(shí)最常調(diào)用的。 格式:voidexit(intstatus);其中,status為進(jìn)程結(jié)束狀態(tài)。 pipe()用于創(chuàng)建一個(gè)管道

5、格式:pipe(intfd); 其中fd是一個(gè)由兩個(gè)數(shù)組元素fd[0]和fd[1]組成的整型 數(shù)組,fd[0]是管道的讀端口,用于從管道讀出數(shù)據(jù),fd[1]是管道的寫端口,用于向管道寫入數(shù)據(jù)。 返回值:0調(diào)用成功;-1調(diào)用失敗。 sleep()使調(diào)用進(jìn)程睡眠若干時(shí)間,之后喚醒。 格式:sleep(intt);其中t為睡眠時(shí)間。 lockf()用于對(duì)互斥資源加鎖和解鎖。在本實(shí)驗(yàn)中該調(diào)用的格式為: lockf(fd[1],1,0);/*表示對(duì)管道的寫入端口加鎖。 lockf(fd[1],0,0);/*表示對(duì)管道的寫入端口解鎖。 write(fd[1],String,Length)將字符

6、串String的內(nèi)容寫入管道的寫入口。 read(fd[0],String,Length)從管道的讀入口讀出信息放入字符串String中。 ?程序流程圖程序流程簡(jiǎn)述父進(jìn)程:創(chuàng)建管道; 創(chuàng)建子進(jìn)程1; 創(chuàng)建子進(jìn)程2; 等待從管道中先后讀出兩個(gè)子進(jìn)程寫入的信息,并顯示在屏幕上; 退出。子進(jìn)程:將管道的寫入口加鎖; 將信息“Childprocessnissendingmessage!”輸入到變量OutPipe中,n=1,2; 將OutPipe中信息寫入管道; 使自己進(jìn)入睡眠狀態(tài),另一進(jìn)程執(zhí)行; 從睡眠狀態(tài)返回,將管道的寫入口解鎖; 退出。 流程圖?程序源代碼?/*OS_3.c*/?#i

7、nclude?#include?#include?#include?#include?#include?intmain()?{?pid_tpc1,pc2,pr1,pr2;?intfd[2];?charbuf1[50],buf2[50],s[50];?pipe(fd);/*創(chuàng)建管道*/?pc1=fork();/*創(chuàng)建進(jìn)程*/?if(pc1<0)/

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。