合肥師范學(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、操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書操作系統(tǒng)課程組編著計(jì)算機(jī)科學(xué)與技術(shù)系目 錄前言- 1 -實(shí)驗(yàn)項(xiàng)目一 熟悉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)目五 存儲(chǔ)管理- 24 -前言操作系統(tǒng)是計(jì)算機(jī)本科各專業(yè)的專業(yè)核心課程,其實(shí)踐性、應(yīng)用性很強(qiáng),實(shí)驗(yàn)教學(xué)環(huán)節(jié)是必不可少的一個(gè)重要環(huán)節(jié)。通過操作系統(tǒng)實(shí)驗(yàn)部分教學(xué),使學(xué)生加深理解和更好的掌握操作系統(tǒng)的基本原理、技術(shù)和方法,鞏固所學(xué)理論知識,激發(fā)實(shí)驗(yàn)興趣,掌握實(shí)驗(yàn)要領(lǐng),培養(yǎng)對操作系統(tǒng)理論課程所學(xué)知識融會(huì)貫通和綜合運(yùn)用的能力。通過實(shí)驗(yàn),使學(xué)生深入了解和熟練掌握Li

2、nux操作系統(tǒng)的使用,及在Linux操作系統(tǒng)下進(jìn)行程序設(shè)計(jì)開發(fā)的方法,掌握操作系統(tǒng)中進(jìn)程管理、進(jìn)程調(diào)度、進(jìn)程通信和存儲(chǔ)管理的方法,使學(xué)生具有初步分析實(shí)際操作系統(tǒng)的能力,為今后學(xué)習(xí)使用其它的程序設(shè)計(jì)環(huán)境和語言打好基礎(chǔ)。為了收到良好的實(shí)驗(yàn)效果,編寫這本實(shí)驗(yàn)指導(dǎo)書。在指導(dǎo)書中,每一個(gè)實(shí)驗(yàn)均按照該課程實(shí)驗(yàn)大綱的要求編寫,力求緊扣理論知識點(diǎn)、突出設(shè)計(jì)方法、明確設(shè)計(jì)思路,通過多種形式完成實(shí)驗(yàn)任務(wù),最終引導(dǎo)學(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)行一定的分析和講解,學(xué)生進(jìn)行預(yù)習(xí),提前設(shè)計(jì)實(shí)驗(yàn)方案,之后進(jìn)入實(shí)驗(yàn)室進(jìn)行實(shí)驗(yàn);實(shí)驗(yàn)中,要求學(xué)生按照實(shí)驗(yàn)要求進(jìn)行實(shí)

3、驗(yàn),認(rèn)真完成每個(gè)實(shí)驗(yàn)項(xiàng)目的具體內(nèi)容,指導(dǎo)教師全程指導(dǎo)協(xié)調(diào)實(shí)驗(yàn)進(jìn)行,對于實(shí)驗(yàn)中學(xué)生所提問題進(jìn)行具體解答;實(shí)驗(yàn)后,學(xué)生應(yīng)當(dāng)及時(shí)總結(jié)實(shí)驗(yàn)過程,并按照實(shí)際情況對實(shí)驗(yàn)報(bào)告進(jìn)行填寫,能對在實(shí)驗(yàn)過程中發(fā)生的問題及時(shí)分析并找到解決方案,提交實(shí)驗(yàn)報(bào)告;指導(dǎo)教師需要對實(shí)驗(yàn)報(bào)告進(jìn)行認(rèn)真批閱,并根據(jù)需要選取重點(diǎn)內(nèi)容進(jìn)行點(diǎn)評分析。實(shí)驗(yàn)項(xiàng)目一 熟悉LINUX基本命令及編程環(huán)境一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為驗(yàn)證性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康呐c任務(wù)1. 熟悉Linux操作系統(tǒng)的安裝和使用;熟悉使用Linux字符界面,窗口系統(tǒng)的常用命令。2. 掌握運(yùn)用Linux常用的編程工具;掌握如何編輯、編譯、運(yùn)行程序。三、 實(shí)驗(yàn)準(zhǔn)備1. 熟悉linux系

4、統(tǒng)中常用命令及其功能2. 熟悉vi編輯器或Gedit編輯器的各項(xiàng)功能3. 復(fù)習(xí)C語言程序的編寫。四、 實(shí)驗(yàn)內(nèi)容1. 練習(xí)使用Gedit編輯器使用Gedit編輯器用C語言編寫一個(gè)HelloWorld程序,并保存。具體操作:點(diǎn)擊“任務(wù)欄位置主文件夾”,打開主文件夾位置文件瀏覽器,空白處右鍵單擊,彈出菜單選擇“創(chuàng)建文檔空文件”,新建一個(gè)空文件,并命名為“hello.c”,右鍵單擊“hello.c”,選擇“使用Gedit打開”,在Gedit編輯器中編輯代碼如下:#include<stdio.h>int main() printf("Hello,Wrold!n");編輯完

5、成后,點(diǎn)擊“保存”,保存文件。2. 使用gcc編譯源程序。gcc是linux下的一種c程序編譯工具,使用方法如下:編譯: gcc -o filename1 filename.c(或者gcc filename.c -o filename1),其中: filename.c是源文件名,filename1 是目標(biāo)文件名,o代表object具體操作:點(diǎn)擊“任務(wù)欄應(yīng)用程序附件終端”,當(dāng)前默認(rèn)路徑即為主文件夾,輸入“gcc hello.c -o hello”,回車運(yùn)行后,若無任何提示,怎說明編譯成功,已生成可執(zhí)行文件“hello“,若提示有錯(cuò)誤,則根據(jù)具體提示回到Gedit中修改源程序,保存后重新編譯。3.

