廣東海洋大學(xué)操作系統(tǒng)實(shí)驗(yàn)_第1頁
廣東海洋大學(xué)操作系統(tǒng)實(shí)驗(yàn)_第2頁
廣東海洋大學(xué)操作系統(tǒng)實(shí)驗(yàn)_第3頁
廣東海洋大學(xué)操作系統(tǒng)實(shí)驗(yàn)_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、班級:計科1141 學(xué)號:201411621110姓名:鄧超榮實(shí)驗(yàn)一進(jìn)程同步與互斥實(shí)驗(yàn)?zāi)康?了解多進(jìn)程并發(fā)執(zhí)行時因控制不當(dāng)而導(dǎo)致的運(yùn)行結(jié)果不確定的競爭條件現(xiàn)象、以及消除競爭條件所采取的措施。實(shí)驗(yàn)內(nèi)容有一個數(shù)據(jù)文件,名字是data,其中存放了一個十進(jìn)制正整數(shù)?,F(xiàn)有一個程序,該程序讀出文件data中的數(shù)據(jù)、將其加一、再將結(jié)果更新到data之中,上述動作重復(fù)進(jìn)行一百萬次。如下給出完成上述功能的源程序:01 #include <stdio.h>02 #include <stdlib.h>03 #include <fcntl.h>04 #include <sys

2、/types.h>05 #include <unistd.h>06 #include <stdarg.h>07 #include <string.h>08 int main()09 10 int num, fd,i;/ num變量用于存放從buff轉(zhuǎn)換而來的二進(jìn)制形式的整數(shù) / fd是打開data文件之后的描述符,用于下文對data文件的讀寫操作11 char buff100;/ 定義的buff字符數(shù)組用于存放從文件中讀出的數(shù)字字符形式的整數(shù)12 fd = open("data", O_RDWR);/打開文件13 if(fd<

3、=0)/如果文件不存在14 printf("open errorn");15 return 1;16 17 for(i=1;i<=1000000;i+)/循環(huán)一百萬次循環(huán)循環(huán)18 lseek(fd, 0, SEEK_SET);/ 將文件的讀寫指針歸零19 int len = read(fd, buff, 100);/len存放從文件讀入的數(shù)字符的長度20 bufflen='0'/在字符串后添加空格代表結(jié)束21 num = atoi(buff);/ 調(diào)用atoi函數(shù),將字符串轉(zhuǎn)換為二進(jìn)制形式,并存放在num22 sprintf(buff, "%

4、dn", num + 1);/num+1,循環(huán)10000次后就是1000000+num23 lseek(fd, 0, SEEK_SET);/ 將文件的讀寫指針歸零即置于起始字節(jié)之處24 write(fd, buff,strlen(buff);/將更新后的數(shù)重新寫入文件中25 26 close(fd);/關(guān)閉文件27 return 0;/返回28 問題:1. 請在linux中編譯、鏈接、執(zhí)行這個程序。如果該程序只作為單個進(jìn)程執(zhí)行,請觀察運(yùn)行結(jié)果,并分析代碼。首先向data文件中輸入1107,并進(jìn)行保存。該程序分析如下:第10行中定義變量num存放從buff的字符串中轉(zhuǎn)換而來的二進(jìn)制形式

5、的整數(shù),變量fd存放打開data文件之后的描述符;第11行中定義長度為100的字符數(shù)組,用于存放從data文件中讀出的數(shù)字字符形式的整數(shù);第12行打開data文件;第13-16行判斷文件是否打開,如果沒有,則輸出open error提示;第17-25行,循環(huán)1000000次操作,第18行,在每次循環(huán)都將文件的讀寫指針指向文件的起始位置;第19行,len保存讀入字符串的長度;第20行,在字符串結(jié)尾加入空格符以示結(jié)束;第21行,調(diào)用atoi()函數(shù),將buff的字符串轉(zhuǎn)變?yōu)槎M(jìn)制數(shù);第22行,對轉(zhuǎn)變得二進(jìn)制數(shù)進(jìn)行+1操作;第23行,把文件的讀寫指針至于文件起始位置;第24行,將更新的數(shù)據(jù)重新寫回d

