合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第1頁
合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第2頁
合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第3頁
合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第4頁
合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書合肥師范學(xué)院第二學(xué)期操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書操作系統(tǒng)課程組編著計(jì)算機(jī)科學(xué)與技術(shù)系操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書目錄序言.-1-實(shí)驗(yàn)項(xiàng)目一熟習(xí)LINUX基本命令及編程環(huán)境.-2-實(shí)驗(yàn)項(xiàng)目二進(jìn)度管理.-4-實(shí)驗(yàn)項(xiàng)目三進(jìn)度調(diào)動.-9-實(shí)驗(yàn)項(xiàng)目四進(jìn)度通訊.-15-實(shí)驗(yàn)項(xiàng)目五儲蓄管理.-24-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書序言操作系統(tǒng)是計(jì)算機(jī)本科各專業(yè)的專業(yè)核心課程,其實(shí)踐性、應(yīng)用性很強(qiáng),實(shí)驗(yàn)講課環(huán)節(jié)是必不可以少的一個(gè)重要環(huán)節(jié)。經(jīng)過操作系統(tǒng)實(shí)驗(yàn)部分講課,使學(xué)生加深理解和更好的掌握操作系統(tǒng)的基本源理、技術(shù)和方法,堅(jiān)固所學(xué)理論知識,激發(fā)實(shí)驗(yàn)興趣

2、,掌握實(shí)驗(yàn)要領(lǐng),培育對操作系統(tǒng)理論課程所學(xué)知識貫穿交融和綜合運(yùn)用的能力。經(jīng)過實(shí)驗(yàn),使學(xué)生深入認(rèn)識和嫻熟掌握Linux操作系統(tǒng)的使用,及在Linux操作系統(tǒng)下進(jìn)行程序設(shè)計(jì)開發(fā)的方法,掌握操作系統(tǒng)中進(jìn)度管理、進(jìn)度調(diào)動、進(jìn)度通訊和儲蓄管理的方法,使學(xué)生擁有初步分析實(shí)質(zhì)操作系統(tǒng)的能力,為此后學(xué)習(xí)使用其余的程序設(shè)計(jì)環(huán)境和語言打好基礎(chǔ)。為了收到優(yōu)秀的實(shí)查見效,編寫這本實(shí)驗(yàn)指導(dǎo)書。在指導(dǎo)書中,每一個(gè)實(shí)驗(yàn)均依據(jù)該課程實(shí)驗(yàn)綱領(lǐng)的要求編寫,力爭緊扣理論知識點(diǎn)、突出設(shè)計(jì)方法、明確設(shè)計(jì)思路,經(jīng)過多種形式完成實(shí)驗(yàn)任務(wù),最后指引學(xué)生有目的、有方向地完成實(shí)驗(yàn)任務(wù),得出實(shí)驗(yàn)結(jié)果。實(shí)驗(yàn)前,指導(dǎo)教師部署實(shí)驗(yàn)任務(wù),給定實(shí)驗(yàn)內(nèi)容,進(jìn)

3、行必然的分析和解說,學(xué)生進(jìn)行預(yù)習(xí),提早設(shè)計(jì)實(shí)驗(yàn)方案,此后進(jìn)入實(shí)驗(yàn)室進(jìn)行實(shí)驗(yàn);實(shí)驗(yàn)中,要修業(yè)生依據(jù)實(shí)驗(yàn)要求進(jìn)行實(shí)驗(yàn),仔細(xì)完成每個(gè)實(shí)驗(yàn)項(xiàng)目的詳細(xì)內(nèi)容,指導(dǎo)教師全程指導(dǎo)協(xié)調(diào)實(shí)驗(yàn)進(jìn)行,對于實(shí)驗(yàn)中學(xué)生所發(fā)問題進(jìn)行詳細(xì)解答;實(shí)驗(yàn)后,學(xué)生應(yīng)該實(shí)時(shí)總結(jié)實(shí)驗(yàn)過程,并依據(jù)實(shí)質(zhì)狀況對實(shí)驗(yàn)報(bào)告進(jìn)行填寫,能對在實(shí)驗(yàn)過程中發(fā)生的問題實(shí)時(shí)分析并找到解決方案,提交實(shí)驗(yàn)報(bào)告;指導(dǎo)教師需要對實(shí)驗(yàn)報(bào)告進(jìn)行仔細(xì)批閱,并依據(jù)需要采納要點(diǎn)內(nèi)容進(jìn)行談?wù)摲治觥?1-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)項(xiàng)目一熟習(xí)LINUX基本命令及編程環(huán)境一、實(shí)驗(yàn)種類本實(shí)驗(yàn)為考證性實(shí)驗(yàn)。二、實(shí)驗(yàn)?zāi)康呐c任務(wù)熟習(xí)Linux操作系統(tǒng)的安裝和使用;熟習(xí)使用Linux字符界面,窗口

4、系統(tǒng)的常用命令。掌握運(yùn)用Linux常用的編程工具;掌握怎樣編寫、編譯、運(yùn)轉(zhuǎn)程序。三、實(shí)驗(yàn)準(zhǔn)備熟習(xí)linux系統(tǒng)中常用命令及其功能熟習(xí)vi編寫器或Gedit編寫器的各項(xiàng)功能復(fù)習(xí)C語言程序的編寫。四、實(shí)驗(yàn)內(nèi)容練習(xí)使用Gedit編寫器使用Gedit編寫器用C語言編寫一個(gè)HelloWorld程序,并保留。詳細(xì)操作:點(diǎn)擊“任務(wù)欄地點(diǎn)主文件夾”,翻開主文件夾地點(diǎn)文件閱讀器,空白處右鍵單擊,彈出菜單項(xiàng)選擇擇“創(chuàng)立文檔空文件”,新建一個(gè)空文件,并命名為“hello.c”,右鍵單擊“hello.c”,選擇“使用Gedit翻開”,在Gedit編寫器中編寫代碼以下:#includeintmain()printf(H

5、ello,Wrold!n);編寫完成后,點(diǎn)擊“保留”,保留文件。使用gcc編譯源程序。gcc是linux下的一種c程序編譯工具,使用方法以下:編譯:gcc-ofilename1filename.c(或許gccfilename.c-ofilename1),此中:filename.c是源文件名,filename1是目標(biāo)文件名,o代表object詳細(xì)操作:點(diǎn)擊“任務(wù)欄應(yīng)用程序附件終端”,目前默認(rèn)路徑即為主文件夾,輸入“gcchello.c-ohello”,回車運(yùn)轉(zhuǎn)后,若無任何提示,怎說明編譯成功,已生成可履行文件“hello“,若提示有錯(cuò)誤,則依據(jù)詳細(xì)提示回到Gedit中改正源程序,保留后從頭編譯。

