華科操作系統(tǒng)實(shí)驗(yàn)報(bào)告(共19頁(yè))_第1頁(yè)
華科操作系統(tǒng)實(shí)驗(yàn)報(bào)告(共19頁(yè))_第2頁(yè)
華科操作系統(tǒng)實(shí)驗(yàn)報(bào)告(共19頁(yè))_第3頁(yè)
華科操作系統(tǒng)實(shí)驗(yàn)報(bào)告(共19頁(yè))_第4頁(yè)
華科操作系統(tǒng)實(shí)驗(yàn)報(bào)告(共19頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 1課 程 實(shí) 驗(yàn) 報(bào) 告課程名稱: 操作系統(tǒng)(co zu x tn)原理 專業(yè)(zhuny)班級(jí): cs1209 學(xué) 號(hào): 姓 名: 指導(dǎo)(zhdo)教師: 報(bào)告日期: 2015年1月5日 計(jì)算機(jī)科學(xué)與技術(shù)(jsh)學(xué)院目錄(ml)1 實(shí)驗(yàn)(shyn)一 Linux線程及信號(hào)燈11.1 實(shí)驗(yàn)?zāi)康呐c內(nèi)容1 1.1.1實(shí)驗(yàn)?zāi)康? 1.1.2 實(shí)驗(yàn)內(nèi)容11.2 實(shí)驗(yàn)過(guò)程1 1.2.1 預(yù)備知識(shí)1 1.2.2 實(shí)驗(yàn)測(cè)試與結(jié)果21.3 實(shí)驗(yàn)總結(jié)31.4 源代碼42 實(shí)驗(yàn)二 Linux進(jìn)程及同步72.1 實(shí)驗(yàn)?zāi)康呐c內(nèi)容7 2.1.1 實(shí)驗(yàn)?zāi)康? 2.1.2 實(shí)驗(yàn)內(nèi)容72.2 實(shí)驗(yàn)過(guò)程7 2.2.1 預(yù)備

2、知識(shí)7 2.2.2 實(shí)驗(yàn)測(cè)試與結(jié)果82.3 實(shí)驗(yàn)總結(jié)92.4 源代碼93 實(shí)驗(yàn)三 Linux文件目錄操作133.1 實(shí)驗(yàn)?zāi)康呐c內(nèi)容13 3.1.1 實(shí)驗(yàn)?zāi)康?3 3.1.2 實(shí)驗(yàn)內(nèi)容133.2 實(shí)驗(yàn)過(guò)程13 3.2.1 預(yù)備知識(shí)13 3.2.2 實(shí)驗(yàn)測(cè)試與結(jié)果143.3 實(shí)驗(yàn)總結(jié)153.4 源代碼15第 頁(yè)1實(shí)驗(yàn)(shyn)一 Linux線程及信號(hào)燈1.1 實(shí)驗(yàn)(shyn)目的與內(nèi)容1.1.1實(shí)驗(yàn)(shyn)目的1、熟悉Linux線程接口。2、熟悉Linux信號(hào)燈編程。3、了解Linux進(jìn)程同步與通信的主要機(jī)制,并通過(guò)信號(hào)燈操作實(shí)現(xiàn)進(jìn)程間的同步與互斥。1.1.2 實(shí)驗(yàn)內(nèi)容編程模擬實(shí)現(xiàn)飛機(jī)售票:

3、創(chuàng)建多個(gè)售票線程;使用公用全局變量保存已售票數(shù)量;創(chuàng)建互斥信號(hào)燈;對(duì)售票線程臨界區(qū)實(shí)施P、V操作;編程模擬實(shí)現(xiàn)雙線程單緩沖區(qū)的合作創(chuàng)建一個(gè)計(jì)算線程與一個(gè)輸出線程;創(chuàng)建同步信號(hào)燈;緩沖區(qū)用全局公用數(shù)組變量;對(duì)計(jì)算線程與輸出線程實(shí)施P、V操作;1.2 實(shí)驗(yàn)過(guò)程1.2.1 預(yù)備知識(shí)Linux下的信號(hào)燈及其P、V操作:表1. SEQ 表1. * ARABIC 1 P、V操作定義 void p(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid,&sop,

4、1); void v(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1); 線程:表1. SEQ 表1. * ARABIC 2 線程相關(guān)函數(shù)線程創(chuàng)建pthread_create(pthread_t *thread, pthread_attr_t*attr,void *(*start_routine)(void *),void *arg);線程掛起pthread_join(pthread_t th, void *thread_retr

5、un); 共享內(nèi)存: 使用共享內(nèi)存是運(yùn)行在同一(tngy)計(jì)算機(jī)上的進(jìn)程進(jìn)行進(jìn)程間通信的最快的方法,shmget與shmat 系統(tǒng)(xtng)調(diào)用。 進(jìn)程(jnchng)控制: fork與execv系統(tǒng)調(diào)用; 編譯、編輯、調(diào)試表1. SEQ 表1. * ARABIC 3 編譯、編輯、調(diào)試編譯cc o test -g test.c lpthread cc o sub1 sub1.c編輯vi調(diào)試gdb1.2.2 實(shí)驗(yàn)測(cè)試與結(jié)果測(cè)試結(jié)果:模擬售票說(shuō)明(圖1.1.1和1.1.2):共有300張票,有三個(gè)線程分別代表三個(gè)售票窗口圖1.1.1圖1.1.2說(shuō)明(圖1.1.3和1.1.4):每個(gè)窗口(chun

6、gku)每次只賣出一張,直到賣完 圖1.1.3 圖1.1.4測(cè)試結(jié)果(ji gu):雙線程單緩沖區(qū)的合作圖1.21.3 實(shí)驗(yàn)(shyn)總結(jié)本次實(shí)驗(yàn)剛做的時(shí)候用三個(gè)線程做依次訪問(wèn)賣幾張來(lái)賣出,后來(lái)老師讓我改成每次買一張直到賣完,做出來(lái)了,但是我加的循環(huán)體加的位置不對(duì),運(yùn)行一兩次可能沒(méi)問(wèn)題,但運(yùn)行幾萬(wàn)次可能會(huì)出現(xiàn)問(wèn)題,此bug老師給我指出的,程序還有待優(yōu)化。1.4 源代碼1:#include #include #include #include #include int ticket=300;int mutex;void p(int semid,int semno) struct sembuf

7、sop; sop.sem_num=semno; sop.sem_op=-1; sop.sem_flg=0; semop(semid,&sop,1);void v(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1);void thread1(void) int i; p(mutex,0); printf(窗口1:本航班共有%d個(gè)座位,請(qǐng)問(wèn)(qngwn)您需要買幾張?n,ticket); scanf(%d,&i); if(iticket

8、) printf(窗口1:剩余(shngy)票數(shù)不夠); else ticket=ticket-i; v(mutex,0);void thread2(void) int i; p(mutex,0); printf(窗口2:本航班共有(n yu)%d個(gè)座位,請(qǐng)問(wèn)您需要買幾張?n,ticket); scanf(%d,&i); if(iticket) printf(窗口2:剩余(shngy)票數(shù)不夠); else ticket=ticket-i; v(mutex,0);void thread3(void) int i; p(mutex,0); printf(窗口(chungku)3:本航班共有%d個(gè)

9、座位,請(qǐng)問(wèn)您需要買幾張?n,ticket); scanf(%d,&i); if(iticket) printf(窗口3:剩余票數(shù)不夠); else ticket=ticket-i; v(mutex,0);int main() pthread_t id1,id2,id3; int ret1,ret2,ret3; union semun arg; mutex =semget(IPC_PRIVATE,IPC_CREAT); arg.val = 1; semctl(mutex,0,IPC_RMID,0); ret1=pthread_create(&id1,NULL,(void*)thread1,NUL

10、L); ret2=pthread_create(&id2,NULL,(void*)thread2,NULL); ret3=pthread_create(&id3,NULL,(void*)thread3,NULL); if(ret1!=0) printf(Creat 1st pthread error!n); exit(1); if(ret2!=0) printf(Creat 2st pthread error!n); exit(1); if(ret3!=0) printf(Creat 3st pthread error!n); exit(1); pthread_join(id1,NULL);

11、pthread_join(id2,NULL); pthread_join(id3,NULL); return 0; 2:#include#include#include#include#includeint q100;int m;int w=0;void P(int semid,int semno)struct sembuf sop;sop.sem_num=semno;sop.sem_op=-1;sop.sem_flg=0;semop(semid,&sop,1);void V(int semid, int semno)struct sembuf sop;sop.sem_num=semno;so