6、 執(zhí)行程序執(zhí)行:./filenamel 其中: filename1 是目標(biāo)文件名。具體操作:在“終端”中輸入“./hello”,回車后運(yùn)行,若無錯(cuò)誤,終端中將顯示運(yùn)行結(jié)果“Hello,Wrold!”。五、 注意事項(xiàng)1. gcc編譯器不能編譯不帶擴(kuò)展名的c語言程序。2. 注意編譯和運(yùn)行程序的基本過程。3. 重新編輯源程序后,必須重新編譯,才會(huì)生成新的可執(zhí)行程序。實(shí)驗(yàn)項(xiàng)目二 進(jìn)程管理一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為驗(yàn)證性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康?. 理解進(jìn)程的概念,掌握父、子進(jìn)程創(chuàng)建的方法。2. 認(rèn)識和了解并發(fā)執(zhí)行的實(shí)質(zhì),掌握進(jìn)程的并發(fā)及同步操作。三、 實(shí)驗(yàn)預(yù)備知識1. fork()函數(shù)頭文件:#include

7、<unistd.h>#include<sys/types.h>函數(shù)原型:pid_t fork( void);(pid_t 是一個(gè)宏定義,其實(shí)質(zhì)是int,被定義在#include<sys/types.h>中)返回值: 若成功調(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)程(child process)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程

8、數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)程持有的是上述存儲(chǔ)空間的“副本”,這意味著父子進(jìn)程間不共享這些存儲(chǔ)空間。linux將復(fù)制父進(jìn)程的地址空間內(nèi)容給子進(jìn)程,因此,子進(jìn)程有了獨(dú)立的地址空間。為什么fork會(huì)返回兩次?由于在復(fù)制時(shí)復(fù)制了父進(jìn)程的堆棧段,所以兩個(gè)進(jìn)程都停留在fork函數(shù)中,等待返回。因?yàn)閒ork函數(shù)會(huì)返回兩次,一次是在父進(jìn)程中返回,另一次是在子進(jìn)程中返回,這兩次的返回值是不一樣的,過程如圖2.1。調(diào)用fork之后,數(shù)據(jù)、堆棧有兩份,代碼仍然為一份但是這個(gè)代碼段成為兩個(gè)進(jìn)程的共享代碼段都從fork函數(shù)中返回,箭頭表示各自的執(zhí)行處。當(dāng)父子進(jìn)程有一個(gè)想要修改代碼段時(shí),兩個(gè)進(jìn)程真正分裂。圖

9、2.1 fork()函數(shù)分裂示意圖示例代碼:#include<sys/types.h> /對于此程序而言此頭文件用不到#include<unistd.h>#include<stdio.h>int main(int argc, char * argv )int pid = fork();if (pid < 0)printf("error!");else if( pid = = 0 )printf("This is the child process!&qu

10、ot;);else printf("This is the parent process! child process id = %d", pid);return 0;fork函數(shù)的特點(diǎn)概括起來就是“調(diào)用一次,返回兩次”,在父進(jìn)程中調(diào)用一次,在父進(jìn)程和子進(jìn)程中各返回一次。fork的另一個(gè)特性是所有由父進(jìn)程打開的描述符都被復(fù)制到子進(jìn)程中。父、子進(jìn)程中相同編號的文件描述符在內(nèi)核中指向同一個(gè)file結(jié)構(gòu)體,也就是說,file結(jié)構(gòu)體的引用計(jì)數(shù)要增加。2. wait()函數(shù)頭文件:#include<sys/types.h>#include<sys/wait

11、.h>函數(shù)原型:pid_t wait (int * status);返回值:如果執(zhí)行成功則返回子進(jìn)程識別碼(PID),如果有錯(cuò)誤發(fā)生則返回-1。函數(shù)說明:wait()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號來到或子進(jìn)程結(jié)束。如果在調(diào)用wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status 返回,而子進(jìn)程的進(jìn)程識別碼也會(huì)一起返回。如果不在意結(jié)束狀態(tài)值,則參數(shù)status 可以設(shè)成NULL。子進(jìn)程的結(jié)束狀態(tài)值請參考下面的waitpid()。示例代碼:#include<stdlib.h>#include<unistd.h&g

12、t;#include<sys/types.h>#include<sys/wait.h>int main(int argc, char * argv)pid_t pid;int status,i;if(fork()= =0)printf("This is the child process .pid =%dn",getpid();exit(5);elsesleep(1);printf("This is the parent process ,wait for child.n");pid=wait(&am

13、p;status);i=WEXITSTATUS(status);printf("childs pid =%d .exit status=%dn",pid , i);3. waitpid()函數(shù)頭文件:#include<sys/types.h>#include<sys/wait.h>函數(shù)原型:pid_t waitpid(pid_t pid,int * status,int options);返回值:如果執(zhí)行成功則返回子進(jìn)程識別碼(PID),如果有錯(cuò)誤發(fā)生則返回-1。函數(shù)說明:waitpid()會(huì)暫時(shí)停止目前進(jìn)程的執(zhí)行,直到有信號來到或子進(jìn)程結(jié)束。如果在

14、調(diào)用wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status 返回,而子進(jìn)程的進(jìn)程識別碼也會(huì)一快返回。如果不在意結(jié)束狀態(tài)值,則參數(shù)status 可以設(shè)成NULL。參數(shù)pid 為欲等待的子進(jìn)程識別碼,其他數(shù)值意義如下:pid<-1 等待進(jìn)程組識別碼為pid 絕對值的任何子進(jìn)程。pid=-1 等待任何子進(jìn)程,相當(dāng)于wait()。pid=0 等待進(jìn)程組識別碼與目前進(jìn)程相同的任何子進(jìn)程。pid>0 等待任何子進(jìn)程識別碼為pid 的子進(jìn)程。參數(shù)option 可以為0 或下面的組合:WNOHANG 如果沒有任何已經(jīng)結(jié)束的子進(jìn)程則馬