6、履行程序履行:./filenamel此中:filename1是目標(biāo)文件名。詳細(xì)操作:在“終端”中輸入“./hello”,回車后運(yùn)轉(zhuǎn),若無錯(cuò)誤,終端中將顯示運(yùn)轉(zhuǎn)結(jié)果“Hello,Wrold!”。-2-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書五、注意事項(xiàng)gcc編譯器不可以夠編譯不帶擴(kuò)展名的c語言程序。注意編譯和運(yùn)轉(zhuǎn)程序的基本過程。從頭編寫源程序后,必然從頭編譯,才會生成新的可履行程序。-3-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)項(xiàng)目二進(jìn)度管理一、實(shí)驗(yàn)種類本實(shí)驗(yàn)為考證性實(shí)驗(yàn)。二、實(shí)驗(yàn)?zāi)康睦斫膺M(jìn)度的見解,掌握父、子進(jìn)度創(chuàng)立的方法。認(rèn)識和認(rèn)識并發(fā)履行的實(shí)質(zhì),掌握進(jìn)度的并發(fā)及同步操作。三、實(shí)驗(yàn)預(yù)備知識1.fork()函數(shù)頭文件:#includ

7、e#include函數(shù)原型:pid_tfork(void);pid_t是一個(gè)宏定義,其實(shí)質(zhì)是int,被定義在#include中)返回值:若成功調(diào)用一次則返回兩個(gè)值,子進(jìn)度返回0,父進(jìn)度返回子進(jìn)度ID;不然,犯錯(cuò)返回-1函數(shù)說明:一個(gè)現(xiàn)有進(jìn)度能夠調(diào)用fork函數(shù)創(chuàng)立一個(gè)新進(jìn)度。由fork創(chuàng)立的新進(jìn)度被稱為子進(jìn)度(childprocess)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的獨(dú)一差別是子進(jìn)度中返回0值而父進(jìn)度中返回子進(jìn)度ID。子進(jìn)度是父進(jìn)度的副本,它將獲得父進(jìn)度數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)度擁有的是上述儲蓄空間的“副本”,這意味著父子進(jìn)度間不共享這些儲蓄空間。linux將復(fù)制

8、父進(jìn)度的地點(diǎn)空間內(nèi)容給子進(jìn)度,因此,子進(jìn)度有了獨(dú)立的地點(diǎn)空間。為何fork會返回兩次?因?yàn)樵趶?fù)制時(shí)復(fù)制了父進(jìn)度的貨倉段,因此兩個(gè)進(jìn)度都逗留在fork函數(shù)中,等候返回。因?yàn)閒ork函數(shù)會返回兩次,一次是在父進(jìn)度中返回,另一次是在子進(jìn)度中返回,這兩次的返回值是不同樣樣的,過程如圖2.1。調(diào)用fork此后,數(shù)據(jù)、貨倉有兩份,代碼仍舊為一份但是這個(gè)代碼段成為兩個(gè)進(jìn)度的共享代碼段都從fork函數(shù)中返回,箭頭表示各自的履行處。當(dāng)父子進(jìn)度有一個(gè)想要改正代碼段時(shí),兩個(gè)進(jìn)度真切分裂。-4-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書父進(jìn)度If(fork()=0),Else,父進(jìn)度子進(jìn)度If(fork()=0)If(fork()=0),E

9、lseElse,圖2.1fork()函數(shù)分裂表示圖示例代碼:#include/對于此程序而言此頭文件用不到#include#includeintmain(intargc,char*argv)intpid=fork();if(pid0)printf(error!);elseif(pid=0)printf(Thisisthechildprocess!);elseprintf(Thisistheparentprocess!childprocessid=%d,pid);return0;fork函數(shù)的特色歸納起來就是“調(diào)用一次,返回兩次”,在父進(jìn)度中調(diào)用一次,在父進(jìn)度和子進(jìn)度中各返回一次。fork的另一

10、個(gè)特色是全部由父進(jìn)度翻開的描繪符都被復(fù)制到子進(jìn)度中。父、子進(jìn)度中同樣編號的文件描繪符在內(nèi)核中指向同一個(gè)file構(gòu)造體,也就是說,file構(gòu)造體的引用計(jì)數(shù)要增添。-5-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書2.wait()函數(shù)頭文件:#include#include函數(shù)原型:pid_twait(int*status);返回值:假如履行成功則返回子進(jìn)度鑒別碼(PID),假如有錯(cuò)誤發(fā)生則返回-1。函數(shù)說明:wait()會臨時(shí)停止目行進(jìn)度的履行,直到有信號到達(dá)或子進(jìn)度結(jié)束。假如在調(diào)用wait()時(shí)子進(jìn)度已經(jīng)結(jié)束,則wait()會立刻返回子進(jìn)度結(jié)束狀態(tài)值。子進(jìn)度的結(jié)束狀態(tài)值會由參數(shù)status返回,而子進(jìn)度的進(jìn)度鑒別碼也會

11、一同返回。假如不在乎結(jié)束狀態(tài)值,則參數(shù)status能夠設(shè)成NULL。子進(jìn)度的結(jié)束狀態(tài)值請參照下邊的waitpid()。示例代碼:#include#include#include#includeintmain(intargc,char*argv)pid_tpid;intstatus,i;if(fork()=0)printf(Thisisthechildprocess.pid=%dn,getpid();exit(5);elsesleep(1);printf(Thisistheparentprocess,waitforchild.n);pid=wait(&status);i=WEXITSTATUS(

12、status);printf(childspid=%d.exitstatus=%dn,pid,i);3.waitpid()函數(shù)頭文件:#include#include-6-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書函數(shù)原型:pid_twaitpid(pid_tpid,int*status,intoptions);返回值:假如履行成功則返回子進(jìn)度鑒別碼(PID),假如有錯(cuò)誤發(fā)生則返回-1。函數(shù)說明:waitpid()會臨時(shí)停止目行進(jìn)度的履行,直到有信號到達(dá)或子進(jìn)度結(jié)束。假如在調(diào)用wait()時(shí)子進(jìn)度已經(jīng)結(jié)束,則wait()會立刻返回子進(jìn)度結(jié)束狀態(tài)值。子進(jìn)度的結(jié)束狀態(tài)值會由參數(shù)status返回,而子進(jìn)度的進(jìn)度鑒別碼也會一