12、p.sem_op=1;sop.sem_flg=0;semop(semid,&sop,1);void pa()P(m,1);w+;qw+=1;V(m,0);void pb()P(m,0);printf(jieguo = %dn,qw);w-;V(m,1);int main(void)pthread_t id1;pthread_t id2;pthread_t id3;pthread_t id4;int i,ret1,ret2;union semun arg;arg.val=0;m=semget(IPC_PRIVATE,2,IPC_CREAT|066);semctl(m,0,SETVAL,arg);

13、arg.val=1;semctl(m,1,SETVAL,arg);ret1=pthread_create(&id1,NULL,(void*)pa,NULL);if(ret1!=0)printf(create pthread error!n);exit (1); printf(id is %dn,id1);ret2=pthread_create(&id2,NULL,(void*)pb,NULL);if(ret2!=0)printf(create pthread error!n);exit (1); printf(id is %dn,id2);pthread_join(id1,NULL);pthr

14、ead_join(id2,NULL);return 0;實(shí)驗(yàn)二 Linux進(jìn)程(jnchng)及同步2.1 實(shí)驗(yàn)(shyn)目的與內(nèi)容2.1.1 實(shí)驗(yàn)(shyn)目的了解并掌握Linux進(jìn)程及同步2.2.2 實(shí)驗(yàn)內(nèi)容 編程模擬實(shí)現(xiàn)謄抄; 創(chuàng)建三個(gè)謄抄進(jìn)程; 基于共享內(nèi)存建立緩沖區(qū); 創(chuàng)建同步信號(hào)燈; 對(duì)各謄抄進(jìn)程施加P、V操作;2.2 實(shí)驗(yàn)過(guò)程 2.2.1 預(yù)備知識(shí)并發(fā)程序的謄抄:get程序:負(fù)責(zé)從輸入序列f中讀取字符并送到緩沖區(qū)s中;copy程序:把緩沖區(qū)s中的數(shù)據(jù)復(fù)制到緩沖區(qū)t中去;put程序:從緩沖區(qū)t中取出數(shù)據(jù)打??;謄抄的實(shí)現(xiàn):在相應(yīng)的圓圈對(duì)應(yīng)的進(jìn)程中,通過(guò)修改箭頭上對(duì)應(yīng)序號(hào)的信號(hào)燈控

15、制進(jìn)程的運(yùn)行,設(shè)有4個(gè)信號(hào)燈分別為0、1、2、3在進(jìn)程中對(duì)信號(hào)燈的控制(kngzh)可簡(jiǎn)寫為:get()p(0);get操作;v(2);copy()p(1);p(2);copy操作;v(0);v(3);put()p(3);put操作;v(1);通過(guò)設(shè)置信號(hào)燈0的初值和利用copy對(duì)信號(hào)燈0做v操作,使得當(dāng)信號(hào)燈0的資源個(gè)數(shù)0時(shí),可以進(jìn)行g(shù)et操作通過(guò)設(shè)置信號(hào)燈1、2的初值和利用put對(duì)信號(hào)燈1做v操作、利用get對(duì)信號(hào)燈2做v操作,使得當(dāng)信號(hào)燈1和信號(hào)燈2的資源個(gè)數(shù)均0時(shí),可以進(jìn)行copy操作通過(guò)設(shè)置信號(hào)燈3的初值和利用copy對(duì)信號(hào)燈3做v操作,使得當(dāng)信號(hào)燈3的資源個(gè)數(shù)0時(shí),可以進(jìn)行put操

16、作2.2.2 實(shí)驗(yàn)(shyn)測(cè)試與結(jié)果運(yùn)行(ynxng)結(jié)果:圖2使用./main打開(kāi)程序2.3 實(shí)驗(yàn)總結(jié)通過(guò)此次實(shí)驗(yàn)了解了進(jìn)程的創(chuàng)建,知道了進(jìn)程與線程的區(qū)別。編寫的程序輸出固定的幾個(gè)字符,功能上沒(méi)做好,欠佳,有待優(yōu)化。2.4 源代碼頭文件m.h#include #include #include #include #include #include #include #include #define LOOPS 10#define IPCKEY (key_t)0 x11#define SHMKEY1 (key_t)0 x222#define SHMKEY2 (key_t)0 x333voi