15、上返回,不予以等待。WUNTRACED 如果子進(jìn)程進(jìn)入暫停執(zhí)行情況則馬上返回,但結(jié)束狀態(tài)不予以理會(huì)。子進(jìn)程的結(jié)束狀態(tài)返回后存于status,底下有幾個(gè)宏可判別結(jié)束情況:WIFEXITED(status)如果子進(jìn)程正常結(jié)束則為非0 值。WEXITSTATUS(status)取得子進(jìn)程exit()返回的結(jié)束代碼,一般會(huì)先用WIFEXITED 來判斷是否正常結(jié)束才能使用此宏。WIFSIGNALED(status)如果子進(jìn)程是因?yàn)樾盘柖Y(jié)束則此宏值為真。WTERMSIG(status)取得子進(jìn)程因信號而中止的信號代碼,一般會(huì)先用WIFSIGNALED 來判斷后才使用此宏。WIFSTOPPED(stat

16、us)如果子進(jìn)程處于暫停執(zhí)行情況則此宏值為真。一般只有使用WUNTRACED 時(shí)才會(huì)有此情況。WSTOPSIG(status)取得引發(fā)子進(jìn)程暫停的信號代碼,一般會(huì)先用WIFSTOPPED 來判斷后才使用此宏。4. exit()函數(shù)頭文件:#include< stdlib.h >函數(shù)原型:void exit(int status);返回值:無。函數(shù)說明:進(jìn)程結(jié)束正常終止,返回結(jié)束狀態(tài)。status為進(jìn)程結(jié)束狀態(tài),是返回給父進(jìn)程的一個(gè)整數(shù),以備查考。為了及時(shí)回收進(jìn)程所占用的資源并減少父進(jìn)程的干預(yù),UNIX/LINUX利用exit( )來實(shí)現(xiàn)進(jìn)程的自我終止,通常父進(jìn)程在創(chuàng)建子進(jìn)程時(shí),應(yīng)在

17、進(jìn)程的末尾安排一條exit( ),使子進(jìn)程自我終止。exit(0)表示進(jìn)程正常終止,exit(1)表示進(jìn)程運(yùn)行有錯(cuò),異常終止。如果調(diào)用進(jìn)程在執(zhí)行exit( )時(shí),其父進(jìn)程正在等待它的終止,則父進(jìn)程可立即得到其返回的整數(shù)。核心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫記帳信息(4)置進(jìn)程為“僵死狀態(tài)”四、 實(shí)驗(yàn)內(nèi)容1. 編寫一C語言程序,實(shí)現(xiàn)在程序運(yùn)行時(shí)通過系統(tǒng)調(diào)用fork( )創(chuàng)建兩個(gè)子進(jìn)程,使父、子三進(jìn)程并發(fā)執(zhí)行,父親進(jìn)程執(zhí)行時(shí)屏幕顯示“I am father”,兒子進(jìn)程執(zhí)行時(shí)屏幕顯示“I am son”,女兒進(jìn)程執(zhí)行時(shí)屏幕顯示“I am daughter”。2.

18、 多次連續(xù)反復(fù)運(yùn)行這個(gè)程序,觀察屏幕顯示結(jié)果的順序,直至出現(xiàn)不一樣的情況為止。記下這種情況,試簡單分析其原因。3. 修改程序,在父、子進(jìn)程中分別使用wait()、exit()等系統(tǒng)調(diào)用“實(shí)現(xiàn)”其同步推進(jìn),并獲取子進(jìn)程的ID號及結(jié)束狀態(tài)值。多次反復(fù)運(yùn)行改進(jìn)后的程序,觀察并記錄運(yùn)行結(jié)果。五、 實(shí)驗(yàn)報(bào)告要求1. 列出實(shí)驗(yàn)內(nèi)容1、3各程序清單,并以截圖形式記錄相應(yīng)運(yùn)行結(jié)果。2. 對實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析:1)實(shí)驗(yàn)內(nèi)容1運(yùn)行結(jié)果為什么無固定順序,fork()函數(shù)創(chuàng)建進(jìn)程是如何并發(fā)執(zhí)行的。2)實(shí)驗(yàn)內(nèi)容3是如何實(shí)現(xiàn)父子進(jìn)程的同步執(zhí)行的。實(shí)驗(yàn)項(xiàng)目三 進(jìn)程調(diào)度一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為驗(yàn)證性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康?.

19、理解進(jìn)程控制塊和進(jìn)程組織方式;2. 掌握時(shí)間片輪轉(zhuǎn)調(diào)度算法實(shí)現(xiàn)處理機(jī)調(diào)度。三、 實(shí)驗(yàn)預(yù)備知識1. 實(shí)驗(yàn)基本原理進(jìn)程控制塊通過鏈表隊(duì)列的方式組織起來,系統(tǒng)中存在運(yùn)行隊(duì)列和就緒隊(duì)列(為簡單起見,不設(shè)阻塞隊(duì)列),進(jìn)程的調(diào)度就是進(jìn)程控制塊在運(yùn)行隊(duì)列和就緒隊(duì)列之間的切換。當(dāng)需要調(diào)度時(shí),從就緒隊(duì)列中挑選一個(gè)進(jìn)程占用處理機(jī),即從就緒隊(duì)列中刪除一個(gè)進(jìn)程,插入到運(yùn)行隊(duì)列中,當(dāng)占用處理機(jī)的進(jìn)程運(yùn)行的時(shí)間片完成后,放棄處理機(jī),即在運(yùn)行隊(duì)列中的進(jìn)程控制塊經(jīng)過一段時(shí)間(時(shí)間片)后,從該隊(duì)列上刪除,如果該進(jìn)程運(yùn)行完畢,則刪除該進(jìn)程(節(jié)點(diǎn));否則,則插入到就緒隊(duì)列中。2. 實(shí)驗(yàn)中使用的數(shù)據(jù)結(jié)構(gòu)(1) PCB進(jìn)程控制塊內(nèi)容包