13、快返回。假如不在乎結(jié)束狀態(tài)值,則參數(shù)status能夠設(shè)成NULL。參數(shù)pid為欲等候的子進(jìn)度鑒別碼,其余數(shù)值意義以下:pid0等候任何子進(jìn)度鑒別碼為pid的子進(jìn)度。參數(shù)option能夠?yàn)?或下邊的組合:WNOHANG假如沒有任何已經(jīng)結(jié)束的子進(jìn)度則立刻返回,不予以等候。WUNTRACED假如子進(jìn)度進(jìn)入暫停履行狀況則立刻返回,但結(jié)束狀態(tài)不予以理睬。子進(jìn)度的結(jié)束狀態(tài)返回后存于status,底下有幾個(gè)宏可鑒別結(jié)束狀況:WIFEXITED(status)假如子進(jìn)度正常結(jié)束則為非0值。WEXITSTATUS(status)獲得子進(jìn)度exit()返回的結(jié)束代碼,一般會先用WIFEXITED來判斷能否正常結(jié)束

14、才能使用此宏。WIFSIGNALED(status)假如子進(jìn)度是因?yàn)樾盘柖Y(jié)束則此宏值為真。WTERMSIG(status)獲得子進(jìn)度因信號而中斷的信號代碼,一般會先用WIFSIGNALED來判斷后才使用此宏。WIFSTOPPED(status)假如子進(jìn)度處于暫停履行狀況則此宏值為真。一般只有使用WUNTRACED時(shí)才會有此狀況。WSTOPSIG(status)獲得引起子進(jìn)度暫停的信號代碼,一般會先用WIFSTOPPED來判斷后才使用此宏。4.exit()函數(shù)頭文件:#include函數(shù)原型:voidexit(intstatus);返回值:無。函數(shù)說明:進(jìn)度結(jié)束正常停止,返回結(jié)束狀態(tài)。stat

15、us為進(jìn)度結(jié)束狀態(tài),是返回給父進(jìn)度的一個(gè)整數(shù),以備查考。為了實(shí)時(shí)回收進(jìn)度所占用的資源并減少父進(jìn)度的干涉,UNIX/LINUX利用exit()來實(shí)現(xiàn)進(jìn)度的自我停止,平常父進(jìn)度在創(chuàng)立子進(jìn)度時(shí),應(yīng)在進(jìn)度的尾端安排一條exit(),使子進(jìn)度自我停止。exit(0)表示進(jìn)度正常停止,exit(1)表示進(jìn)度運(yùn)轉(zhuǎn)有錯(cuò),異樣停止。-7-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書假如調(diào)用進(jìn)度在履行exit()時(shí),其父進(jìn)度正在等候它的停止,則父進(jìn)度可立刻獲得其返回的整數(shù)。核心須為exit()完成以下操作:(1)封閉軟中斷(2)回收資源(3)寫記帳信息(4)置進(jìn)度為“僵死狀態(tài)”四、實(shí)驗(yàn)內(nèi)容編寫一C語言程序,實(shí)此刻程序運(yùn)轉(zhuǎn)時(shí)經(jīng)過系統(tǒng)調(diào)用fo

16、rk()創(chuàng)立兩個(gè)子進(jìn)度,使父、子三進(jìn)度并發(fā)履行,父親進(jìn)度履行時(shí)屏幕顯示“Iamfather,兒”子進(jìn)度履行時(shí)屏幕顯示“Iamson,”女兒進(jìn)度履行時(shí)屏幕顯示“Iamdaughter?!倍啻芜B續(xù)頻頻運(yùn)轉(zhuǎn)這個(gè)程序,察看屏幕顯示結(jié)果的次序,直至出現(xiàn)不同樣樣的狀況為止。記下這類狀況,試簡單分析其原由。3.改正程序,在父、子進(jìn)度中分別使用wait()、exit()等系統(tǒng)調(diào)用“實(shí)現(xiàn)”其同步推動,并獲得子進(jìn)度的ID號及結(jié)束狀態(tài)值。多次頻頻運(yùn)轉(zhuǎn)改良后的程序,察看并記錄運(yùn)轉(zhuǎn)結(jié)果。五、實(shí)驗(yàn)報(bào)告要求列出實(shí)驗(yàn)內(nèi)容1、3各程序清單,并以截圖形式記錄相應(yīng)運(yùn)轉(zhuǎn)結(jié)果。對實(shí)驗(yàn)運(yùn)轉(zhuǎn)結(jié)果進(jìn)行分析:1)實(shí)驗(yàn)內(nèi)容1運(yùn)轉(zhuǎn)結(jié)果為何無固定次

17、序,fork()函數(shù)創(chuàng)立進(jìn)度是怎樣并發(fā)履行的。2)實(shí)驗(yàn)內(nèi)容3是怎樣實(shí)現(xiàn)父子進(jìn)度的同步履行的。-8-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)項(xiàng)目三進(jìn)度調(diào)動一、實(shí)驗(yàn)種類本實(shí)驗(yàn)為考證性實(shí)驗(yàn)。二、實(shí)驗(yàn)?zāi)康睦斫膺M(jìn)度控制塊和進(jìn)度組織方式;掌握時(shí)間片輪轉(zhuǎn)調(diào)動算法實(shí)現(xiàn)辦理機(jī)調(diào)動。三、實(shí)驗(yàn)預(yù)備知識實(shí)驗(yàn)基本源理進(jìn)度控制塊經(jīng)過鏈表行列的方式組織起來,系統(tǒng)中存在運(yùn)轉(zhuǎn)行列和就緒行列(為簡單起見,不設(shè)擁堵行列),進(jìn)度的調(diào)動就是進(jìn)度控制塊在運(yùn)轉(zhuǎn)行列和就緒行列之間的切換。當(dāng)需要調(diào)動時(shí),從就緒行列中精選一個(gè)進(jìn)度占用辦理機(jī),即從就緒行列中刪除一個(gè)進(jìn)度,插入到運(yùn)轉(zhuǎn)行列中,當(dāng)占用辦理機(jī)的進(jìn)度運(yùn)轉(zhuǎn)的時(shí)間片完成后,放棄辦理機(jī),即在運(yùn)轉(zhuǎn)行列中的進(jìn)度控制塊經(jīng)

