《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書_第1頁
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書_第2頁
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書_第3頁
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書_第4頁
《操作系統(tǒng)》實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計(jì)算機(jī)科學(xué)與信息學(xué)院操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)書王道書編寫適用專業(yè): 信息安全、網(wǎng)絡(luò)工程貴州大學(xué)二OO九年十一月前言操作系統(tǒng)是一門理論性和時(shí)間性都很強(qiáng)的課程。要學(xué)好操作系統(tǒng)的設(shè)計(jì)原理,除了聽課、看書、做習(xí)題外,最好的方法就是在實(shí)踐中進(jìn)行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計(jì)小型系統(tǒng)/模塊或模擬算法等。本教材安排的實(shí)驗(yàn)內(nèi)容按深度可分為五個(gè)層次,即:使用級、觀察級、系統(tǒng)管理級、源碼閱讀級和實(shí)現(xiàn)級。(1)使用級:是指如何使用操作系統(tǒng),包括對命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。(2)觀察級:是指通過使用級的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過程和結(jié)構(gòu)。(3)系統(tǒng)管理級:

2、是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。(4)源碼閱讀級:是指對現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。(5)實(shí)現(xiàn)級:是指編程模擬實(shí)現(xiàn)操作系統(tǒng)某些功能模塊。實(shí)驗(yàn)的操作平臺是Red Hat Linux 9.0和Windows 2000 Professional,其中前者是主要的實(shí)驗(yàn)平臺,因?yàn)樵创a閱讀級等實(shí)驗(yàn)都是在Linux平臺上進(jìn)行的,當(dāng)然,在Linux上進(jìn)行的實(shí)驗(yàn)基本上也都可在UNIX平臺上直接進(jìn)行。根據(jù)專業(yè)特點(diǎn)及自己的需要以及實(shí)驗(yàn)條件等選擇相應(yīng)的實(shí)驗(yàn)內(nèi)容。(目錄 )實(shí)驗(yàn)一 Linux系統(tǒng)用戶接口和編程界面4實(shí)驗(yàn)二 進(jìn)程的創(chuàng)建6實(shí)驗(yàn)三 進(jìn)程的控制11實(shí)驗(yàn)四 進(jìn)程的管道通信15實(shí)驗(yàn)五 進(jìn)程調(diào)度實(shí)驗(yàn)18實(shí)

3、驗(yàn)報(bào)告的基本內(nèi)容及要求20貴州大學(xué)實(shí)驗(yàn)報(bào)告21實(shí)驗(yàn)一 Linux系統(tǒng)用戶接口和編程界面實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?熟悉使用Linux字符界面、窗口系統(tǒng)的常用命令。2熟悉運(yùn)用Linux常用的編程工具。3熟悉運(yùn)用Linux的在線求助系統(tǒng)。4掌握在Linux操作系統(tǒng)環(huán)境上編輯、編譯、調(diào)試、運(yùn)行一個(gè)C語言程序的全過程。二、實(shí)驗(yàn)內(nèi)容1熟悉開機(jī)后登錄Linux系統(tǒng)和退出系統(tǒng)的過程;2熟悉Linux字符界面虛擬終端窗口和shell,以及圖形界面X-Window(如gnome或KDE):練習(xí)并掌握常用的Linux操作命令,如ls、cat、ps、df、find、grep、cd、

4、more、cp、rm、kill、at、vi、cc、man、help、control+d/c、等;熟悉常用shell的提示符;熟悉字符窗口與圖形界面之間的切換。3學(xué)習(xí)使用Linux的在線求助系統(tǒng),如man和help命令等。4掌握一種Linux的編輯器,特別是字符界面的vi工具的使用。5用vi編輯一個(gè)打印“Hello,I am a C program”字串的C語言程序,然后編譯并運(yùn)行它,記下整個(gè)過程。熟悉gcc、gdb等編譯器、調(diào)試器的使用。 三、實(shí)驗(yàn)原理、方法和手段Linux操作系統(tǒng)環(huán)境下完成相關(guān)命令的使用;四、實(shí)驗(yàn)組織運(yùn)行要求課堂上集中授課,學(xué)生獨(dú)立完成實(shí)驗(yàn)。五、實(shí)驗(yàn)條件PC機(jī)或工作站一臺;R