20、括參數(shù)進(jìn)程名name;要求運(yùn)行時(shí)間 runtime;已運(yùn)行時(shí)間runedtime;本輪運(yùn)行時(shí)間killtime。(2) 進(jìn)程隊(duì)列為簡單起見,只設(shè)運(yùn)行隊(duì)列,就緒隊(duì)列兩種數(shù)據(jù)結(jié)構(gòu),進(jìn)程的調(diào)度在這兩個(gè)隊(duì)列中切換,如圖3.1所示。圖3.1 PCB鏈表3. rand()函數(shù)和srand()函數(shù)庫函數(shù)中系統(tǒng)提供了兩個(gè)函數(shù)用于產(chǎn)生隨機(jī)數(shù):srand()和rand()。 函數(shù)一:int rand(void);從srand (seed)中指定的seed開始,返回一個(gè)0,RAND_MAX(0x7fff)間的隨機(jī)整數(shù)。函數(shù)二:void srand(unsigned seed);參數(shù)seed是rand()的種子,用來

21、初始化rand()的起始值。函數(shù)rand()是真正的隨機(jī)數(shù)生成器,而srand()會(huì)設(shè)置供rand()使用的隨機(jī)數(shù)種子。如果你在第一次調(diào)用rand()之前沒有調(diào)用srand(),那么系統(tǒng)會(huì)為你自動(dòng)調(diào)用srand()。而使用同種子相同的數(shù)調(diào)用 srand()會(huì)導(dǎo)致相同的隨機(jī)數(shù)序列被生成。srand(unsigned)time(NULL)則使用系統(tǒng)定時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子。每個(gè)種子對應(yīng)一組根據(jù)算法預(yù)先生成的隨機(jī)數(shù),所以,在相同的平臺(tái)環(huán)境下,不同時(shí)間產(chǎn)生的隨機(jī)數(shù)會(huì)是不同的,相應(yīng)的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則無論何時(shí)運(yùn)行、運(yùn)行

22、多少次得到的“隨機(jī)數(shù)”都會(huì)是一組固定的序列,因此srand生成的隨機(jī)數(shù)是偽隨機(jī)數(shù)。但是,要注意的是所謂的“偽隨機(jī)數(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)到了事物的特性差異性;但是每種樹的葉子都有近似的形狀,這正是事物的共性規(guī)律性。從這個(gè)角度講,我們就可以接受這樣的事實(shí)了:計(jì)算機(jī)只能產(chǎn)生偽隨機(jī)數(shù)而不是絕對的隨機(jī)數(shù)。系統(tǒng)在調(diào)用rand()之前都會(huì)自動(dòng)調(diào)用srand(),如果用戶在rand()之前曾調(diào)

23、用過srand()給參數(shù)seed指定了一個(gè)值,那么 rand()就會(huì)將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(NULL)來 產(chǎn)生種子。如果仍然覺得時(shí)間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)后面乘上某個(gè)合適的整數(shù)。 例如,srand(unsigned)tim

24、e(NULL)*10)。另外,關(guān)于time_t time(0):time_t被定義為長整型,它返回從1970年1月1日零時(shí)零分零秒到目前為止所經(jīng)過的時(shí)間,單位為秒。srand()、rand()用法舉例:#include<time.h>#include<stdio.h>void main() int i,j; srand(10); /srand(int)time(0); for (i=0; i<10; i+) j = (int) (rand()%20; printf(" %dn ", j); 4. malloc()函數(shù)頭文件:#include&l

25、t;malloc.h>函數(shù)原型:void * malloc(unsigned int size);函數(shù)說明:其作用是在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)中分配一個(gè)長度為size的連續(xù)空間,此函數(shù)的值(即“返回值”)是一個(gè)指向分配域其實(shí)地址的指針(類型為void)。若此函數(shù)未能成功執(zhí)行則返回空指針。5. 程序流程圖圖3.2模擬進(jìn)程調(diào)度的流程圖6. 部分參考程序(1) PCB數(shù)據(jù)結(jié)構(gòu)struct PCB int name; int runtime;int runedtime; int killtime;struct PCB *next;typedef struct PCB PCB;(2) 創(chuàng)建就緒列表#def

26、ine LEN sizeof(PCB)PCB *runqueue;/運(yùn)行隊(duì)列指針PCB *top,*tail,*temp;/就緒隊(duì)列指針int i;srand(int)time(0);for(i=0;i<NUM;i+) temp=(PCB*)malloc(LEN); temp->name=i; temp->runtime=rand()%15; temp->runedtime=0; temp->next=NULL; temp->killtime=0; if(i=0) top=temp; tail=temp; else tail->next=temp; t

27、ail=temp; printf("process name %d, runtime=%d, runedtime=%d,killtime=%dn", tail->name,tail->runtime,tail->runedtime,tail->killtime); 7. 按時(shí)間片輪轉(zhuǎn)算法進(jìn)行進(jìn)程調(diào)度的過程描述。第1步:取就緒隊(duì)列的隊(duì)首結(jié)點(diǎn)為運(yùn)行隊(duì)列的結(jié)點(diǎn),修改就緒隊(duì)列隊(duì)首指針后移;第2步:調(diào)度運(yùn)行隊(duì)列結(jié)點(diǎn),即運(yùn)行隊(duì)列結(jié)點(diǎn)的要求運(yùn)行時(shí)間減去時(shí)間片時(shí)間;第3步:a若修改后要求運(yùn)行時(shí)間<=0,則表示該進(jìn)程結(jié)點(diǎn)運(yùn)行完畢,修改進(jìn)程結(jié)點(diǎn)的PCB信息,記錄r

28、untime,runedtime,killtime等信息。并將結(jié)點(diǎn)信息輸出。b否則,表示該進(jìn)程結(jié)點(diǎn)未完成,記錄runtime,runedtime,killtime等信息,將結(jié)點(diǎn)信息輸出。并將該結(jié)點(diǎn)置于就緒隊(duì)列的隊(duì)尾,等待下次調(diào)度,同時(shí)修改隊(duì)尾指針。第4步:若就緒隊(duì)列非空,則繼續(xù)執(zhí)行第1步,直至就緒隊(duì)列為空。四、 實(shí)驗(yàn)內(nèi)容1. 建立合理的PCB數(shù)據(jù)結(jié)構(gòu),建立含有8個(gè)進(jìn)程結(jié)點(diǎn)的就緒隊(duì)列,每個(gè)進(jìn)程的要求運(yùn)行時(shí)間隨機(jī)產(chǎn)生,要求每個(gè)進(jìn)程的要求運(yùn)行時(shí)間不大于15。2. 設(shè)置時(shí)間片大?。?6),使用時(shí)間片輪轉(zhuǎn)調(diào)度算法實(shí)現(xiàn)處理機(jī)調(diào)度。五、 實(shí)驗(yàn)報(bào)告要求1. 列出實(shí)驗(yàn)內(nèi)容所要求的程序清單,并以截圖形式記錄相應(yīng)運(yùn)