18、過一段時(shí)間(時(shí)間片)后,從該行列上刪除,假如該進(jìn)度運(yùn)轉(zhuǎn)完成,則刪除該進(jìn)度(節(jié)點(diǎn));不然,則插入到就緒行列中。實(shí)驗(yàn)中使用的數(shù)據(jù)構(gòu)造PCB進(jìn)度控制塊內(nèi)容包含參數(shù)進(jìn)度名name;要求運(yùn)轉(zhuǎn)時(shí)間runtime;已運(yùn)轉(zhuǎn)時(shí)間runedtime;本輪運(yùn)轉(zhuǎn)時(shí)間killtime。進(jìn)度行列為簡單起見,只設(shè)運(yùn)轉(zhuǎn)行列,就緒行列兩種數(shù)據(jù)構(gòu)造,進(jìn)度的調(diào)動在這兩個(gè)行列中切換,如圖3.1所示。PCBi運(yùn)轉(zhuǎn)行列PCBjPCBj+1,PCBj+n,就緒行列,圖3.1PCB鏈表3.rand()函數(shù)和srand()函數(shù)-9-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書庫函數(shù)中系統(tǒng)供給了兩個(gè)函數(shù)用于產(chǎn)生隨機(jī)數(shù):srand()和rand()。函數(shù)一:intrand

19、(void);從srand(seed)中指定的seed開始,返回一個(gè)0,RAND_MAX(0 x7fff)間的隨機(jī)整數(shù)。函數(shù)二:voidsrand(unsignedseed);參數(shù)seed是rand()的種子,用來初始化rand()的初步值。函數(shù)rand()是真切的隨機(jī)數(shù)生成器,而srand()會設(shè)置供rand()使用的隨機(jī)數(shù)種子。假如你在第一次調(diào)用rand()從前沒有調(diào)用srand(),那么系統(tǒng)會為你自動調(diào)用srand()。而使用同種子同樣的數(shù)調(diào)用srand()會致使同樣的隨機(jī)數(shù)序列被生成。srand(unsigned)time(NULL)則使用系統(tǒng)準(zhǔn)時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子。每個(gè)種子對應(yīng)

20、一組依據(jù)算法開初生成的隨機(jī)數(shù),因此,在同樣的平臺環(huán)境下,不同樣時(shí)間產(chǎn)生的隨機(jī)數(shù)會是不同樣的,相應(yīng)的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則不論何時(shí)運(yùn)轉(zhuǎn)、運(yùn)轉(zhuǎn)多少次獲得的“隨機(jī)數(shù)”都會是一組固定的序列,因此srand生成的隨機(jī)數(shù)是偽隨機(jī)數(shù)。但是,要注意的是所謂的“偽隨機(jī)數(shù)”指的其實(shí)不是假的隨機(jī)數(shù)。其實(shí)絕對的隨機(jī)數(shù)但是一種理想狀態(tài)的隨機(jī)數(shù),計(jì)算機(jī)只好生成相對的隨機(jī)數(shù)即偽隨機(jī)數(shù)。計(jì)算機(jī)生成的偽隨機(jī)數(shù)既是隨機(jī)的又是有規(guī)律的一部份恪守必然的規(guī)律,一部份則不恪守任何規(guī)律。比方“世上沒有兩片形狀完滿同樣的樹葉”,這表現(xiàn)到了事物的特色差別性;但是每種

21、樹的葉子都有近似的形狀,這正是事物的共性規(guī)律性。從這個(gè)角度講,我們就能夠接受這樣的事實(shí)了:計(jì)算機(jī)只好產(chǎn)生偽隨機(jī)數(shù)而不是絕對的隨機(jī)數(shù)。系統(tǒng)在調(diào)用rand()從前都會自動調(diào)用srand(),假如用戶在rand()從前曾調(diào)用過srand()給參數(shù)seed指定了一個(gè)值,那么rand()就會將seed的值作為產(chǎn)生偽隨機(jī)數(shù)的初始值;而假如用戶在rand()前沒有調(diào)用過srand(),那么系統(tǒng)默認(rèn)將1作為偽隨機(jī)數(shù)的初始值。假如給了一個(gè)定值,那么每次rand()產(chǎn)生的隨機(jī)數(shù)序列都是同樣的。因此為了防范上述狀況的發(fā)生我們平常用srand(unsigned)time(0)或許srand(unsigned)time

22、(NULL)來產(chǎn)生種子。假如仍舊感覺時(shí)間間隔太小,能夠在(unsigned)time(0)或許(unsigned)time(NULL)后邊乘上某個(gè)適合的整數(shù)。例如,srand(unsigned)time(NULL)*10)。其余,對于time_ttime(0):time_t被定義為長整型,它返回從1970年1月1日零時(shí)零分零秒到目前為止所經(jīng)過的時(shí)間,單位為秒。srand()、rand()用法舉例:#include#includevoidmain()inti,j;srand(10);/srand(int)time(0);for(i=0;i10;i+)j=(int)(rand()%20;print

23、f(%dn,j);-10-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書4.malloc()函數(shù)頭文件:#include函數(shù)原型:void*malloc(unsignedintsize);函數(shù)說明:其作用是在內(nèi)存的動向儲蓄區(qū)中分派一個(gè)長度為size的連續(xù)空間,此函數(shù)的值(即“返回值”)是一個(gè)指向分派域其實(shí)地點(diǎn)的指針(種類為void)。若此函數(shù)未能成功履行則返回空指針。程序流程圖-11-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書開始成立就緒行列,每個(gè)進(jìn)度設(shè)置相應(yīng)參數(shù),如運(yùn)轉(zhuǎn)時(shí)間,進(jìn)度名字等成立運(yùn)轉(zhuǎn)行列指針,初始值指向空從就緒行列中準(zhǔn)時(shí)間先后順序選一個(gè)進(jìn)度插入運(yùn)轉(zhuǎn)行列每個(gè)進(jìn)度占用辦理機(jī)一個(gè)時(shí)間片,即runtime=runtime-時(shí)間片大小Yrun

24、time=0runtime賦值0N改正相應(yīng)參數(shù)改正相應(yīng)參數(shù)結(jié)束該進(jìn)度,將該進(jìn)度插入就緒行列中即開釋節(jié)點(diǎn)空就緒行列為空么?Y結(jié)束產(chǎn)生一次調(diào)動,即準(zhǔn)時(shí)間先后次序從頭節(jié)點(diǎn)刪除一個(gè)節(jié)點(diǎn)插入運(yùn)轉(zhuǎn)行列中N圖3.2模擬進(jìn)度調(diào)動的流程圖部分參照程序PCB數(shù)據(jù)構(gòu)造structPCB-12-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書intname;intruntime;intrunedtime;intkilltime;structPCB*next;typedefstructPCBPCB;創(chuàng)立就緒列表#defineLENsizeof(PCB)PCB*runqueue;/運(yùn)轉(zhuǎn)行列指針PCB*top,*tail,*temp;/就緒行列指針in