5、edHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟 按Linux安裝步驟完成;七、思考題Linux的命令與Windows命令有什么不同?八、實(shí)驗(yàn)報(bào)告參見實(shí)驗(yàn)報(bào)告要求;九、其它說明 課后可以在RedHat9.0虛擬機(jī)上并完成相關(guān)實(shí)驗(yàn)。實(shí)驗(yàn)二 進(jìn)程的創(chuàng)建實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、掌握進(jìn)程的概念,明確進(jìn)程的含義2、認(rèn)識并了解并發(fā)執(zhí)行的實(shí)質(zhì)二、實(shí)驗(yàn)內(nèi)容1、編寫一段程序,使用系統(tǒng)調(diào)用fork( )創(chuàng)建兩個(gè)子進(jìn)程。當(dāng)此程序運(yùn)行時(shí),在系統(tǒng)中有一個(gè)父進(jìn)程和兩個(gè)子進(jìn)程活動(dòng)。讓每一個(gè)進(jìn)程在屏幕上顯示一個(gè)字符:父進(jìn)程顯示'a',子進(jìn)程分別顯示字符'b'和字符

6、'c'。試觀察記錄屏幕上的顯示結(jié)果,并分析原因。2、修改上述程序,每一個(gè)進(jìn)程循環(huán)顯示一句話。子進(jìn)程顯示'daughter '及'son ',父進(jìn)程顯示 'parent ',觀察結(jié)果,分析原因。三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問;五、實(shí)驗(yàn)條件(1)閱讀LINUX的fork.c源碼文件,分析進(jìn)程的創(chuàng)建過程。(2)閱讀LINUX的sched.c源碼文件,加深對進(jìn)程管理概念的認(rèn)識。六、實(shí)驗(yàn)步驟一、進(jìn)程UNIX中,進(jìn)程既是一個(gè)獨(dú)立擁有資源的基本單位,又是一個(gè)

7、獨(dú)立調(diào)度的基本單位。一個(gè)進(jìn)程實(shí)體由若干個(gè)區(qū)(段)組成,包括程序區(qū)、數(shù)據(jù)區(qū)、棧區(qū)、共享存儲區(qū)等。每個(gè)區(qū)又分為若干頁,每個(gè)進(jìn)程配置有唯一的進(jìn)程控制塊PCB,用于控制和管理進(jìn)程。PCB的數(shù)據(jù)結(jié)構(gòu)如下:1、進(jìn)程表項(xiàng)(Process Table Entry)。包括一些最常用的核心數(shù)據(jù):進(jìn)程標(biāo)識符PID、用戶標(biāo)識符UID、進(jìn)程狀態(tài)、事件描述符、進(jìn)程和U區(qū)在內(nèi)存或外存的地址、軟中斷信號、計(jì)時(shí)域、進(jìn)程的大小、偏置值nice、指向就緒隊(duì)列中下一個(gè)PCB的指針P_Link、指向U區(qū)進(jìn)程正文、數(shù)據(jù)及棧在內(nèi)存區(qū)域的指針。2、U區(qū)(U Area)。用于存放進(jìn)程表項(xiàng)的一些擴(kuò)充信息。每一個(gè)進(jìn)程都有一個(gè)私用的U區(qū),其中含有:

8、進(jìn)程表項(xiàng)指針、真正用戶標(biāo)識符u-ruid(read user ID)、有效用戶標(biāo)識符u-euid(effective user ID)、用戶文件描述符表、計(jì)時(shí)器、內(nèi)部I/O參數(shù)、限制字段、差錯(cuò)字段、返回值、信號處理數(shù)組。由于UNIX系統(tǒng)采用段頁式存儲管理,為了把段的起始虛地址變換為段在系統(tǒng)中的物理地址,便于實(shí)現(xiàn)區(qū)的共享,所以還有:3、系統(tǒng)區(qū)表項(xiàng)。以存放各個(gè)段在物理存儲器中的位置等信息。系統(tǒng)把一個(gè)進(jìn)程的虛地址空間劃分為若干個(gè)連續(xù)的邏輯區(qū),有正文區(qū)、數(shù)據(jù)區(qū)、棧區(qū)等。這些區(qū)是可被共享和保護(hù)的獨(dú)立實(shí)體,多個(gè)進(jìn)程可共享一個(gè)區(qū)。為了對區(qū)進(jìn)行管理,核心中設(shè)置一個(gè)系統(tǒng)區(qū)表,各表項(xiàng)中記錄了以下有關(guān)描述活動(dòng)區(qū)的信