29、行結(jié)果;2. 對實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析:如果時(shí)間片設(shè)置值過大或過小,會(huì)對進(jìn)程的調(diào)度產(chǎn)生何種影響。實(shí)驗(yàn)項(xiàng)目四 進(jìn)程通信一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為綜合性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康?. 了解什么是消息,熟悉消息傳送原理。2. 了解和熟悉共享存儲(chǔ)機(jī)制。3. 掌握消息的發(fā)送與接收的實(shí)現(xiàn)方法。三、 實(shí)驗(yàn)預(yù)備知識任務(wù)一 消息的發(fā)送和接收1. 實(shí)驗(yàn)基本原理消息(message)是一個(gè)格式化的可變長的信息單元。消息機(jī)制允許由一個(gè)進(jìn)程給其它任意的進(jìn)程發(fā)送一個(gè)消息。當(dāng)一個(gè)進(jìn)程收到多個(gè)消息時(shí),可將它們排成一個(gè)消息隊(duì)列。消息使用兩種重要的數(shù)據(jù)結(jié)構(gòu):一是消息首部,其中記錄了一些與消息有關(guān)的信息,如消息數(shù)據(jù)的字節(jié)數(shù);二是消息隊(duì)列頭表,

30、其每一表項(xiàng)是作為一個(gè)消息隊(duì)列的消息頭,記錄了消息隊(duì)列的有關(guān)信息。消息機(jī)制的數(shù)據(jù)結(jié)構(gòu):struct msgform long mtype; char mtext1024;(1)消息首部記錄一些與消息有關(guān)的信息,如消息的類型、大小、指向消息數(shù)據(jù)區(qū)的指針、消息隊(duì)列的鏈接指針等。(2)消息隊(duì)列頭表其每一項(xiàng)作為一個(gè)消息隊(duì)列的消息頭,記錄了消息隊(duì)列的有關(guān)信息如指向消息隊(duì)列中第一個(gè)消息和指向最后一個(gè)消息的指針、隊(duì)列中消息的數(shù)目、隊(duì)列中消息數(shù)據(jù)的總字節(jié)數(shù)、隊(duì)列所允許消息數(shù)據(jù)的最大字節(jié)總數(shù),還有最近一次執(zhí)行發(fā)送操作的進(jìn)程標(biāo)識符和時(shí)間、最近一次執(zhí)行接收操作的進(jìn)程標(biāo)識符和時(shí)間等。(3)消息隊(duì)列的描述符UNIX中,每

