版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、=實(shí)驗(yàn)報(bào)告姓名 學(xué)號: 專業(yè): 學(xué)年 第 學(xué)期年級班級: 阜陽師范學(xué)院Fuyang Teachers College 計(jì)算機(jī)與信息 學(xué)院實(shí)驗(yàn)課程:操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)一:Linux入門實(shí)驗(yàn)?zāi)康?) 了解Linux運(yùn)行環(huán)境的命令及使用格式 2) 熟悉Linux的常用基本命令3) 練習(xí)并掌握Linux下C語言程序的編寫、編譯、調(diào)試和運(yùn)行方法。實(shí)驗(yàn)器材PC、虛擬機(jī)實(shí)驗(yàn)內(nèi)容1) 熟悉Linux的常用基本命令如logout/exit、adduser、userdel、ls、cd、pwd、mkdir、rmdir、rm、cp、mv、cat、man等。2) 用vim編寫一個(gè)簡單的顯示“hello wor
2、d!”的程序,用gcc編譯并觀察編譯后的結(jié)果,運(yùn)行生成的可執(zhí)行文件。實(shí)驗(yàn)要求記錄自己實(shí)驗(yàn)課上具體的操作內(nèi)容、過程實(shí)驗(yàn)原理(指導(dǎo))(一)介紹虛擬機(jī)安裝以及使用方法利用軟件技術(shù),在母機(jī)hosts中虛擬出另外一臺或者幾臺子機(jī)guests,而在子機(jī)中,可以隨意進(jìn)行任何操作,并且都不會(huì)影響主機(jī)。Vmware中創(chuàng)建的OS實(shí)際上是在硬盤上創(chuàng)建了一個(gè)文件夾,該OS中的所有東西都保存在這個(gè)文件夾中的文件里面。設(shè)置共享的路徑:Windows: d:lin_shareLinux: /mnt/hgfs/sha_fd(二)常用基本命令的使用用root賬號(超級用戶)注冊,口令為ubuntu(注意大小寫)。注冊成功出現(xiàn)#
3、號(超級用戶系統(tǒng)提示符,普通用戶的系統(tǒng)提示符為$)。命令格式:命令 選項(xiàng) 處理對象注意:(1)命令一般是小寫字串。注意大小寫有別 (2)選項(xiàng)通常以減號(-)再加上一個(gè)或數(shù)個(gè)字符表示,用來選擇一個(gè)命令的不同操作 (3)同一行可有數(shù)個(gè)命令,命令間應(yīng)以分號隔開 (4)命令后加上&可使該命令后臺(background)執(zhí)行命令名功能實(shí)例命令功能實(shí)例(三)使用編輯器vim 編輯文件vim提供二種工作模式:輸入模式(insert mode)和命令模式(command mode)。1. 進(jìn)入Linux的文本模式之后,在命令行鍵入vim filename.c 然后回車。首先vim命令是打開vim編輯器
4、。后面的filename.c是用戶即將編輯的c文件名字,注意擴(kuò)展名字是.c;也可以直接用vi打開一個(gè)新的未命名的文件,當(dāng)保存的時(shí)候再給它命名,只是這樣做不很方便。2. 最基本的命令I(lǐng) :當(dāng)進(jìn)入剛打開的文件時(shí),不能寫入信息,這時(shí)按一下鍵盤上的I鍵(insert),插入的意思,就可以進(jìn)入編輯模式了(a與i是相同的用法)3. 當(dāng)文件編輯完后,需要保存退出,這時(shí)需要經(jīng)過以下幾個(gè)步驟:1)按一下鍵盤上的Esc 鍵;2)鍵入冒號(:),緊跟在冒號后面是wq(意思是保存并退出)。如果不想保存退出,則在第二步鍵入冒號之后,鍵入!q(不帶w,機(jī)尾部保存)。4. 在輸入模式下,按ESC可切換到命令模式。命令模式下
5、,可選用下列指令離開vi:q!離開vi,并放棄剛在緩沖區(qū)內(nèi)編輯的內(nèi)容:wq將緩沖區(qū)內(nèi)的資料寫入磁盤中,并離開vi:ZZ同wq:x同wq:w將緩沖區(qū)內(nèi)的資料寫入磁盤中,但并不離開vi:q離開vi,若文件被修改過,則要被要求確認(rèn)是否放棄修改的內(nèi)容,此指令可與:w配合使用5. 退出vi編輯器的編輯模式之后,要對剛才編寫的程序進(jìn)行編譯(四)GNU C編譯器Linux上可用的C編譯器是GNU C編譯器。通常后跟一些選項(xiàng)和文件名來使用GCC編譯器。GCC命令的基本用法如下: gcc options filenames。當(dāng)不用任何選項(xiàng)編譯一個(gè)程序時(shí),GCC將建立(假定編譯成功)一個(gè)名為a.out的可執(zhí)行文件
6、。也可用-o選項(xiàng)來為即將產(chǎn)生的可執(zhí)行文件指定一個(gè)文件名來代替a.out。例如:gcc o count count.c此時(shí)得到的可執(zhí)行文件就不再是a.out,而是count。最后一步是運(yùn)行程序,執(zhí)行文件 格式: ./可執(zhí)行文件名(五)GDB調(diào)試工具gdb是一個(gè)用來調(diào)試C和C+程序的強(qiáng)有力調(diào)試器。它使你能在程序運(yùn)行時(shí)觀察程序的內(nèi)部結(jié)構(gòu)和內(nèi)存的使用情況。在編譯時(shí)用 g 選項(xiàng)打開調(diào)試選項(xiàng)。命 令描 述file裝入欲調(diào)試的可執(zhí)行文件kill終止正在調(diào)試的程序list列出產(chǎn)生執(zhí)行文件的源代碼部分next執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部step執(zhí)行一行源代碼并進(jìn)入函數(shù)內(nèi)部run執(zhí)行當(dāng)前被調(diào)試的程序quit終止
7、gdbbreak在代碼里設(shè)置斷點(diǎn),使程序執(zhí)行到這里時(shí)被掛起make不退出gdb就可以重新產(chǎn)生可執(zhí)行文件shell不離開gdb就執(zhí)行UNIX shell 命令實(shí)驗(yàn)過程【任務(wù)】:編寫一簡單程序,對其編譯、調(diào)試并執(zhí)行程序體實(shí)驗(yàn)結(jié)果及分析注意事項(xiàng)實(shí)驗(yàn)小結(jié)教師評語實(shí)驗(yàn)成績教師簽名實(shí)驗(yàn)日期實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)二:Linux進(jìn)程控制實(shí)驗(yàn)?zāi)康?) 加深對進(jìn)程概念的理解,明確進(jìn)程和程序的區(qū)別; 2) 進(jìn)一步認(rèn)識并發(fā)執(zhí)行的概念,區(qū)別順序執(zhí)行和并發(fā)執(zhí)行;3) 掌握進(jìn)程創(chuàng)建的方法4) 熟悉進(jìn)程的睡眠,同步和撤銷等進(jìn)程控制方法5) 分析進(jìn)程爭用臨界資源的現(xiàn)象,學(xué)習(xí)解決進(jìn)程互斥的方法;實(shí)驗(yàn)器材PC、虛擬機(jī)實(shí)驗(yàn)內(nèi)容1) 編
8、寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。各進(jìn)程顯示不同的信息,如父進(jìn)程顯示字符“a”,子進(jìn)程分別顯示字符“b”和“c”。多次運(yùn)行觀察顯示結(jié)果,并分析產(chǎn)生這種執(zhí)行效果的原因。2) 修改已編寫的程序,將每個(gè)進(jìn)程輸出一個(gè)字符改為每個(gè)進(jìn)程輸出一句話,在觀察程序執(zhí)行時(shí)屏幕出現(xiàn)的現(xiàn)象,并分析原因3) 一個(gè)父進(jìn)程創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程通過exec系統(tǒng)調(diào)用執(zhí)行另一個(gè)文件。各自的代碼中顯示不同的信息,從其運(yùn)行結(jié)果可看出兩個(gè)進(jìn)程并發(fā)執(zhí)行的效果。4) 利用wait()來控制進(jìn)程執(zhí)行順序,并用exit()來終止進(jìn)程執(zhí)行,分析wait( )是如何實(shí)現(xiàn)進(jìn)程同步的5) 選作:如果在程序中使用調(diào)用lockf()來
9、給每一個(gè)子進(jìn)程加鎖,可以實(shí)現(xiàn)進(jìn)程之間的互斥,觀察并分析出現(xiàn)的現(xiàn)象。實(shí)驗(yàn)要求1) 仔細(xì)觀察實(shí)驗(yàn)中的各種現(xiàn)象及出現(xiàn)的問題。分析產(chǎn)生各種現(xiàn)象的原因。尋找解決問題的辦法。2) 實(shí)驗(yàn)報(bào)告中給出程序的主要語句并且加入相應(yīng)的注釋即可,程序太多時(shí)不需要給出程序的全部語句,給出輸出的結(jié)果及對各種現(xiàn)象的分析意見實(shí)驗(yàn)原理(指導(dǎo))(一)所涉及的系統(tǒng)調(diào)用函數(shù)名功能調(diào)用格式1fork( ) 創(chuàng)建一個(gè)新進(jìn)程。Int pid=fork( )說明:fork( )返回值意義如下:0:在子進(jìn)程中,pid變量保存的fork( )返回值為0,表示當(dāng)前進(jìn)程是子進(jìn)程。>0:在父進(jìn)程中,pid變量保存的fork( )返回值為子進(jìn)程的i
10、d值(進(jìn)程唯一標(biāo)識符)。-1:創(chuàng)建失敗。如果fork( )調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的PID,并向子進(jìn)程返回0,即fork( )被調(diào)用了一次,但返回了兩次。函數(shù)名功能調(diào)用格式2getpid( ) 取得目前進(jìn)程的識別碼(進(jìn)程ID),int getpid()3getppid( ) 取得目前進(jìn)程的父進(jìn)程識別碼int getppid()說明:頭文件 #include<unistd.h>函數(shù)名功能調(diào)用格式4execl ( ) 把一個(gè)新程序裝入內(nèi)存,來改變調(diào)用進(jìn)程的執(zhí)行代碼,從而形成新進(jìn)程int execl(path,arg0,arg1,.argn,0);char *path,*arg0,
11、*arg1,.,*argn;說明:如果exec( )調(diào)用成功,調(diào)用進(jìn)程將被覆蓋,然后從新程序的入口開始執(zhí)行,這樣就產(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)程。系統(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í)行。頭文件: #include<unistd.h>函數(shù)名功能調(diào)用格式5wait( ) 等待子進(jìn)程運(yùn)行結(jié)束int wait(status)int *status;
12、其中,status是用戶空間的地址。說明:如果子進(jìn)程沒有完成,父進(jìn)程一直等待。wait( )將調(diào)用進(jìn)程掛起,直至其子進(jìn)程因暫?;蚪K止而發(fā)來軟中斷信號為止。如果在wait( )前已有子進(jìn)程暫?;蚪K止,則調(diào)用進(jìn)程做適當(dāng)處理后便返回函數(shù)名功能調(diào)用格式6exit( )終止進(jìn)程的執(zhí)行void exit(status) int status;其中,status是返回給父進(jìn)程的一個(gè)整數(shù),說明:exit(0)正常終止;exit(1)異常終止函數(shù)名功能調(diào)用格式7lockf(files,function,size)用作鎖定文件的某些段或者整個(gè)文件。int lockf(files,function,size)int
13、 files,function;long size;其中:files是文件描述符;function是鎖定和解鎖:1表示鎖定,0表示解鎖。size是鎖定或解鎖的字節(jié)數(shù),為0,表示從文件的當(dāng)前位置到文件尾。(二) 進(jìn)程創(chuàng)建程序?qū)嵤纠?include<stdio.h> main() int p; while(p=fork()=-1); /*進(jìn)程創(chuàng)建失敗*/ if(p=0) printf(“This is a child process.”);/*在子進(jìn)程中*/ else printf(“This is a parent process.”);/*在父進(jìn)程中*/ 實(shí)驗(yàn)過程【子任務(wù)1】:使
14、用系統(tǒng)調(diào)用函數(shù)fork( )創(chuàng)建子進(jìn)程,用getpid( )獲取父子進(jìn)程的ID號,用getppid( )獲取子進(jìn)程的父進(jìn)程的ID,記錄實(shí)驗(yàn)結(jié)果,觀察并分析它們之間的關(guān)系。程序體實(shí)驗(yàn)結(jié)果及分析【子任務(wù)2】:修改程序,用fork( )建立子進(jìn)程,然后在子進(jìn)程中使用execl( ),記錄實(shí)驗(yàn)結(jié)果,并對實(shí)驗(yàn)結(jié)果進(jìn)行分析系統(tǒng)調(diào)用函數(shù)excel( )的工作原理。程序體實(shí)驗(yàn)結(jié)果及分析【子任務(wù)3】:修改程序,編寫一段程序,使用系統(tǒng)調(diào)用fork()創(chuàng)建兩個(gè)子進(jìn)程。各進(jìn)程顯示不同的信息。多次運(yùn)行觀察結(jié)果,分析執(zhí)行效果的原因,說明進(jìn)程并發(fā)執(zhí)行的特點(diǎn)。程序體實(shí)驗(yàn)結(jié)果及分析【子任務(wù)4】:修改程序,使用系統(tǒng)調(diào)用wait(
15、 )、exit( )和sleep( ),實(shí)現(xiàn)簡單的進(jìn)程同步,多次運(yùn)行觀察結(jié)果,分析執(zhí)行效果的原因,說明如何使得進(jìn)程實(shí)現(xiàn)簡單的同步。程序體程序體實(shí)驗(yàn)結(jié)果及分析注意事項(xiàng)實(shí)驗(yàn)小結(jié)教師評語實(shí)驗(yàn)成績教師簽名實(shí)驗(yàn)日期實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)三:Linux進(jìn)程通信實(shí)驗(yàn)?zāi)康?) 了解什么是信號以及熟悉Linux系統(tǒng)中進(jìn)程之間軟中斷通信的基本原理5) 了解什么是管道以及熟悉Linux支持的管道通信方式6) 了解什么是消息以及熟悉消息傳送的機(jī)理實(shí)驗(yàn)器材PC、虛擬機(jī)實(shí)驗(yàn)內(nèi)容任務(wù)一:進(jìn)程的軟中斷通訊任務(wù)二:進(jìn)程的管道通信任務(wù)三:消息通信實(shí)驗(yàn)原理(指導(dǎo))(一)所涉及的系統(tǒng)調(diào)用函數(shù)名功能調(diào)用格式1kill( ) 發(fā)送者進(jìn)程發(fā)
16、送信號。int kill(pid,sig) int pid,sig說明:其中,pid是一個(gè)或一組進(jìn)程的標(biāo)識符,參數(shù)sig是要發(fā)送的軟中斷信號。(1)pid>0時(shí),核心將信號發(fā)送給進(jìn)程pid。(2)pid=0時(shí),核心將信號發(fā)送給與發(fā)送進(jìn)程同組的所有進(jìn)程。(3)pid=-1時(shí),核心將信號發(fā)送給所有用戶標(biāo)識符真正等于發(fā)送進(jìn)程的有效用戶標(biāo)識號的進(jìn)程。函數(shù)名功能調(diào)用格式2signal( ) 預(yù)置對信號的處理方式,允許調(diào)用進(jìn)程控制軟中斷信號。signal(sig,function) int sig;void (*func) ( )說明:頭文件 #include <signal.h>其中s
17、ig用于指定信號的類型,sig為0則表示沒有收到任何信號,常用如下表:值名 字說 明01SIGHUP掛起(hangup)02SIGINT中斷,當(dāng)用戶從鍵盤按c鍵或break鍵時(shí)03SIGQUIT退出,當(dāng)用戶從鍵盤按quit鍵時(shí)16SIGUSR1用戶自定義信號117SIGUSR2用戶自定義信號218SIGCLD某個(gè)子進(jìn)程死function 的解釋如下:(1)function=1時(shí),進(jìn)程對sig類信號不予理睬,亦即屏蔽了該類信號;(2)function=0時(shí),缺省值,進(jìn)程在收到sig信號后應(yīng)終止自己;(3)function為非0,非1類整數(shù)時(shí),function的值即作為信號處理程序的指針。函數(shù)名功
18、能調(diào)用格式3pipe( ) 建立一無名管道。int pipe(filedes);int filedes2;其中,filedes1是寫入端,filedes0是讀出端。說明:頭文件: #include <unistd.h>#inlcude <signal.h>#include <stdio.h>函數(shù)名功能調(diào)用格式4read( ) 從fd所指示的文件中讀出nbyte個(gè)字節(jié)的數(shù)據(jù),并將它們送至由指針buf所指示的緩沖區(qū)中。如該文件被加鎖,等待,直到鎖打開為止。int read(fd,buf,nbyte);int fd;char *buf; unsigned nbyt
19、e;5write( )把nbyte 個(gè)字節(jié)的數(shù)據(jù),從buf所指向的緩沖區(qū)寫到由fd所指向的文件中。如文件加鎖,暫停寫入,直至開鎖。int write(fd,buf,nbyte)int fd;char *buf;unsigned nbyte;函數(shù)名功能調(diào)用格式6msgget( )創(chuàng)建一個(gè)消息,獲得一個(gè)消息的描述符。int msgget(key,flag)key_t key;int flag;說明:其中,key是用戶指定的消息隊(duì)列的名字;flag是用戶設(shè)置的標(biāo)志和訪問方式。如:IPC_CREAT |0400 是否該隊(duì)列已被創(chuàng)建。無則創(chuàng)建,是則打開;IPC_EXCL |0400 是否該隊(duì)列的創(chuàng)建應(yīng)是
20、互斥的。msgqid 是該系統(tǒng)調(diào)用返回的描述符,失敗則返回-1。位置到文件尾。函數(shù)名功能調(diào)用格式7.msgsnd( )發(fā)送一消息。向指定的消息隊(duì)列發(fā)送一個(gè)消息,并將該消息鏈接到該消息隊(duì)列的尾部。int msgsnd(msgqid,msgp,size,flag)int msgqid,size,flag;struct msgbuf * msgp;說明:其中,msgqid是返回消息隊(duì)列的描述符;msgp是指向用戶消息緩沖區(qū)的一個(gè)結(jié)構(gòu)體指針。緩沖區(qū)中包括消息類型和消息正文,即 long mtype; /*消息類型*/ char mtext ; /*消息的文本*/ size指示由msgp指向的數(shù)據(jù)結(jié)構(gòu)中
21、字符數(shù)組的長度;即消息的長度。flag規(guī)定當(dāng)核心用盡內(nèi)部緩沖空間時(shí)應(yīng)執(zhí)行的動(dòng)作,進(jìn)程是等待(若在標(biāo)志flag中未設(shè)置IPC_NOWAIT位),還是立即返回(若是設(shè)置IPC_NOWAI)。函數(shù)名功能調(diào)用格式8.msgrcv( )接受一消息。從指定的消息隊(duì)列中接收指定類型的消息。int msgrcv(msgqid,msgp,size,type,flag) int msgqid,size,flag;struct msgbuf *msgp;long type;說明:其中,msgqid,msgp,size,flag與msgsnd中的對應(yīng)參數(shù)相似,type是規(guī)定要讀的消息類型,flag規(guī)定倘若該隊(duì)列無消息
22、,核心應(yīng)做的操作。如此時(shí)設(shè)置了IPC_NOWAIT標(biāo)志,則立即返回,若在flag中設(shè)置了MS_NOERROR,且所接收的消息大于size,則核心截?cái)嗨邮盏南?。函?shù)名功能調(diào)用格式9.msgctl( )消息隊(duì)列的操縱。讀取消息隊(duì)列的狀態(tài)信息并進(jìn)行修改,如查詢消息隊(duì)列描述符、修改它的許可權(quán)及刪除該隊(duì)列等。int msgctl(msgqid,cmd,buf); int msgqid,cmd;struct msgqid_ds *buf;說明:其中,函數(shù)調(diào)用成功時(shí)返回0,不成功則返回-1。buf是用戶緩沖區(qū)地址,供用戶存放控制參數(shù)和查詢結(jié)果;cmd是規(guī)定的命令實(shí)驗(yàn)過程【任務(wù)1】:修改參考程序,使用系統(tǒng)
23、調(diào)用fork()創(chuàng)建子進(jìn)程,再用系統(tǒng)調(diào)用signal()讓父進(jìn)程捕捉鍵盤上來的中斷信號(即按DEL或ctrl+c鍵);當(dāng)捕捉到中斷信號后,父進(jìn)程用系統(tǒng)調(diào)用kill()向子進(jìn)程發(fā)出信號,子進(jìn)程捕捉到信號后輸出下列信息后終止: stop 子進(jìn)程ID by signal 16(或17)! Child Processl is Killed! 父進(jìn)程等待子進(jìn)程終止后,輸出如下的信息后終止 stop 父進(jìn)程ID by signal 2! Parent Process is Killed!實(shí)驗(yàn)要求分析利用軟中斷通信實(shí)現(xiàn)進(jìn)程同步的機(jī)理,signal()放在程序的不同位置處-,記錄輸出結(jié)果并分析原因,修改參考程
24、序,按任務(wù)中要求的輸出結(jié)果形式輸出,若需要修改程序,直接在參考程序上修改,并加注釋。參考程序修改后程序# include<stdio.h># include<signal.h># include<unistd.h>int wait_mark;void waiting(),stop();main() int p1; while(p1=fork()=-1); if(p1>0) wait_mark=1;signal(SIGINT,stop);waiting();kill(p1,16);printf(“parent process is killed!n”);
25、else wait_mark=1; signal(16,stop);waiting();printf(“child process is killed!n”);void waiting() while(wait_mark!=0);void stop() wait_mark=0;實(shí)驗(yàn)結(jié)果及分析【任務(wù)2】:用系統(tǒng)調(diào)用pipe( )建立一管道,二個(gè)子進(jìn)程P1和P2分別向管道各寫一句話: Child 1 is sending a message! Child 2 is sending a message!父進(jìn)程從管道中讀出二個(gè)來自子進(jìn)程的信息并顯示。實(shí)驗(yàn)要求(1)要求先接收P1,后P2(2)必須考慮其
26、中都有哪些同步和互斥,同時(shí)向管道輸入端寫的字節(jié)數(shù)必須和從輸出端讀的字節(jié)數(shù)一致,若不一致,則會(huì)出現(xiàn)什么問題。(3)修改參考程序,按任務(wù)中要求的輸出結(jié)果形式輸出,若需要程序,直接在參考程序上修改,并加注釋。參考程序修改后程序#include <unistd.h>#include <signal.h>#include <stdio.h>main( ) int pid1,pid2;int fd2;char outpipe100,inpipe100;pipe(fd);while (pid1=fork( )= =-1);if(pid1= =0)sprintf(outpi
27、pe,"child 1 process is sending message!"); write(fd1,outpipe,50); elsewhile(pid2=fork( )= =-1);if(pid2= =0) sprintf(outpipe,"child 2 process is sending message!"); write(fd1,outpipe,50); else read(fd0,inpipe,50); printf("%sn",inpipe);read(fd0,inpipe,50);printf("%sn
28、",inpipe);實(shí)驗(yàn)結(jié)果及分析【任務(wù)3】:使用系統(tǒng)調(diào)用msgget( ),msgsnd( ),msgrev( ),及msgctl( )編制一長度為k的消息發(fā)送(client.c)和接收(server.c)的程序。實(shí)驗(yàn)要求(1) 二個(gè)程序分別編輯、編譯為client與server。(2) 執(zhí)行:./server&ipcs -q./client(3) 觀察上面的程序,記錄實(shí)驗(yàn)結(jié)果,說明控制消息隊(duì)列系統(tǒng)調(diào)用msgctl () 在此起什么作用?(4) (選作:為了便于操作和觀察結(jié)果,用一個(gè)程序?yàn)椤耙印?,先后fork()兩個(gè)進(jìn)程,server和client 進(jìn)行通信。)若需要程序
29、,直接在參考程序上修改,并加注釋。參考程序修改后程序1client.c#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void client() int i;msgqid=msgget(MSGKEY,0777); for(i=10;i>=1;i-) msg.mtype=i;printf(“(client)sentn”);msgsnd
30、(msgqid,&msg,1024,0); exit(0);main( ) client( );2server.c#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#define MSGKEY 75struct msgform long mtype; char mtext1000;msg;int msgqid;void server( )msgqid=msgget(MSGKEY,0777|IPC_CREAT); do msgrcv(msgqid,&msg,1030,0,
31、0); printf(“(server)receivedn”);while(msg.mtype!=1);msgctl(msgqid,IPC_RMID,0); exit(0);main( ) server( );實(shí)驗(yàn)結(jié)果及分析實(shí)驗(yàn)結(jié)果及分析注意事項(xiàng)實(shí)驗(yàn)小結(jié)教師評語實(shí)驗(yàn)成績教師簽名實(shí)驗(yàn)日期實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)四:頁面置換算法模擬實(shí)驗(yàn)?zāi)康?) 進(jìn)一步掌握虛擬存儲(chǔ)器的工作原理2) 通過實(shí)驗(yàn)理解和掌握FIFO,LRU,OPT三種頁面置換算法3) 比較各種頁面置換算法的優(yōu)缺點(diǎn)實(shí)驗(yàn)器材PC、虛擬機(jī)實(shí)驗(yàn)內(nèi)容任務(wù)一:編譯opt.c和lru.c實(shí)現(xiàn)OPT和LRU置換算法任務(wù)二:參照前兩個(gè)算法自行編寫代碼,實(shí)現(xiàn)FI
32、FO置換算法。任務(wù)三:在一個(gè)程序中同時(shí)實(shí)現(xiàn)OPT,LRU和FIFO三種置換算法。實(shí)驗(yàn)原理(指導(dǎo))(一)所涉及的系統(tǒng)調(diào)用函數(shù)名功能調(diào)用格式1srand( )隨機(jī)數(shù)發(fā)生器的初始化函數(shù)void srand(unsigned seed);說明:使用的頭文件:#include <stdlib.h>用法:它需要提供一個(gè)種子,參數(shù)seed是rand()的種子,用來初始化rand()的起始值。有以下幾種常用的方法:l srand(unsigned) time(NULL); 直接傳入一個(gè)空指針l srand(int)getpid(); 使用進(jìn)程的ID(getpid()來作為初始化種子,在同一個(gè)程序中
33、這個(gè)種子是固定的。函數(shù)名功能調(diào)用格式2rand( ) 產(chǎn)生隨機(jī)數(shù)的一個(gè)隨機(jī)函數(shù)。int rand();說明:(1) srand (seed)中指定的seed開始,返回一個(gè)seed, RAND_MAX(0x7fff))間的隨機(jī)整數(shù)(2) rand()可以生成0RAND_MAX之間的一個(gè)隨機(jī)數(shù),其中RAND_MAX 是stdlib.h 中定義的一個(gè)整數(shù),它與系統(tǒng)有關(guān)。(3) rand()在每次程序運(yùn)行時(shí)產(chǎn)生的值都不一樣,必須給srand(seed)中的seed一個(gè)變值,這個(gè)變值必須在每次程序運(yùn)行時(shí)都不一樣(比如到目前為止流逝的時(shí)間)。(4) 如果給seed指定的是一個(gè)定值,那么每次程序運(yùn)行時(shí)ran
34、d()產(chǎn)生的值都會(huì)一樣,雖然這個(gè)值會(huì)是seed, RAND_MAX(0x7fff))之間的一個(gè)隨機(jī)取得的值。(5) 如果在調(diào)用rand()之前沒有調(diào)用過srand(seed),效果將和調(diào)用了srand(1)再調(diào)用rand()一樣(1也是一個(gè)定值)。(6) 一個(gè)通用的公式是:要取得a,b)之間的隨機(jī)整數(shù),使用(rand() % (b-a))+ a (結(jié)果值將含a不含b)。實(shí)驗(yàn)過程【任務(wù)1】:編譯opt.c和lru.c實(shí)現(xiàn)OPT和LRU置換算法實(shí)驗(yàn)要求多次執(zhí)行,查看置換算法的詳細(xì)置換過程及結(jié)果參考程序Opt.cLru.c#include <stdio.h> #include <s
35、tdlib.h>#include <time.h> #define N 12 #define B 3 #define P 5 int isInBuf(int buf, int x, int *p) int i, j = -1; for (i = 0; i < B; i+) if(bufi = x) j = i; break; else if (bufi = -1) (*p)+; bufi = x; j = i; break; if(j=-1) (*p)+; return j; int oldopt(int i, int buf , int list , int f )
36、int k, h, j=0, max=-1; for (k = 0; k < B; k+) for (h = i; h < N; h+) if (bufk = listh) fk = h; break; if(h=N) fk = N; for (k = 0; k < B; k+) if (max < fk) max = fk; j = k; return j;int main() int listN; int changeN; int bufB,fB,i,j,k; int resultBN; int old; int absent; srand(int)time(NUL
37、L);printf("n The Random List:n"); for (i = 0; i < N; i+) listi = rand() % P+1; printf("%3d", listi); printf("n-n"); printf("nOPT:n"); absent=0; for(i = 0; i < B; i+) bufi = fi = -1; for(i = 0; i < N; i+) j=isInBuf(buf, listi,&absent); if(j= -1) /需
38、置換頁面 old=oldopt(i, buf, list, f); changei=bufold; bufold = listi; else changei=-1; for(k=0;k<B;k+) resultki=bufk; printf("the result is:n"); for(i=0;i<B;i+) for(j=0;j<N;j+) printf("%3d",resultij); printf("n"); printf("nthe page is changed:n"); for(i=0
39、;i<N;i+) if(changei= -1) printf(" "); else printf("%3d",changei); printf("nabsent:%dn",absent); printf("the absent vote is:%fn",(float)absent/N);#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 12 #define B 3 #define P 5 int
40、 isInBuf(int buf, int x, int *p) int i, j = -1; for (i = 0; i < B; i+) if(bufi = x) j = i; break; else if (bufi = -1) (*p)+; bufi = x; j = i; break; if(j=-1) (*p)+; return j; int oldlru(int f ) int i, j = 0, max = -1; for (i = 0; i < B; i+) if(fi > max) max = fi; j = i; fi+; return j; int m
41、ain() int listN; int changeN; int bufB, fB, i, j,k; int resultBN; int old; int absent;srand(int)time(NULL); printf("n The Random List:n"); for (i = 0; i < N; i+) listi = rand() % P+1; printf("%3d", listi); printf("n-n"); printf("nLRU:n"); absent = 0; for(i
42、= 0; i < B; i+) bufi = fi = -1; for(i = 0; i < N; i+) j = isInBuf(buf, listi,&absent); old = oldlru(f); if(j= -1) changei=bufold; bufold = listi; fold = 0; else fj=0; changei=-1; for(k=0;k<B; k+) resultki=bufk; printf("the result is:n"); for(i=0;i<B;i+) for(j=0;j<N;j+) p
43、rintf("%3d",resultij); printf("n"); printf("nthe page is changed:n"); for(i=0;i<N;i+) if(changei= -1) printf(" "); else printf("%3d",changei); printf("nabsent:%dn",absent); printf("the absent vote is:%fn",(float)absent/N);實(shí)驗(yàn)結(jié)果及
44、分析【任務(wù)2】:參照前兩個(gè)算法自行編寫代碼,實(shí)現(xiàn)FIFO置換算法。程序?qū)嶒?yàn)結(jié)果及分析【任務(wù)3】:在一個(gè)程序中同時(shí)實(shí)現(xiàn)OPT,LRU和FIFO三種置換算法。程序?qū)嶒?yàn)結(jié)果及分析注意事項(xiàng)實(shí)驗(yàn)小結(jié)教師評語實(shí)驗(yàn)成績教師簽名實(shí)驗(yàn)日期實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目實(shí)驗(yàn)五:簡單多用戶文件系統(tǒng)實(shí)驗(yàn)?zāi)康耐ㄟ^一個(gè)簡單多用戶文件系統(tǒng)的設(shè)計(jì),加深理解文件系統(tǒng)的內(nèi)部功能及內(nèi)部實(shí)現(xiàn)實(shí)驗(yàn)器材PC、虛擬機(jī)實(shí)驗(yàn)內(nèi)容為LINUX 設(shè)計(jì)一個(gè)簡單的二級文件系統(tǒng)。要求做到以下幾點(diǎn):1、可以實(shí)現(xiàn)下列幾條命令(至少4條)Login用戶登錄Dir列文件目錄Create創(chuàng)建文件Delete刪除文件Open打開文件Close關(guān)閉文件Read讀文件Write寫文
45、件2、列目錄時(shí)要列出文件名、物理地址、保護(hù)碼和文件長度3、源文件可以進(jìn)行讀寫保護(hù)實(shí)驗(yàn)原理(指導(dǎo))(一)程序設(shè)計(jì)的思想系統(tǒng)采用兩級目錄,其中第一級對應(yīng)于用戶帳號,第二級對應(yīng)于用戶帳號下的文件。另外,為了簡單本文件系統(tǒng)未考慮文件共享、文件系統(tǒng)安全以及管道文件于設(shè)備文件等特殊內(nèi)容(二)主要文件操作的處理過程1、打開文件open 檢索目錄。內(nèi)核調(diào)用namei從根目錄或從當(dāng)前目錄,沿目錄樹查找指定的索引結(jié)點(diǎn)。若未找到或該文件不允許存取,則出錯(cuò)處理返回NULL,否則轉(zhuǎn)入下一步; 分配內(nèi)存索引結(jié)點(diǎn)。如果該文件已被其它用戶打開,只需對上一步中所找到的i結(jié)點(diǎn)引用計(jì)數(shù)+1,否則應(yīng)為被打開文件分配一內(nèi)存i結(jié)點(diǎn),并調(diào)
46、用磁盤讀過程將磁盤i結(jié)點(diǎn)的內(nèi)容拷貝到內(nèi)存i結(jié)點(diǎn)中,并設(shè)置i.count=1;分配文件表項(xiàng)。為已打開的文件分配一文件表項(xiàng),使表項(xiàng)中的f.inode 指向內(nèi)存索引結(jié)點(diǎn); 分配用戶文件描述表項(xiàng)。 2、創(chuàng)建文件creat 核心調(diào)用namei,從根目錄或當(dāng)前目錄開始,逐級向下查找指定的索引結(jié)點(diǎn)。此時(shí)有以下二種情況: 重寫文件。namei找到了指定i結(jié)點(diǎn),調(diào)用free釋放原有文件的磁盤塊。此時(shí)內(nèi)核忽略用戶指定的許可權(quán)方式和所有者,而保持原有文件的存取權(quán)限方式和文件主。最后打開。 新建。namei未找到。調(diào)用ialloc,為新創(chuàng)建的文件分配一磁盤索引結(jié)點(diǎn),并將新文件名及所分配到的i結(jié)點(diǎn)編號,寫入其父目錄中,
47、建立一新目錄項(xiàng)。 利用與open相同的方式,把新文件打開。3、關(guān)閉文件close 根據(jù)用戶文件描述符fd,從相應(yīng)的用戶文件描述符表項(xiàng)中,獲得指向文件表項(xiàng)的指針fp,再對該文件表項(xiàng)中的f.count-1。4、檢索目錄namei 用戶在第一次訪問某文件時(shí),需要使用文件的路徑名,系統(tǒng)按路徑名去檢索文件目錄,得到該文件的磁盤索引結(jié)點(diǎn),且返回給用戶一個(gè)fd。以后用戶便可利用該fd來訪問文件,這時(shí)系統(tǒng)不需再去檢索文件目錄。 namei根據(jù)用戶給出的路徑名,從高層到低層順序地查找各級目錄,尋找指定文件的索引結(jié)點(diǎn)號。檢索時(shí),對以'/'開頭的路徑名,須從根目錄開始檢索,否則,從當(dāng)前目錄開始,并把
48、與之對應(yīng)的i結(jié)點(diǎn)作為工作索引結(jié)點(diǎn),然后用文件路徑名中的第一分量名與根或與當(dāng)前目錄文件中的各目錄項(xiàng)的文件名,逐一進(jìn)行比較。由于一個(gè)目錄文件可能占用多個(gè)盤塊,在檢索完一個(gè)盤塊中所有目錄項(xiàng)而未找到匹配的文件分量名時(shí),須調(diào)用bmap和bread過程,將下一個(gè)盤塊中的所有目錄項(xiàng)讀出后,再逐一檢索。若檢索完該目錄文件的所有盤塊而仍未找到,才認(rèn)為無此文件分量名。 檢索方式采用Hash方法。(三)主要數(shù)據(jù)結(jié)構(gòu)1、i節(jié)點(diǎn) struct inode2、磁盤i節(jié)點(diǎn) struct dinode3、目錄項(xiàng)結(jié)構(gòu) struct direct4、超級塊 struct filsys5、用戶密碼 struct pwd6、目錄 struct dir7、查找內(nèi)存 i節(jié)點(diǎn)的hash表 struct hinode8、系統(tǒng)打開表 struct file9、用戶打開表 struct user(四)主要函數(shù)1、i節(jié)點(diǎn)內(nèi)容獲取函數(shù)iget( ) 2、i節(jié)點(diǎn)內(nèi)容釋放函數(shù)iput( ) 3、目錄創(chuàng)建函數(shù)mkdir( ) 4、目錄搜索函數(shù)namei( )5、磁盤塊分配函數(shù)balloc( )6、磁盤塊釋放函數(shù)bfree( )7、分配i節(jié)點(diǎn)區(qū)函數(shù)ialloc(
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年四川長江職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 2025至2030年中國三菱汽車空氣濾芯數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年中國陶瓷蓋碗市場調(diào)查研究報(bào)告
- 2025年中國紗線測濕儀市場調(diào)查研究報(bào)告
- 2025年中國玻璃圣誕工藝禮品市場調(diào)查研究報(bào)告
- 二零二五年度老舊小區(qū)改造工程承包協(xié)議書4篇
- 2025年度嬰幼兒奶粉行業(yè)數(shù)據(jù)統(tǒng)計(jì)分析與市場預(yù)測合同4篇
- 2025-2030全球發(fā)動(dòng)機(jī)泵行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025至2031年中國藺草產(chǎn)品行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年全球及中國工程車輛滅火系統(tǒng)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2024年社區(qū)警務(wù)規(guī)范考試題庫
- 2024年食用牛脂項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國戶外音箱行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報(bào)告
- 家務(wù)分工與責(zé)任保證書
- 兒童尿道黏膜脫垂介紹演示培訓(xùn)課件
- 北京地鐵13號線
- 2023山東春季高考數(shù)學(xué)真題(含答案)
- 為加入燒火佬協(xié)會(huì)致辭(7篇)
- 職業(yè)衛(wèi)生法律法規(guī)和標(biāo)準(zhǔn)培訓(xùn)課件
- 高二下學(xué)期英語閱讀提升練習(xí)(二)
- 民事訴訟證據(jù)清單模板
評論
0/150
提交評論