9、息:區(qū)的類型和大小、區(qū)的狀態(tài)、區(qū)在物理存儲器中的位置、引用計(jì)數(shù)、指向文件索引結(jié)點(diǎn)的指針。4、進(jìn)程區(qū)表系統(tǒng)為每個(gè)進(jìn)程配置了一張進(jìn)程區(qū)表。表中,每一項(xiàng)記錄一個(gè)區(qū)的起始虛地址及指向系統(tǒng)區(qū)表中對應(yīng)的區(qū)表項(xiàng)。核心通過查找進(jìn)程區(qū)表和系統(tǒng)區(qū)表,便可將區(qū)的邏輯地址變換為物理地址。二、進(jìn)程映像UNIX系統(tǒng)中,進(jìn)程是進(jìn)程映像的執(zhí)行過程,也就是正在執(zhí)行的進(jìn)程實(shí)體。它由三部分組成:1、用戶級上、下文。主要成分是用戶程序;2、寄存器上、下文。由CPU中的一些寄存器的內(nèi)容組成,如PC,PSW,SP及通用寄存器等;3、系統(tǒng)級上、下文。包括OS為管理進(jìn)程所用的信息,有靜態(tài)和動(dòng)態(tài)之分。三、所涉及的系統(tǒng)調(diào)用1、fork( ) 創(chuàng)

10、建一個(gè)新進(jìn)程。 系統(tǒng)調(diào)用格式: pid=fork( )參數(shù)定義:int fork( )fork( )返回值意義如下:0:在子進(jìn)程中,pid變量保存的fork( )返回值為0,表示當(dāng)前進(jìn)程是子進(jìn)程。>0:在父進(jìn)程中,pid變量保存的fork( )返回值為子進(jìn)程的id值(進(jìn)程唯一標(biāo)識符)。-1:創(chuàng)建失敗。如果fork( )調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的PID,并向子進(jìn)程返回0,即fork( )被調(diào)用了一次,但返回了兩次。此時(shí)OS在內(nèi)存中建立一個(gè)新進(jìn)程,所建的新進(jìn)程是調(diào)用fork( )父進(jìn)程(parent process)的副本,稱為子進(jìn)程(child process)。子進(jìn)程繼承了父進(jìn)程的

11、許多特性,并具有與父進(jìn)程完全相同的用戶級上下文。父進(jìn)程與子進(jìn)程并發(fā)執(zhí)行。核心為fork( )完成以下操作:(1)為新進(jìn)程分配一進(jìn)程表項(xiàng)和進(jìn)程標(biāo)識符進(jìn)入fork( )后,核心檢查系統(tǒng)是否有足夠的資源來建立一個(gè)新進(jìn)程。若資源不足,則fork( )系統(tǒng)調(diào)用失??;否則,核心為新進(jìn)程分配一進(jìn)程表項(xiàng)和唯一的進(jìn)程標(biāo)識符。(2)檢查同時(shí)運(yùn)行的進(jìn)程數(shù)目超過預(yù)先規(guī)定的最大數(shù)目時(shí),fork( )系統(tǒng)調(diào)用失敗。(3)拷貝進(jìn)程表項(xiàng)中的數(shù)據(jù)將父進(jìn)程的當(dāng)前目錄和所有已打開的數(shù)據(jù)拷貝到子進(jìn)程表項(xiàng)中,并置進(jìn)程的狀態(tài)為“創(chuàng)建”狀態(tài)。(4)子進(jìn)程繼承父進(jìn)程的所有文件對父進(jìn)程當(dāng)前目錄和所有已打開的文件表項(xiàng)中的引用計(jì)數(shù)加1。(5)為子