25、ti;srand(int)time(0);for(i=0;iname=i;temp-runtime=rand()%15;temp-runedtime=0;temp-next=NULL;temp-killtime=0;if(i=0)top=temp;tail=temp;elsetail-next=temp;tail=temp;printf(processname%d,runtime=%d,runedtime=%d,killtime=%dn,tail-name,tail-runtime,tail-runedtime,tail-killtime);準(zhǔn)時(shí)間片輪轉(zhuǎn)算法進(jìn)行進(jìn)度調(diào)動的過程描繪。第1步:取就

26、緒行列的隊(duì)首結(jié)點(diǎn)為運(yùn)轉(zhuǎn)行列的結(jié)點(diǎn),改正就緒行排隊(duì)首指針后移;第2步:調(diào)動運(yùn)轉(zhuǎn)行列結(jié)點(diǎn),即運(yùn)轉(zhuǎn)行列結(jié)點(diǎn)的要求運(yùn)轉(zhuǎn)時(shí)間減去時(shí)間片刻間;第3步:a若改正后要求運(yùn)轉(zhuǎn)時(shí)間=0,則表示該進(jìn)度結(jié)點(diǎn)運(yùn)轉(zhuǎn)完成,改正良程結(jié)點(diǎn)的PCB信息,記錄runtime,runedtime,killtime等信息。并將結(jié)點(diǎn)信息輸出。b不然,表示該進(jìn)度結(jié)點(diǎn)未完成,記錄runtime,runedtime,killtime等信息,將結(jié)點(diǎn)信息輸出。并將該結(jié)點(diǎn)置于就緒行列的隊(duì)尾,等候下次-13-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書調(diào)動,同時(shí)改正隊(duì)尾指針。第4步:若就緒行列非空,則連續(xù)履行第1步,直至就緒行列為空。四、實(shí)驗(yàn)內(nèi)容成立合理的PCB數(shù)據(jù)構(gòu)造,成立

27、含有8個(gè)進(jìn)度結(jié)點(diǎn)的就緒行列,每個(gè)進(jìn)度的要求運(yùn)轉(zhuǎn)時(shí)間隨機(jī)產(chǎn)生,要求每個(gè)進(jìn)度的要求運(yùn)轉(zhuǎn)時(shí)間不大于15。設(shè)置時(shí)間片大小(36),使用時(shí)間片輪轉(zhuǎn)調(diào)動算法實(shí)現(xiàn)辦理機(jī)調(diào)動。五、實(shí)驗(yàn)報(bào)告要求列出實(shí)驗(yàn)內(nèi)容所要求的程序清單,并以截圖形式記錄相應(yīng)運(yùn)轉(zhuǎn)結(jié)果;對實(shí)驗(yàn)運(yùn)轉(zhuǎn)結(jié)果進(jìn)行分析:假如時(shí)間片設(shè)置值過大或過小,會對進(jìn)度的調(diào)動產(chǎn)生何種影響。-14-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)項(xiàng)目四進(jìn)度通訊一、實(shí)驗(yàn)種類本實(shí)驗(yàn)為綜合性實(shí)驗(yàn)。二、實(shí)驗(yàn)?zāi)康恼J(rèn)識什么是信息,熟習(xí)信息傳達(dá)原理。認(rèn)識和熟習(xí)共享儲蓄系統(tǒng)。掌握信息的發(fā)送與接收的實(shí)現(xiàn)方法。三、實(shí)驗(yàn)預(yù)備知識任務(wù)一信息的發(fā)送和接收實(shí)驗(yàn)基本源理信息(message)是一個(gè)格式化的可變長的信息單元。信

28、息系統(tǒng)贊成由一個(gè)進(jìn)度給其余隨意的進(jìn)度發(fā)送一個(gè)信息。當(dāng)一個(gè)進(jìn)度收到多個(gè)信息時(shí),可將它們排成一個(gè)信息行列。信息使用兩種重要的數(shù)據(jù)構(gòu)造:一是信息首部,此中記錄了一些與信息相關(guān)的信息,如信息數(shù)據(jù)的字節(jié)數(shù);二是信息行列頭表,其每一表項(xiàng)是作為一個(gè)信息行列的信息頭,記錄了信息行列的相關(guān)信息。信息系統(tǒng)的數(shù)據(jù)構(gòu)造:structmsgformlongmtype;charmtext1024;(1)信息首部記錄一些與信息相關(guān)的信息,如信息的種類、大小、指向信息數(shù)據(jù)區(qū)的指針、信息行列的鏈接指針等。(2)信息行列頭表其每一項(xiàng)作為一個(gè)信息行列的信息頭,記錄了信息行列的相關(guān)信息如指向信息行列中第一個(gè)信息和指向最后一個(gè)信息的指

29、針、行列中信息的數(shù)量、行列中信息數(shù)據(jù)的總字節(jié)數(shù)、行列所贊成信息數(shù)據(jù)的最大字節(jié)總數(shù),還有近來一次履行發(fā)送操作的進(jìn)度表記符和時(shí)間、近來一次履行接收操作的進(jìn)度表記符和時(shí)間等。(3)信息行列的描繪符UNIX中,每一個(gè)信息行列都有一個(gè)稱為要點(diǎn)字(key)的名字,是由用戶指定的;信息行列有一信息行列描繪符,其作用與用戶文件描繪符同樣,也是為了方便用戶和系統(tǒng)抵信息行列的接見。-15-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書2.msgget()函數(shù)頭文件:#include#include#include函數(shù)原型:intmsgget(key_tkey,intmsgflag);函數(shù)說明:創(chuàng)立一個(gè)信息,獲得一個(gè)信息的描繪符。系統(tǒng)內(nèi)核將搜

30、尋信息行列頭表,確立能否有指命名字的信息行列。若無,系統(tǒng)內(nèi)核將分派一新的信息行列頭,并對它進(jìn)行初始化,此后給用戶返回一個(gè)信息行列描繪符,不然它但是檢查信息行列的贊成權(quán)便返回。系統(tǒng)調(diào)用格式:msgqid=msgget(key,flag)。此中:msgqid是該系統(tǒng)調(diào)用返回的描繪符,失敗則返回-1。msgget()函數(shù)的第一個(gè)參數(shù)是信息行列對象的要點(diǎn)字(key),函數(shù)將它與已有的信息行列對象的要點(diǎn)字進(jìn)行比較來判斷信息行列對象是否已經(jīng)創(chuàng)立。而函數(shù)進(jìn)行的詳細(xì)操作是由第二個(gè)參數(shù)msgflg控制的。它能夠取下邊的幾個(gè)值:IPC_CREAT:假如信息行列對象不存在,則創(chuàng)立之,不然則進(jìn)行翻開操作;IPC_EX