6、ata文件中。如此循環(huán)一百萬次,相當(dāng)于data中存放的數(shù)據(jù)加上一百萬,所以得出圖中所示結(jié)果。2.在不改變程序代碼的情況下,怎樣把上述程序作為多個進(jìn)程來并發(fā)執(zhí)行?請觀察并發(fā)執(zhí)行情況下的運(yùn)行結(jié)果,分析運(yùn)行結(jié)果錯誤的具體原因。答:要實(shí)現(xiàn)多進(jìn)程并發(fā)執(zhí)行,可多個窗口對同一程序進(jìn)行運(yùn)行。 由于data文件初始值為1234,所以兩個進(jìn)程在并發(fā)執(zhí)行的情況下,正確結(jié)果應(yīng)該為2001234,可是最后結(jié)果卻為1509625。顯然與正確結(jié)果不符。此主要原因在于,在兩個進(jìn)程同時執(zhí)行的時候,可能會在同一時間對num進(jìn)行操作,導(dǎo)致重讀,如原本進(jìn)程1對2加1后為3,進(jìn)程而對3加1后為4.而現(xiàn)實(shí)中可能產(chǎn)生的情況是進(jìn)程1和進(jìn)程2

7、同時對2進(jìn)行加1操作,所以得到最終結(jié)果是3而不是4;另一種情況是,進(jìn)程1已進(jìn)行了加1操作但在保存到文件之前,進(jìn)程2執(zhí)行到讀取文件數(shù)據(jù),因此,進(jìn)程2讀取的還是原本數(shù)據(jù),進(jìn)行加1操作后仍然是進(jìn)程1執(zhí)行操作后的數(shù)據(jù)。所以當(dāng)多進(jìn)程并發(fā)執(zhí)行時,最后得出的結(jié)果與預(yù)想中的結(jié)果不同。3.請修改上述代碼,采用上鎖方式,以保證并發(fā)執(zhí)行時運(yùn)行結(jié)果的正確性,并分析得到了正確結(jié)果的原因。修改后,代碼如下:#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/types.h>#include

8、 <unistd.h>#include <stdarg.h>#include <string.h>int main() struct flock fl;/定義結(jié)構(gòu)體flock,設(shè)置鎖 int num, fd,i; char buff100; fd = open("data", O_RDWR); if(fd<=0) printf("open errorn"); return 1; fl.l_whence = SEEK_SET;/設(shè)置文件讀寫位置 fl.l_start = 1;/開始位置為1 fl.l_len = 1

9、;/長度為1 fl.l_pid = getpid();/獲取進(jìn)程 for(i=1;i<=1000000;i+) fl.l_type = F_WRLCK;/對文件加鎖 fcntl(fd, F_SETLKW, &fl);/對文件逐個掃描 lseek(fd, 0, SEEK_SET); int len = read(fd, buff, 100); bufflen='0' num = atoi(buff); sprintf(buff, "%dn", num + 1); lseek(fd, 0, SEEK_SET); write(fd, buff,str

10、len(buff); fl.l_type = F_UNLCK;/解鎖文件 fcntl(fd, F_SETLKW, &fl); close(fd); return 0;該程序分析結(jié)果如下:當(dāng)進(jìn)程1對文件進(jìn)行操作時,對文件進(jìn)行加鎖,防止其他進(jìn)程對文件同時操作,也就是,其他進(jìn)程阻塞。當(dāng)進(jìn)程1完成操作對文件解鎖后,進(jìn)程2被喚醒,進(jìn)而對文件進(jìn)行操作,在操作前,同樣對文件進(jìn)行加鎖。如此類推,對個進(jìn)程交替執(zhí)行,保證了結(jié)果的正確性。實(shí)驗(yàn)心得:寫出你對單次執(zhí)行和并發(fā)進(jìn)程的感受,操作系統(tǒng)對并發(fā)進(jìn)程控制的重要性。在數(shù)據(jù)量比較少的情況下,單次執(zhí)行的速度比并發(fā)執(zhí)行的速度占有一定的優(yōu)勢。但在數(shù)據(jù)量的達(dá)到百萬上億的時候,單次執(zhí)行的速度明顯不盡人意。而并發(fā)執(zhí)行能多個進(jìn)程同時對一個程序進(jìn)行操作,就如,工廠里生

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論