12、進(jìn)程創(chuàng)建進(jìn)程上、下文進(jìn)程創(chuàng)建結(jié)束,設(shè)子進(jìn)程狀態(tài)為“內(nèi)存中就緒”并返回子進(jìn)程的標(biāo)識符。(6)子進(jìn)程執(zhí)行雖然父進(jìn)程與子進(jìn)程程序完全相同,但每個(gè)進(jìn)程都有自己的程序計(jì)數(shù)器PC(注意子進(jìn)程的PC開始位置),然后根據(jù)pid變量保存的fork( )返回值的不同,執(zhí)行了不同的分支語句。例:.pid=fork( );if (! pid) printf("I'm the child process!n");else if (pid>0) printf("I'm the parent process! n"); else printf("For

13、k fail!n");PC fork( )調(diào)用前PC fork( )調(diào)用后PC.pid=fork( );if (! pid) printf("I'm the child process!n");else if (pid>0) printf("I'm the parent process!n "); else printf("Fork fail!n");.pid=fork( );if (! pid) printf("I'm the child process!n");else

14、if (pid>0) printf("I'm the parent process!n "); else printf("Fork fail!n");四、參考程序1、#include <stdio.h>main( )int p1,p2;while(p1=fork( )= = -1); /*創(chuàng)建子進(jìn)程p1*/if (p1= =0) putchar('b'); else while(p2=fork( )= = -1); /*創(chuàng)建子進(jìn)程p2*/if(p2= =0) putchar('c'); else

15、putchar('a'); 2、#include <stdio.h>main( )int p1,p2,i;while(p1=fork( )= = -1); /*創(chuàng)建子進(jìn)程p1*/if (p1= =0) for(i=0;i<10;i+)printf("daughter %dn",i);else while(p2=fork( )= = -1); /*創(chuàng)建子進(jìn)程p2*/if(p2= =0) for(i=0;i<10;i+) printf("son %dn",i);else for(i=0;i<10;i+) prin

16、tf("parent %dn",i);五、運(yùn)行結(jié)果1、bca,bac, abc ,都有可能。2、parentsondaughter.daughter.或 parentsonparentdaughter等七、思考題(1)系統(tǒng)是怎樣創(chuàng)建進(jìn)程的?(2)當(dāng)首次調(diào)用新創(chuàng)建進(jìn)程時(shí),其入口在哪里?八、實(shí)驗(yàn)報(bào)告要求在指導(dǎo)書中明確學(xué)生實(shí)驗(yàn)報(bào)告的內(nèi)容及具體要求,主要包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄和實(shí)驗(yàn)報(bào)告三部分,基本內(nèi)容詳見附件6。九、其它說明除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序執(zhí)行過程。1、從進(jìn)程并發(fā)執(zhí)行來看,各種情況都有

17、可能。上面的三個(gè)進(jìn)程沒有同步措施,所以父進(jìn)程與子進(jìn)程的輸出內(nèi)容會(huì)疊加在一起。輸出次序帶有隨機(jī)性。2、由于函數(shù)printf( )在輸出字符串時(shí)不會(huì)被中斷,因此,字符串內(nèi)部字符順序輸出不變。但由于進(jìn)程并發(fā)執(zhí)行的調(diào)度順序和父子進(jìn)程搶占處理機(jī)問題,輸出字符串的順序和先后隨著執(zhí)行的不同而發(fā)生變化。這與打印單字符的結(jié)果相同。補(bǔ)充:進(jìn)程樹在UNIX系統(tǒng)中,只有0進(jìn)程是在系統(tǒng)引導(dǎo)時(shí)被創(chuàng)建的,在系統(tǒng)初啟時(shí)由0進(jìn)程創(chuàng)建1進(jìn)程,以后0進(jìn)程變成對換進(jìn)程,1進(jìn)程成為系統(tǒng)中的始祖進(jìn)程。UNIX利用fork( )為每個(gè)終端創(chuàng)建一個(gè)子進(jìn)程為用戶服務(wù),如等待用戶登錄、執(zhí)行SHELL命令解釋程序等,每個(gè)終端進(jìn)程又可利用fork(

18、 )來創(chuàng)建其子進(jìn)程,從而形成一棵進(jìn)程樹??梢哉f,系統(tǒng)中除0進(jìn)程外的所有進(jìn)程都是用fork( )創(chuàng)建的。實(shí)驗(yàn)三 進(jìn)程的控制實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、掌握進(jìn)程另外的創(chuàng)建方法2、熟悉進(jìn)程的睡眠、同步、撤消等進(jìn)程控制方法二、實(shí)驗(yàn)內(nèi)容1、用fork( )創(chuàng)建一個(gè)進(jìn)程,再調(diào)用exec( )用新的程序替換該子進(jìn)程的內(nèi)容2、利用wait( )來控制進(jìn)程執(zhí)行順序三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問;五、實(shí)驗(yàn)條件 PC機(jī)或工作站一臺;RedHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟一、所涉及的系統(tǒng)調(diào)用在

19、UNIX/LINUX中fork( )是一個(gè)非常有用的系統(tǒng)調(diào)用,但在UNIX/LINUX中建立進(jìn)程除了fork( )之外,也可用與fork( ) 配合使用的exec( )。1、exec( )系列系統(tǒng)調(diào)用exec( )系列,也可用于新程序的運(yùn)行。fork( )只是將父進(jìn)程的用戶級上下文拷貝到新進(jìn)程中,而exec( )系列可以將一個(gè)可執(zhí)行的二進(jìn)制文件覆蓋在新進(jìn)程的用戶級上下文的存儲空間上,以更改新進(jìn)程的用戶級上下文。exec( )系列中的系統(tǒng)調(diào)用都完成相同的功能,它們把一個(gè)新程序裝入內(nèi)存,來改變調(diào)用進(jìn)程的執(zhí)行代碼,從而形成新進(jìn)程。如果exec( )調(diào)用成功,調(diào)用進(jìn)程將被覆蓋,然后從新程序的入口開始執(zhí)

20、行,這樣就產(chǎn)生了一個(gè)新進(jìn)程,新進(jìn)程的進(jìn)程標(biāo)識符id 與調(diào)用進(jìn)程相同。exec( )沒有建立一個(gè)與調(diào)用進(jìn)程并發(fā)的子進(jìn)程,而是用新進(jìn)程取代了原來進(jìn)程。所以exec( )調(diào)用成功后,沒有任何數(shù)據(jù)返回,這與fork( )不同。exec( )系列系統(tǒng)調(diào)用在UNIX系統(tǒng)庫unistd.h中,共有execl、execlp、execle、execv、execvp五個(gè),其基本功能相同,只是以不同的方式來給出參數(shù)。一種是直接給出參數(shù)的指針,如:int execl(path,arg0,arg1,.argn,0);char *path,*arg0,*arg1,.,*argn;另一種是給出指向參數(shù)表的指針,如:int

21、execv(path,argv);char *path,*argv ;具體使用可參考有關(guān)書。2、exec( )和fork( )聯(lián)合使用系統(tǒng)調(diào)用exec和fork( )聯(lián)合使用能為程序開發(fā)提供有力支持。用fork( )建立子進(jìn)程,然后在子進(jìn)程中使用exec( ),這樣就實(shí)現(xiàn)了父進(jìn)程與一個(gè)與它完全不同子進(jìn)程的并發(fā)執(zhí)行。一般,wait、exec聯(lián)合使用的模型為:int status; .if (fork( )= =0) .; execl(.); .; wait(&status);3、wait( )等待子進(jìn)程運(yùn)行結(jié)束。如果子進(jìn)程沒有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)