31、一個(gè)消息隊(duì)列都有一個(gè)稱為關(guān)鍵字(key)的名字,是由用戶指定的;消息隊(duì)列有一消息隊(duì)列描述符,其作用與用戶文件描述符一樣,也是為了方便用戶和系統(tǒng)對消息隊(duì)列的訪問。2. msgget( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型:int msgget(key_t key, int msgflag);函數(shù)說明:創(chuàng)建一個(gè)消息,獲得一個(gè)消息的描述符。系統(tǒng)內(nèi)核將搜索消息隊(duì)列頭表,確定是否有指定名字的消息隊(duì)列。若無,系統(tǒng)內(nèi)核將分配一新的消息隊(duì)列頭,并對它進(jìn)行初始化,然后給用戶

32、返回一個(gè)消息隊(duì)列描述符,否則它只是檢查消息隊(duì)列的許可權(quán)便返回。系統(tǒng)調(diào)用格式:msgqid=msgget(key,flag)。其中:msgqid 是該系統(tǒng)調(diào)用返回的描述符,失敗則返回-1。msgget()函數(shù)的第一個(gè)參數(shù)是消息隊(duì)列對象的關(guān)鍵字(key),函數(shù)將它與已有的消息隊(duì)列對象的關(guān)鍵字進(jìn)行比較來判斷消息隊(duì)列對象是否已經(jīng)創(chuàng)建。而函數(shù)進(jìn)行的具體操作是由第二個(gè)參數(shù)msgflg 控制的。它可以取下面的幾個(gè)值:IPC_CREAT : 如果消息隊(duì)列對象不存在,則創(chuàng)建之,否則則進(jìn)行打開操作;IPC_EXCL: 和IPC_CREAT 一起使用(用”|”連接),如果消息對象不存在則創(chuàng)建之,否則產(chǎn)生一個(gè)錯(cuò)誤并返

33、回。 如果單獨(dú)使用IPC_CREAT 標(biāo)志,msgget()函數(shù)要么返回一個(gè)已經(jīng)存在的消息隊(duì)列對象的標(biāo)識符,要么返回一個(gè)新建立的消息隊(duì)列對象的標(biāo)識符。如果將IPC_CREAT 和IPC_EXCL標(biāo)志一起使用,msgget()將返回一個(gè)新建的消息對象的標(biāo)識符,或者返回-1。如果消息隊(duì)列對象已存在,IPC_EXCL 標(biāo)志本身并沒有太大的意義,但和IPC_CREAT 標(biāo)志一起使用可以用來保證所得的消息隊(duì)列對象是新創(chuàng)建的而不是打開的已有的對象。除了以上的兩個(gè)標(biāo)志以外,在msgflg 標(biāo)志中還可以有存取權(quán)限控制符。這種控制符的意義和文件系統(tǒng)中的權(quán)限控制符是類似的。3. msgsnd( )函數(shù)頭文件:#i

34、nclude<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型:int msgsnd(int msqid, const void *msgp, intt msgsz, int msgflg);函數(shù)說明:在消息隊(duì)列上進(jìn)行收發(fā)消息,為了發(fā)送消息,調(diào)用進(jìn)程對消息隊(duì)列進(jìn)行寫入時(shí)必須有寫權(quán)能。成功執(zhí)行時(shí)返回0,失敗時(shí)返回-1。其中msgqid是返回消息隊(duì)列的描述符;msgp是指向用戶消息緩沖區(qū)的一個(gè)結(jié)構(gòu)體指針。緩沖區(qū)中包括消息類型和消息正文,即 long mtype; /*消息類型*/ char mtext

35、; /*消息的文本*/ msgsz指示由msgp指向的數(shù)據(jù)結(jié)構(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)該消息隊(duì)列中的字節(jié)數(shù)超過最大值時(shí),或系統(tǒng)范圍的消息數(shù)超過某一最大值時(shí),調(diào)用msgsnd進(jìn)程睡眠。若是設(shè)置IPC_NOWAIT,則在此情況下,msgsnd立即返回。對于msgsnd( ),系統(tǒng)內(nèi)核須完成以下工作:(1)對消息隊(duì)列的描述符和許可權(quán)及消息長度等進(jìn)行檢查。若合法才繼續(xù)執(zhí)行,否則返回;(2)系統(tǒng)內(nèi)核為消息分配消息數(shù)

36、據(jù)區(qū)。將用戶消息緩沖區(qū)中的消息正文,拷貝到消息數(shù)據(jù)區(qū);(3)分配消息首部,并將它鏈入消息隊(duì)列的末尾。在消息首部中須填寫消息類型、消息大小和指向消息數(shù)據(jù)區(qū)的指針等數(shù)據(jù);(4)修改消息隊(duì)列頭中的數(shù)據(jù),如隊(duì)列中的消息數(shù)、字節(jié)總數(shù)等。最后,喚醒等待消息的進(jìn)程。4. msgrcv ( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型:int msgrcv(int msqid, void *msgp, int msgsz, long msgtyp, int msgflg);函數(shù)說

37、明:msgrcv ( )函數(shù)用來接收一消息。從指定的消息隊(duì)列中接收指定類型的消息。其中,msgqid,msgp,msgsz,msgflg與msgsnd中的對應(yīng)參數(shù)相似,msgtyp是規(guī)定要讀的消息類型,msgflg規(guī)定倘若該隊(duì)列無消息,系統(tǒng)內(nèi)核應(yīng)做的操作,是控制函數(shù)行為的標(biāo)志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息隊(duì)列為空,則返回一個(gè)ENOMSG,并將控制權(quán)交回調(diào)用函數(shù)的進(jìn)程。如果不指定這個(gè)參數(shù),那么進(jìn)程將被阻塞直到函數(shù)可以從隊(duì)列中得到符合條件的消息為止。如此時(shí)設(shè)置了IPC_NOWAIT標(biāo)志,則立即返回,若在flag中設(shè)置了MS_NOERROR,且所接收的消息大于size,則

38、系統(tǒng)內(nèi)核截?cái)嗨邮盏南?。對于msgrcv系統(tǒng)調(diào)用,系統(tǒng)內(nèi)核須完成下述工作:(1)對消息隊(duì)列的描述符和許可權(quán)等進(jìn)行檢查。若合法,就往下執(zhí)行;否則返回;(2)根據(jù)msgtyp的不同分成三種情況處理:msgtyp=0,接收該隊(duì)列的第一個(gè)消息,并將它返回給調(diào)用者;msgtyp為正整數(shù),接收類型type的第一個(gè)消息;msgtyp為負(fù)整數(shù),接收小于等于type絕對值的最低類型的第一個(gè)消息。(3)當(dāng)所返回消息大小等于或小于用戶的請求時(shí),系統(tǒng)內(nèi)核便將消息正文拷貝到用戶區(qū),并從消息隊(duì)列中刪除此消息,然后喚醒睡眠的發(fā)送進(jìn)程。但如果消息長度比用戶要求的大時(shí),則做出錯(cuò)返回。5. msgctl ( )函數(shù)頭文件:#i

39、nclude<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>函數(shù)原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );函數(shù)說明:系統(tǒng)調(diào)用msgctl ( )用來控制對消息隊(duì)列的操作。其中,函數(shù)調(diào)用成功時(shí)返回0,不成功則返回-1。buf是用戶緩沖區(qū)地址,供用戶存放控制參數(shù)和查詢結(jié)果;cmd是規(guī)定的命令。命令可分三類:(1)IPC_STAT。查詢有關(guān)消息隊(duì)列情況的命令。如查詢隊(duì)列中的消息數(shù)目、隊(duì)列中的最大字節(jié)數(shù)、最后一個(gè)發(fā)送消息的進(jìn)程標(biāo)識符、發(fā)

40、送時(shí)間等;(2)IPC_SET。按buf指向的結(jié)構(gòu)中的值,設(shè)置和改變有關(guān)消息隊(duì)列屬性的命令。如改變消息隊(duì)列的用戶標(biāo)識符、消息隊(duì)列的許可權(quán)等;(3)IPC_RMID。消除消息隊(duì)列的標(biāo)識符。msgqid_ds 結(jié)構(gòu)定義如下:struct msgqid_ds struct ipc_perm msg_perm; /*許可權(quán)結(jié)構(gòu)*/ short pad17; /*由系統(tǒng)使用*/ ushort msg_qnum; /*隊(duì)列上消息數(shù)*/ ushort msg_qbytes; /*隊(duì)列上最大字節(jié)數(shù)*/ ushort msg_lspid; /*最后發(fā)送消息的PID*/ ushort msg_lrpid; /*最

41、后接收消息的PID*/ time_t msg_stime; /*最后發(fā)送消息的時(shí)間*/ time_t msg_rtime; /*最后接收消息的時(shí)間*/ time_t msg_ctime; /*最后更改時(shí)間*/ ;struct ipc_perm ushort uid; /*當(dāng)前用戶*/ ushort gid; /*當(dāng)前進(jìn)程組*/ ushort cuid; /*創(chuàng)建用戶*/ ushort cgid; /*創(chuàng)建進(jìn)程組*/ ushort mode; /*存取許可權(quán)*/ short pid1; long pad2; /*由系統(tǒng)使用*/ 6. 樣例程序 /client_ex.c 發(fā)送端#include&l