31、CL:和IPC_CREAT一同使用(用”|連”接),假如信息對象不存在則創(chuàng)立之,不然產(chǎn)生一個(gè)錯(cuò)誤并返回。假如獨(dú)自使用IPC_CREAT標(biāo)記,msgget()函數(shù)要么返回一個(gè)已經(jīng)存在的消息行列對象的表記符,要么返回一個(gè)新成立的信息行列對象的表記符。假如將IPC_CREAT和IPC_EXCL標(biāo)記一同使用,msgget()將返回一個(gè)新建的信息對象的表記符,或許返回-1。假如信息行列對象已存在,IPC_EXCL標(biāo)記自己并無太大的意義,但和IPC_CREAT標(biāo)記一同使用能夠用來保證所得的信息行列對象是新創(chuàng)立的而不是翻開的已有的對象。除了以上的兩個(gè)標(biāo)記之外,在msgflg標(biāo)記中還能夠夠有存取權(quán)限控制符。這

32、類控制符的意義和文件系統(tǒng)中的權(quán)限控制符是近似的。3.msgsnd()函數(shù)頭文件:#include#include#include函數(shù)原型:intmsgsnd(intmsqid,constvoid*msgp,inttmsgsz,intmsgflg);函數(shù)說明:在信息行列進(jìn)步行收發(fā)信息,為了發(fā)送信息,調(diào)用進(jìn)度抵信息行列進(jìn)行寫入時(shí)必然有寫權(quán)能。成功履行時(shí)返回0,失敗時(shí)返回-1。此中msgqid是返回信息行列的描繪符;msgp是指向用戶信息緩沖區(qū)的一個(gè)構(gòu)造體指針。緩沖區(qū)中包含消-16-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書息種類和信息正文,即longmtype;/*信息種類*/charmtext;/*信息的文本*/msg

33、sz指示由msgp指向的數(shù)據(jù)構(gòu)造中字符數(shù)組的長度;即信息的長度。這個(gè)數(shù)組的最大值由MSG-MAX()系統(tǒng)可調(diào)用參數(shù)來確立。msgflag參數(shù)是控制函數(shù)行為的標(biāo)記,取值能夠是:0,表示忽視。若在標(biāo)記msgflag中未設(shè)置IPC_NOWAIT位,則當(dāng)該信息行列中的字節(jié)數(shù)超出最大值時(shí),或系統(tǒng)范圍的消息數(shù)超出某一最大值時(shí),調(diào)用msgsnd進(jìn)度睡眠。假如設(shè)置IPC_NOWAIT,則在此狀況下,msgsnd立刻返回。對于msgsnd(),系統(tǒng)內(nèi)核須完成以下工作:(1)抵信息行列的描繪符和贊成權(quán)及信息長度等進(jìn)行檢查。若合法才連續(xù)履行,不然返回;(2)系統(tǒng)內(nèi)核為信息分派信息數(shù)據(jù)區(qū)。將用戶信息緩沖區(qū)中的信息正文

34、,拷貝到信息數(shù)據(jù)區(qū);(3)分派信息首部,并將它鏈入信息行列的尾端。在信息首部中須填寫信息種類、信息大小和指向信息數(shù)據(jù)區(qū)的指針等數(shù)據(jù);(4)改正信息行列頭中的數(shù)據(jù),如行列中的信息數(shù)、字節(jié)總數(shù)等。最后,喚醒等候信息的進(jìn)度。4.msgrcv()函數(shù)頭文件:#include#include#include函數(shù)原型:intmsgrcv(intmsqid,void*msgp,intmsgsz,longmsgtyp,intmsgflg);函數(shù)說明:msgrcv()函數(shù)用來接收一信息。從指定的信息行列中接收指定種類的信息。此中,msgqid,msgp,msgsz,msgflg與msgsnd中的對應(yīng)參數(shù)相像,m

35、sgtyp是規(guī)定要讀的信息種類,msgflg規(guī)定假如該行列無信息,系統(tǒng)內(nèi)核應(yīng)做的操作,是控制函數(shù)行為的標(biāo)記,取值能夠是:0,表示忽視;IPC_NOWAIT,假如信息行列為空,則返回一個(gè)ENOMSG,并將控制權(quán)交回調(diào)用函數(shù)的進(jìn)度。假如不指定這個(gè)參數(shù),那么進(jìn)度將被擁堵直到函數(shù)能夠從行列中獲得符合條件的信息為止。這樣時(shí)設(shè)置了IPC_NOWAIT標(biāo)記,則立刻返回,若在flag中設(shè)置了MS_NOERROR,且所接收的信息大于size,則系統(tǒng)內(nèi)核截?cái)嗨邮盏男畔ⅰτ趍sgrcv系統(tǒng)調(diào)用,系統(tǒng)內(nèi)核須完成下述工作:(1)抵信息行列的描繪符和贊成權(quán)等進(jìn)行檢查。若合法,就往下履行;不然返回;(2)依據(jù)msgty

36、p的不同樣分紅三種狀況辦理:msgtyp=0,接收該行列的第一個(gè)信息,并將它返回給調(diào)用者;msgtyp為正整數(shù),接收種類type的第一個(gè)信息;-17-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書msgtyp為負(fù)整數(shù),接收小于等于type絕對值的最低種類的第一個(gè)信息。(3)當(dāng)所返回信息大小等于或小于用戶的懇求時(shí),系統(tǒng)內(nèi)核便將信息正文拷貝到用戶區(qū),并從信息行列中刪除此信息,此后喚醒睡眠的發(fā)送進(jìn)度。但假如信息長度比用戶要求的大時(shí),則做犯錯(cuò)返回。5.msgctl()函數(shù)頭文件:#include#include#include函數(shù)原型:intmsgctl(intmsgqid,intcmd,structmsqid_ds*buf);

37、函數(shù)說明:系統(tǒng)調(diào)用msgctl()用來控制抵信息行列的操作。此中,函數(shù)調(diào)用成功時(shí)返回0,不可以功則返回-1。buf是用戶緩沖區(qū)地點(diǎn),供用戶寄存控制參數(shù)和查問結(jié)果;cmd是規(guī)定的命令。命令可分三類:(1)IPC_STAT。查問相關(guān)信息行列狀況的命令。如查問行列中的信息數(shù)量、行列中的最大字節(jié)數(shù)、最后一個(gè)發(fā)送信息的進(jìn)度表記符、發(fā)送時(shí)間等;(2)IPC_SET。按buf指向的構(gòu)造中的值,設(shè)置和改變相關(guān)信息行列屬性的命令。如改變信息行列的用戶表記符、信息行列的贊成權(quán)等;(3)IPC_RMID。除去信息行列的表記符。msgqid_ds構(gòu)造定義以下:structmsgqid_dsstructipc_perm