22、程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait( )前已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回。系統(tǒng)調(diào)用格式:int wait(status)int *status;其中,status是用戶空間的地址。它的低8位反應(yīng)子進(jìn)程狀態(tài),為0表示子進(jìn)程正常結(jié)束,非0則表示出現(xiàn)了各種各樣的問題;高8位則帶回了exit( )的返回值。exit( )返回值由系統(tǒng)給出。核心對wait( )作以下處理:(1)首先查找調(diào)用進(jìn)程是否有子進(jìn)程,若無,則返回出錯(cuò)碼;(2)若找到一處于“僵死狀態(tài)”的子進(jìn)程,則將子進(jìn)程的執(zhí)行時(shí)間加到父進(jìn)程的執(zhí)行時(shí)間上,并釋放子進(jìn)程的進(jìn)程表項(xiàng);(3)若未找到處于“僵死狀態(tài)”的子進(jìn)

23、程,則調(diào)用進(jìn)程便在可被中斷的優(yōu)先級上睡眠,等待其子進(jìn)程發(fā)來軟中斷信號時(shí)被喚醒。4、exit( )終止進(jìn)程的執(zhí)行。系統(tǒng)調(diào)用格式: void exit(status) int status;其中,status是返回給父進(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)在進(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ù)。核

24、心須為exit( )完成以下操作:(1)關(guān)閉軟中斷(2)回收資源(3)寫記帳信息(4)置進(jìn)程為“僵死狀態(tài)” 二、參考程序#include<stdio.h>#include<unistd.h>main( ) int pid; pid=fork( ); /*創(chuàng)建子進(jìn)程*/switch(pid) case -1: /*創(chuàng)建失敗*/ printf("fork fail!n"); exit(1); case 0: /*子進(jìn)程*/ execl("/bin/ls","ls","-1","-col