42、t;stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1024;msg;int msgqid;void client() msgqid=msgget(MSGKEY,0777); /*打開75#消息隊(duì)列*/ msg.mtype=1; msg.mtext1='a' printf("(cli

43、ent)sentn"); msgsnd(msgqid,&msg,1024,0); /*發(fā)送消息*/ exit(0);int main( ) client( ); /server_ex.c 接收端#include<stdio.h>#include<stdlib.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1024;msg;int

44、msgqid;void server( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*創(chuàng)建75#消息隊(duì)列*/ msgrcv(msgqid,&msg,1024,0,0); /*接收消息*/ printf("%c ",msg.mtextmsg.mtype); printf("(server)receivedn"); msgctl(msgqid,IPC_RMID,0); /*刪除消息隊(duì)列,歸還資源*/ exit(0);int main( ) server( );任務(wù)二 使用共享存儲(chǔ)區(qū)通信1. 實(shí)驗(yàn)基本原理共享存儲(chǔ)區(qū)

45、(Share Memory)是UNIX系統(tǒng)中通信速度最高的一種通信機(jī)制。該機(jī)制可使若干進(jìn)程共享主存中的某一個(gè)區(qū)域,且使該區(qū)域出現(xiàn)(映射)在多個(gè)進(jìn)程的虛地址空間中。另一方面,一個(gè)進(jìn)程的虛地址空間中又可連接多個(gè)共享存儲(chǔ)區(qū),每個(gè)共享存儲(chǔ)區(qū)都有自己的名字。當(dāng)進(jìn)程間欲利用共享存儲(chǔ)區(qū)進(jìn)行通信時(shí),必須先在主存中建立一共享存儲(chǔ)區(qū),然后將它附接到自己的虛地址空間上。此后,進(jìn)程對該區(qū)的訪問操作,與對其虛地址空間的其它部分的操作完全相同。進(jìn)程之間便可通過對共享存儲(chǔ)區(qū)中數(shù)據(jù)的讀、寫來進(jìn)行直接通信。圖4.1列出二個(gè)進(jìn)程通過共享一個(gè)共享存儲(chǔ)區(qū)來進(jìn)行通信的例子。其中,進(jìn)程A將建立的共享存儲(chǔ)區(qū)附接到自己的AA'區(qū)域,

46、進(jìn)程B將它附接到自己的BB'區(qū)域。圖4.1 共享存儲(chǔ)區(qū)應(yīng)當(dāng)指出,共享存儲(chǔ)區(qū)機(jī)制只為進(jìn)程提供了用于實(shí)現(xiàn)通信的共享存儲(chǔ)區(qū)和對共享存儲(chǔ)區(qū)進(jìn)行操作的手段,然而并未提供對該區(qū)進(jìn)行互斥訪問及進(jìn)程同步的措施。因而當(dāng)用戶需要使用該機(jī)制時(shí),必須自己設(shè)置同步和互斥措施才能保證實(shí)現(xiàn)正確的通信。2. shmget ( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型:int shmget(key_t key, size_t size, int shmflg);函數(shù)說明:得到一個(gè)共享內(nèi)

47、存標(biāo)識符或創(chuàng)建一個(gè)共享內(nèi)存對象并返回共享內(nèi)存標(biāo)識符。其中,key是共享存儲(chǔ)區(qū)的名字;size是其大?。ㄒ宰止?jié)計(jì)); shmflg是用戶設(shè)置的標(biāo)志,如IPC_CREAT。IPC_CREAT表示若系統(tǒng)中尚無指名的共享存儲(chǔ)區(qū),則由系統(tǒng)內(nèi)核建立一個(gè)共享存儲(chǔ)區(qū);若系統(tǒng)中已有共享存儲(chǔ)區(qū),便忽略IPC_CREAT,并返回此共享內(nèi)存的標(biāo)識符。在shmflg 標(biāo)志中還可以有存取權(quán)限控制符。這種控制符的意義和文件系統(tǒng)中的權(quán)限控制符是類似的。3. shmat ( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/sh

48、m.h>函數(shù)原型:void *shmat(int shmid, const void *shmaddr, int shmflg);函數(shù)說明:把共享內(nèi)存區(qū)對象映射到調(diào)用進(jìn)程的地址空間,系統(tǒng)調(diào)用的返回值是共享存儲(chǔ)區(qū)所附接到的進(jìn)程虛地址。連接共享內(nèi)存標(biāo)識符為shmid的共享內(nèi)存,連接成功后把共享內(nèi)存區(qū)對象映射到調(diào)用進(jìn)程的地址空間,隨后可像本地空間一樣訪問。其中,shmid是共享存儲(chǔ)區(qū)的標(biāo)識符;shmaddr是用戶給定的,將共享存儲(chǔ)區(qū)附接到進(jìn)程的虛地址空間;shmflg規(guī)定共享存儲(chǔ)區(qū)的讀、寫權(quán)限,以及系統(tǒng)是否應(yīng)對用戶規(guī)定的地址做舍入操作。其值為SHM_RDONLY時(shí),表示只能讀;其值為0時(shí),表示

49、可讀、可寫;其值為SHM_RND(取整)時(shí),表示操作系統(tǒng)在必要時(shí)舍去這個(gè)地址。4. shmdt ( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型:int shmdt(const void *shmaddr);函數(shù)說明:與shmat函數(shù)相反,是用來斷開與共享內(nèi)存附加點(diǎn)的地址,禁止本進(jìn)程訪問此共享內(nèi)存。其中,shmaddr是要斷開連接的虛地址,亦即以前由連接的系統(tǒng)調(diào)用shmat( )所返回的虛地址。調(diào)用成功時(shí),返回0值,調(diào)用不成功,返回-1。本函數(shù)調(diào)用并不刪除所指定的

50、共享內(nèi)存區(qū),而只是將先前用shmat函數(shù)連接(attach)好的共享內(nèi)存脫離(detach)目前的進(jìn)程。5. shctl ( )函數(shù)頭文件:#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>函數(shù)原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);函數(shù)說明:系統(tǒng)調(diào)用shmctl ( )用來控制對共享存儲(chǔ)區(qū)的操作,對其狀態(tài)信息進(jìn)行讀取和修改。其中,shmid是共享存儲(chǔ)區(qū)的標(biāo)識符,buf是用戶緩沖區(qū)地址,cmd是操作命令。命令可分為多種類

51、型:(1)用于查詢有關(guān)共享存儲(chǔ)區(qū)的情況。如其長度、當(dāng)前連接的進(jìn)程數(shù)、共享區(qū)的創(chuàng)建者標(biāo)識符等;(2)用于設(shè)置或改變共享存儲(chǔ)區(qū)的屬性。如共享存儲(chǔ)區(qū)的許可權(quán)、當(dāng)前連接的進(jìn)程計(jì)數(shù)等;(3)對共享存儲(chǔ)區(qū)的加鎖和解鎖命令;(4)刪除共享存儲(chǔ)區(qū)標(biāo)識符等。上述的查詢是將shmid所指示的數(shù)據(jù)結(jié)構(gòu)中的有關(guān)成員,放入所指示的緩沖區(qū)中;而設(shè)置是用由buf所指示的緩沖區(qū)內(nèi)容來設(shè)置由shmid所指示的數(shù)據(jù)結(jié)構(gòu)中的相應(yīng)成員。cmd有下列幾種數(shù)值:IPC_STAT:得到共享內(nèi)存的狀態(tài),把共享內(nèi)存的shmid_ds結(jié)構(gòu)復(fù)制到buf中;IPC_SET:改變共享內(nèi)存的狀態(tài),把buf所指的shmid_ds結(jié)構(gòu)中的uid、gid、m

52、ode復(fù)制到共享內(nèi)存的shmid_ds結(jié)構(gòu)內(nèi);IPC_RMID:刪除這片共享內(nèi)存6. 樣例程序 /client_ex.c 發(fā)送端#include <sys/types.h>#include <sys/shm.h>#include <sys/ipc.h>#include<stdio.h>#include<stdlib.h>#define SHMKEY 75int shmid,i;int *addr;void client( ) int i; shmid=shmget(SHMKEY,1024,0777); /*打開共享存儲(chǔ)區(qū)*/ addr

53、=shmat(shmid,0,0); /*獲得共享存儲(chǔ)區(qū)首地址*/ while (*addr!=-1); printf("(client) sentn"); *addr=100; exit(0);int main( ) client( ); /server_ex.c 接收端#include <sys/types.h>#include <sys/shm.h>#include <sys/ipc.h>#include<stdio.h>#include<stdlib.h>#define SHMKEY 75int shmid

54、,i;int *addr;void server( ) shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*創(chuàng)建共享存儲(chǔ)區(qū)*/ addr=shmat(shmid,0,0); /*獲取首地址*/ *addr=-1; while (*addr=-1); printf("%d",*addr); printf(" (server) receivedn"); shmctl(shmid,IPC_RMID,0); /*撤消共享存儲(chǔ)區(qū),歸還資源*/ exit(0);int main( ) server( );四、 實(shí)驗(yàn)內(nèi)容1. 根據(jù)消

55、息傳送機(jī)理,使用系統(tǒng)調(diào)用msgget( ), msgsnd( ), msgrev( ), 及msgctl( )編制一長度為k的消息發(fā)送和接收的程序,要求在程序中完成10次消息的發(fā)送和接收,每次發(fā)送消息結(jié)束和接收消息結(jié)束都需給出相應(yīng)的屏幕提示,且每次發(fā)送的的內(nèi)容不少于一個(gè)字符,并能在接收端輸出。2. 根據(jù)共享存儲(chǔ)區(qū)原理,使用系統(tǒng)調(diào)用shmget( ), shmat( ), shmdt( ), 及shctl( )編制程序,要求創(chuàng)建一個(gè)長度為k的共享存儲(chǔ)區(qū),并完成10次數(shù)據(jù)的發(fā)送和接收,每次發(fā)送數(shù)據(jù)結(jié)束和接收數(shù)據(jù)結(jié)束都需給出相應(yīng)的屏幕提示,且每次發(fā)送的的數(shù)據(jù)應(yīng)能在接收端輸出。五、 實(shí)驗(yàn)報(bào)告要求1. 列出實(shí)驗(yàn)內(nèi)容所要求的程序清單,并以截圖形式記錄相應(yīng)運(yùn)行結(jié)果。2. 對實(shí)驗(yàn)運(yùn)行結(jié)果進(jìn)行分析: 試比較實(shí)驗(yàn)中兩種方法實(shí)現(xiàn)進(jìn)程通信的不同之處。實(shí)驗(yàn)項(xiàng)目五 存儲(chǔ)管理一、 實(shí)驗(yàn)類型本實(shí)驗(yàn)為驗(yàn)證性實(shí)驗(yàn)。二、 實(shí)驗(yàn)?zāi)康?. 熟悉內(nèi)存空閑分區(qū)的分配方式;2. 理解動(dòng)態(tài)分區(qū)存儲(chǔ)管理方式;3. 掌握動(dòng)態(tài)分區(qū)的分配與回收的過程。三、 實(shí)驗(yàn)預(yù)備知識1. 實(shí)驗(yàn)基本原理使用一個(gè)鏈表來模擬內(nèi)存存儲(chǔ)空間,建立內(nèi)存塊來記錄內(nèi)存分配使用情況,通過隨機(jī)產(chǎn)生進(jìn)程及其所需要的內(nèi)存來模擬真實(shí)的進(jìn)程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論