38、msg_perm;/*贊成權(quán)構(gòu)造*/shortpad17;/*由系統(tǒng)使用*/ushortmsg_qnum;/*行列上信息數(shù)*/ushortmsg_qbytes;/*行列上最大字節(jié)數(shù)*/ushortmsg_lspid;/*最后發(fā)送信息的PID*/ushortmsg_lrpid;/*最后接收信息的PID*/time_tmsg_stime;/*最后發(fā)送信息的時(shí)間*/time_tmsg_rtime;/*最后接收信息的時(shí)間*/time_tmsg_ctime;/*最后改正時(shí)間*/;structipc_permushortuid;/*目前用戶*/ushortgid;/*目行進(jìn)度組*/ushortcuid;/

39、*創(chuàng)立用戶*/ushortcgid;/*創(chuàng)立進(jìn)度組*/ushortmode;/*存取贊成權(quán)*/shortpid1;longpad2;/*由系統(tǒng)使用*/樣例程序-18-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書/client_ex.c發(fā)送端#include#include#include#include#include#defineMSGKEY75structmsgformlongmtype;charmtext1024;msg;intmsgqid;voidclient()msgqid=msgget(MSGKEY,0777);/*翻開75#信息行列*/msg.mtype=1;msg.mtext1=a;printf(cli

40、ent)sentn);msgsnd(msgqid,&msg,1024,0);/*發(fā)送信息*/exit(0);intmain()client();/server_ex.c接收端#include#include#include#include#include#defineMSGKEY75structmsgformlongmtype;charmtext1024;msg;intmsgqid;voidserver()msgqid=msgget(MSGKEY,0777|IPC_CREAT);/*創(chuàng)立75#信息行列*/msgrcv(msgqid,&msg,1024,0,0);/*接收信息*/printf(%

41、c,msg.mtextmsg.mtype);-19-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書printf(server)receivedn);msgctl(msgqid,IPC_RMID,0);/*刪除信息行列,送還資源*/exit(0);intmain()server();任務(wù)二使用共享儲蓄區(qū)通訊實(shí)驗(yàn)基本源理共享儲蓄區(qū)(ShareMemory)是UNIX系統(tǒng)中通訊速度最高的一種通訊系統(tǒng)。該系統(tǒng)可使若干進(jìn)度共享主存中的某一個(gè)地區(qū),且使該地區(qū)出現(xiàn)(照耀)在多個(gè)進(jìn)度的虛地點(diǎn)空間中。另一方面,一個(gè)進(jìn)度的虛地點(diǎn)空間中又可連結(jié)多個(gè)共享儲蓄區(qū),每個(gè)共享儲蓄區(qū)都有自己的名字。當(dāng)進(jìn)度間欲利用共享儲蓄區(qū)進(jìn)行通訊時(shí),必然先在主存中成立

42、一共享儲蓄區(qū),此后將它附接到自己的虛地點(diǎn)空間上。此后,進(jìn)度對該區(qū)的接見操作,與對其虛地點(diǎn)空間的其余部分的操作完滿同樣。進(jìn)度之間即可經(jīng)過對共享儲蓄區(qū)中數(shù)據(jù)的讀、寫來進(jìn)行直接通訊。圖4.1列出二個(gè)進(jìn)度經(jīng)過共享一個(gè)共享儲蓄區(qū)來進(jìn)行通訊的例子。此中,進(jìn)度A將成立的共享儲蓄區(qū)附接到自己的AA地區(qū),進(jìn)度B將它附接到自己的BB地區(qū)。進(jìn)度A的虛空間內(nèi)存地點(diǎn)進(jìn)度B的虛空間正文正文數(shù)據(jù)數(shù)據(jù)AB共享存A儲區(qū)B棧棧圖4.1共享儲蓄區(qū)應(yīng)該指出,共享儲蓄區(qū)系統(tǒng)只為進(jìn)度供給了用于實(shí)現(xiàn)通訊的共享儲蓄區(qū)和對共享儲蓄區(qū)進(jìn)行操作的手段,但是并未供給對該區(qū)進(jìn)行互斥接見及進(jìn)度同步的舉措。因此當(dāng)用戶需要使用該系統(tǒng)時(shí),必然自己設(shè)置同步和互

43、斥舉措才能保證明現(xiàn)正確的通訊。2.shmget()函數(shù)頭文件:#include#include#include-20-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書函數(shù)原型:intshmget(key_tkey,size_tsize,intshmflg);函數(shù)說明:獲得一個(gè)共享內(nèi)存表記符或創(chuàng)立一個(gè)共享內(nèi)存對象并返回共享內(nèi)存表記符。此中,key是共享儲蓄區(qū)的名字;size是其大?。ㄒ宰止?jié)計(jì));shmflg是用戶設(shè)置的標(biāo)記,如IPC_CREAT。IPC_CREAT表示若系統(tǒng)中還沒有指名的共享儲蓄區(qū),則由系統(tǒng)內(nèi)核成立一個(gè)共享儲藏區(qū);若系統(tǒng)中已有共享儲蓄區(qū),便忽視IPC_CREAT,并返回此共享內(nèi)存的表記符。在shmflg標(biāo)記中

44、還能夠夠有存取權(quán)限控制符。這類控制符的意義和文件系統(tǒng)中的權(quán)限控制符是近似的。3.shmat()函數(shù)頭文件:#include#include#include函數(shù)原型:void*shmat(intshmid,constvoid*shmaddr,intshmflg);函數(shù)說明:把共享內(nèi)存區(qū)對象照耀到調(diào)用進(jìn)度的地點(diǎn)空間,系統(tǒng)調(diào)用的返回值是共享儲蓄區(qū)所附接到的進(jìn)度虛地點(diǎn)。連結(jié)共享內(nèi)存表記符為shmid的共享內(nèi)存,連結(jié)成功后把共享內(nèi)存區(qū)對象照耀到調(diào)用進(jìn)度的地點(diǎn)空間,隨后可像當(dāng)?shù)乜臻g同樣訪問。此中,shmid是共享儲蓄區(qū)的表記符;shmaddr是用戶給定的,將共享儲蓄區(qū)附接到進(jìn)度的虛地點(diǎn)空間;shmflg規(guī)