25、or",NULL); printf("exec fail!n"); exit(1); default: /*父進(jìn)程*/ wait(NULL); /*同步*/ printf("ls completed !n"); exit(0); 三、運(yùn)行結(jié)果執(zhí)行命令ls -l -color ,(按倒序)列出當(dāng)前目錄下所有文件和子目錄;ls completed!七、思考題什么是進(jìn)程同步?wait( )是如何實(shí)現(xiàn)進(jìn)程同步的?八、實(shí)驗(yàn)報(bào)告九、其它說明程序在調(diào)用fork( )建立一個(gè)子進(jìn)程后,馬上調(diào)用wait( ),使父進(jìn)程在子進(jìn)程結(jié)束之前,一直處于睡眠狀態(tài)。子進(jìn)程用

26、exec( )裝入命令ls ,exec( )后,子進(jìn)程的代碼被ls的代碼取代,這時(shí)子進(jìn)程的PC指向ls的第1條語句,開始執(zhí)行l(wèi)s的命令代碼。注意在這里wait( )給我們提供了一種實(shí)現(xiàn)進(jìn)程同步的簡單方法。實(shí)驗(yàn)四 進(jìn)程的管道通信實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類型:(驗(yàn)證)實(shí)驗(yàn)要求:(必做)一、實(shí)驗(yàn)?zāi)康?、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式二、實(shí)驗(yàn)內(nèi)容編寫程序?qū)崿F(xiàn)進(jìn)程的管道通信。用系統(tǒng)調(diào)用pipe( )建立一管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message!父進(jìn)程從管道

27、中讀出二個(gè)來自子進(jìn)程的信息并顯示(要求先接收P1,后P2)。三、實(shí)驗(yàn)原理、方法和手段實(shí)驗(yàn)手段:編程驗(yàn)證原理;四、實(shí)驗(yàn)組織運(yùn)行要求課堂集中授課參考程序和學(xué)生編程實(shí)現(xiàn)、并回答相關(guān)疑問;五、實(shí)驗(yàn)條件 PC機(jī)或工作站一臺;RedHat9.0操作系統(tǒng);六、實(shí)驗(yàn)步驟一、什么是管道UNIX系統(tǒng)在OS的發(fā)展上,最重要的貢獻(xiàn)之一便是該系統(tǒng)首創(chuàng)了管道(pipe)。這也是UNIX系統(tǒng)的一大特色。所謂管道,是指能夠連接一個(gè)寫進(jìn)程和一個(gè)讀進(jìn)程的、并允許它們以生產(chǎn)者消費(fèi)者方式進(jìn)行通信的一個(gè)共享文件,又稱為pipe文件。由寫進(jìn)程從管道的寫入端(句柄1)將數(shù)據(jù)寫入管道,而讀進(jìn)程則從管道的讀出端(句柄0)讀出數(shù)據(jù)。句柄fd0句