17、d P(int semid,int index);void V(int semid,int index);int semid;void V(int semid,int index) struct sembuf sem; sem.sem_num = index;/*信號(hào)燈數(shù)組燈的一個(gè)索引,指明(zhmng)哪個(gè)信號(hào)燈*/ sem.sem_op = 1;/*加到當(dāng)前信號(hào)燈的數(shù)值(shz)*/ sem.sem_flg = 0; semop(semid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num

18、 = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;Main.c#includem.hint main(void) int res,i; struct shmid_ds *buf; int cmd; int shmid1,shmid2; char *s,*t; pid_t p1,p2,p3; semid = semget(IPCKEY,4,IPC_CREAT|0666); res = semctl(semid,0,SETVAL,0); res = semctl(semid,1,SETVAL,1); re

19、s = semctl(semid,2,SETVAL,0); res = semctl(semid,3,SETVAL,1); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); printf(%d,shmid1); s=(char *)shmat(shmid1,NULL,NULL); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); if(p1=fork() = 0) execv(./get,NULL); else

20、 if(p2=fork() = 0) execv(./copy,NULL); else if(p3=fork()=0) execv(./put,NULL); p1=wait(&p1); p2=wait(&p2); p3=wait(&p3); if(semctl(semid,0,IPC_RMID,0)%cn,*t); else printf(put0n); V(semid,3); while(t0!=0); 實(shí)驗(yàn)(shyn)三 Linux文件目錄操作3.1 實(shí)驗(yàn)?zāi)康?md)與內(nèi)容3.1.1 實(shí)驗(yàn)(shyn)目的了解(lioji)并掌握Linux文件目錄結(jié)構(gòu)(jigu)3.1.2 實(shí)驗(yàn)內(nèi)容編程實(shí)現(xiàn)

21、目錄查詢命令;功能類似ls -lR;查詢指定目錄下的文件及子目錄信息;顯示文件的類型、大小、時(shí)間等信息;遞歸顯示子目錄中的文件信息;3.2 實(shí)驗(yàn)過(guò)程3.2.1 預(yù)備知識(shí)Linux文件屬性接口:表3. SEQ 表3. * ARABIC 1 文件屬性接口函數(shù)功能int fstat(int fildes,struct stat *buf);返回文件描述符相關(guān)的文件的狀態(tài)信息int lstat(const char *path, struct stat *buf);如讀取到了符號(hào)連接,讀取符號(hào)連接本身的狀態(tài)信息int stat(const char *path, struct stat *buf);如

22、讀取到了符號(hào)連接,讀取的是符號(hào)連接指向文件的信息stat結(jié)構(gòu)體幾乎保存了所有的文件狀態(tài)信息:本程序中主要用到st_mode 文件的權(quán)限信息和類型信息,檢查類型時(shí)使用S_ISDIR(); 宏,檢查是否是目錄Linux目錄結(jié)構(gòu)接口:表3. SEQ 表3. * ARABIC 2 目錄結(jié)構(gòu)接口函數(shù)功能DIR *opendir(const char *name);通過(guò)路徑打開(kāi)一個(gè)目錄,返回一個(gè)DIR結(jié)構(gòu)體指針(目錄流),失敗返回NULL;struct dirent *readdir(DIR *)讀取目錄中的下一個(gè)目錄項(xiàng),沒(méi)有目錄項(xiàng)可以讀取時(shí),返回為NULL;int chdir(const char *path);改變目錄,與用戶通過(guò)cd命令改變目錄一樣,程序也可以通過(guò)chdir來(lái)改變目錄,這樣使得 fopen(),opendir(),這里需要路徑的系統(tǒng)調(diào)用,可以使用相對(duì)于當(dāng)前目錄的相對(duì)路徑打開(kāi)文件(目錄)。int closedir(DIR*)關(guān)閉目錄流在本程序中,用到結(jié)構(gòu)dirent中的char d_name256; (文件名)項(xiàng) 3.2.2 實(shí)驗(yàn)測(cè)試(csh)與結(jié)果運(yùn)行(ynxng)結(jié)果:說(shuō)明(shumng):圖3.1為打開(kāi)指定某一文件夾里的目錄內(nèi)容;圖3.2為根目錄的內(nèi)容圖3.1圖3.23

溫馨提示

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

評(píng)論

0/150

提交評(píng)論