45、定共享儲蓄區(qū)的讀、寫權(quán)限,以及系統(tǒng)能否應(yīng)付用戶規(guī)定的地點(diǎn)做舍入操作。其值為SHM_RDONLY時(shí),表示只好讀;其值為0時(shí),表示可讀、可寫;其值為SHM_RND(取整)時(shí),表示操作系統(tǒng)在必需時(shí)舍去這個(gè)地點(diǎn)。4.shmdt()函數(shù)頭文件:#include#include#include函數(shù)原型:intshmdt(constvoid*shmaddr);函數(shù)說明:與shmat函數(shù)相反,是用來斷開與共享內(nèi)存附帶點(diǎn)的地點(diǎn),嚴(yán)禁本進(jìn)度接見此共享內(nèi)存。此中,shmaddr是要斷開連結(jié)的虛地點(diǎn),亦即從前由連結(jié)的系統(tǒng)調(diào)用shmat()所返回的虛地點(diǎn)。調(diào)用成功時(shí),返回0值,調(diào)用不可以功,返回-1。本函數(shù)調(diào)用其實(shí)不刪

46、除所指定的共享內(nèi)存區(qū),而但是將先前用shmat函數(shù)連結(jié)(attach)好的共享內(nèi)存走開(detach)目前的進(jìn)度。5.shctl()函數(shù)-21-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書頭文件:#include#include#include函數(shù)原型:intshmctl(intshmid,intcmd,structshmid_ds*buf);函數(shù)說明:系統(tǒng)調(diào)用shmctl()用來控制對共享儲蓄區(qū)的操作,對其狀態(tài)信息進(jìn)行讀取和改正。此中,shmid是共享儲蓄區(qū)的表記符,buf是用戶緩沖區(qū)地點(diǎn),cmd是操作命令。命令可分為多各樣類:(1)用于查問相關(guān)共享儲蓄區(qū)的狀況。如其長度、目前連結(jié)的進(jìn)度數(shù)、共享區(qū)的創(chuàng)立者表記符等;(

47、2)用于設(shè)置或改變共享儲蓄區(qū)的屬性。如共享儲蓄區(qū)的贊成權(quán)、目前連結(jié)的進(jìn)度計(jì)數(shù)等;(3)對共享儲蓄區(qū)的加鎖和解鎖命令;(4)刪除共享儲蓄區(qū)表記符等。上述的查問是將shmid所指示的數(shù)據(jù)構(gòu)造中的相關(guān)成員,放入所指示的緩沖區(qū)中;而設(shè)置是用由buf所指示的緩沖區(qū)內(nèi)容來設(shè)置由shmid所指示的數(shù)據(jù)構(gòu)造中的相應(yīng)成員。cmd有以下幾種數(shù)值:IPC_STAT:獲得共享內(nèi)存的狀態(tài),把共享內(nèi)存的shmid_ds構(gòu)造復(fù)制到buf中;IPC_SET:改變共享內(nèi)存的狀態(tài),把buf所指的shmid_ds構(gòu)造中的uid、gid、mode復(fù)制到共享內(nèi)存的shmid_ds構(gòu)造內(nèi);IPC_RMID:刪除這片共享內(nèi)存樣例程序/cl

48、ient_ex.c發(fā)送端#include#include#include#include#include#defineSHMKEY75intshmid,i;int*addr;voidclient()inti;shmid=shmget(SHMKEY,1024,0777);/*翻開共享儲蓄區(qū)*/addr=shmat(shmid,0,0);/*獲得共享儲蓄區(qū)首地點(diǎn)*/while(*addr!=-1);printf(client)sentn);*addr=100;-22-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書exit(0);intmain()client();/server_ex.c接收端#include#include

49、#include#include#include#defineSHMKEY75intshmid,i;int*addr;voidserver()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);/*創(chuàng)立共享儲蓄區(qū)*/addr=shmat(shmid,0,0);/*獲得首地點(diǎn)*/*addr=-1;while(*addr=-1);printf(%d,*addr);printf(server)receivedn);shmctl(shmid,IPC_RMID,0);/*取消共享儲蓄區(qū),送還資源*/exit(0);intmain()server();四、實(shí)驗(yàn)內(nèi)容1.依據(jù)信息

50、傳達(dá)機(jī)理,使用系統(tǒng)調(diào)用msgget(),msgsnd(),msgrev(),及msgctl()編制一長度為k的信息發(fā)送和接收的程序,要求在程序中完成10次信息的發(fā)送和接收,每次發(fā)送信息結(jié)束和接收信息結(jié)束都需給出相應(yīng)的屏幕提示,且每次發(fā)送的的內(nèi)容好多于一個(gè)字符,并能在接收端輸出。依據(jù)共享儲蓄區(qū)原理,使用系統(tǒng)調(diào)用shmget(),shmat(),shmdt(),及shctl()編制程序,要求創(chuàng)立一個(gè)長度為k的共享儲蓄區(qū),并完成10次數(shù)據(jù)的發(fā)送和接收,每次發(fā)送數(shù)據(jù)結(jié)束和接收數(shù)據(jù)結(jié)束都需給出相應(yīng)的屏幕提示,且每次發(fā)送的的數(shù)據(jù)應(yīng)能在接收端輸出。五、實(shí)驗(yàn)報(bào)告要求列出實(shí)驗(yàn)內(nèi)容所要求的程序清單,并以截圖形式記

51、錄相應(yīng)運(yùn)轉(zhuǎn)結(jié)果。對實(shí)驗(yàn)運(yùn)轉(zhuǎn)結(jié)果進(jìn)行分析:試比較實(shí)驗(yàn)中兩種方法實(shí)現(xiàn)進(jìn)度通訊的不同樣之處。-23-操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書實(shí)驗(yàn)項(xiàng)目五儲蓄管理一、實(shí)驗(yàn)種類本實(shí)驗(yàn)為考證性實(shí)驗(yàn)。二、實(shí)驗(yàn)?zāi)康氖炝?xí)內(nèi)存安閑分區(qū)的分派方式;理解動向分區(qū)儲蓄管理方式;掌握動向分區(qū)的分派與回收的過程。三、實(shí)驗(yàn)預(yù)備知識實(shí)驗(yàn)基本源理使用一個(gè)鏈表來模擬內(nèi)儲藏藏空間,成立內(nèi)存塊來記錄內(nèi)存分派使用狀況,經(jīng)過隨機(jī)產(chǎn)生進(jìn)度及其所需要的內(nèi)存來模擬真切的進(jìn)度。經(jīng)過給進(jìn)度分派內(nèi)存及回收來實(shí)現(xiàn)對動向不等長儲蓄管理方法。實(shí)驗(yàn)中使用的數(shù)據(jù)構(gòu)造(1)內(nèi)存塊結(jié)點(diǎn)包含參數(shù)進(jìn)度名name;初步地點(diǎn)address;長度length;標(biāo)記flag,表示該塊能否被分派。2)為簡單起見,只設(shè)內(nèi)存分派記錄鏈表數(shù)據(jù)構(gòu)造,

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論