28、柄fd1 讀出端寫入端二、管道的類型:1、有名管道一個(gè)可以在文件系統(tǒng)中長期存在的、具有路徑名的文件。用系統(tǒng)調(diào)用mknod( )建立。它克服無名管道使用上的局限性,可讓更多的進(jìn)程也能利用管道進(jìn)行通信。因而其它進(jìn)程可以知道它的存在,并能利用路徑名來訪問該文件。對有名管道的訪問方式與訪問其他文件一樣,需先用open( )打開。2、無名管道一個(gè)臨時(shí)文件。利用pipe( )建立起來的無名文件(無路徑名)。只用該系統(tǒng)調(diào)用所返回的文件描述符來標(biāo)識該文件,故只有調(diào)用pipe( )的進(jìn)程及其子孫進(jìn)程才能識別此文件描述符,才能利用該文件(管道)進(jìn)行通信。當(dāng)這些進(jìn)程不再使用此管道時(shí),核心收回其索引結(jié)點(diǎn)。二種管道的讀

29、寫方式是相同的,本文只講無名管道。3、pipe文件的建立分配磁盤和內(nèi)存索引結(jié)點(diǎn)、為讀進(jìn)程分配文件表項(xiàng)、為寫進(jìn)程分配文件表項(xiàng)、分配用戶文件描述符4、讀/寫進(jìn)程互斥內(nèi)核為地址設(shè)置一個(gè)讀指針和一個(gè)寫指針,按先進(jìn)先出順序讀、寫。為使讀、寫進(jìn)程互斥地訪問pipe文件,需使各進(jìn)程互斥地訪問pipe文件索引結(jié)點(diǎn)中的直接地址項(xiàng)。因此,每次進(jìn)程在訪問pipe文件前,都需檢查該索引文件是否已被上鎖。若是,進(jìn)程便睡眠等待,否則,將其上鎖,進(jìn)行讀/寫。操作結(jié)束后解鎖,并喚醒因該索引結(jié)點(diǎn)上鎖而睡眠的進(jìn)程。三、所涉及的系統(tǒng)調(diào)用 1、pipe( )建立一無名管道。系統(tǒng)調(diào)用格式 pipe(filedes)參數(shù)定義int pi

30、pe(filedes);int filedes2;其中,filedes1是寫入端,filedes0是讀出端。該函數(shù)使用頭文件如下:#include <unistd.h>#inlcude <signal.h>#include <stdio.h> 2、read( ) 系統(tǒng)調(diào)用格式 read(fd,buf,nbyte) 功能:從fd所指示的文件中讀出nbyte個(gè)字節(jié)的數(shù)據(jù),并將它們送至由指針buf所指示的緩沖區(qū)中。如該文件被加鎖,等待,直到鎖打開為止。 參數(shù)定義 int read(fd,buf,nbyte); int fd; char *buf; unsigned

31、 nbyte; 3、write( )系統(tǒng)調(diào)用格式 read(fd,buf,nbyte)功能:把nbyte 個(gè)字節(jié)的數(shù)據(jù),從buf所指向的緩沖區(qū)寫到由fd所指向的文件中。如文件加鎖,暫停寫入,直至開鎖。參數(shù)定義同read( )。四、參考程序#include <unistd.h>#include <signal.h>#include <stdio.h>int pid1,pid2; main( ) int fd2;char outpipe100,inpipe100;pipe(fd); /*創(chuàng)建一個(gè)管道*/while (pid1=fork( )= =-1);if(p

32、id1= =0) lockf(fd1,1,0); sprintf(outpipe,"child 1 process is sending message!"); /*把串放入數(shù)組outpipe中*/ write(fd1,outpipe,50); /*向管道寫長為50字節(jié)的串*/ sleep(5); /*自我阻塞5秒*/ lockf(fd1,0,0); exit(0); else while(pid2=fork( )= =-1); if(pid2= =0) lockf(fd1,1,0); /*互斥*/ sprintf(outpipe,"child 2 process

33、 is sending message!"); write(fd1,outpipe,50); sleep(5); lockf(fd1,0,0); exit(0); else wait(0); /*同步*/ read(fd0,inpipe,50); /*從管道中讀長為50字節(jié)的串*/ printf("%sn",inpipe); wait(0); read(fd0,inpipe,50); printf("%sn",inpipe); exit(0); 五、運(yùn)行結(jié)果 延遲5秒后顯示child 1 process is sending message! 再延遲5秒 child 2 process is sending message!七、思考題1、程序中的sleep(5)起

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論