華科操作系統(tǒng)實驗報告_第1頁
華科操作系統(tǒng)實驗報告_第2頁
華科操作系統(tǒng)實驗報告_第3頁
華科操作系統(tǒng)實驗報告_第4頁
華科操作系統(tǒng)實驗報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

2、.92.4 源代碼.93 實驗三 Linux文件目錄操作.133.1 實驗?zāi)康呐c內(nèi)容.13 3.1.1 實驗?zāi)康?13 3.1.2 實驗內(nèi)容.133.2 實驗過程.13 3.2.1 預(yù)備知識.13 3.2.2 實驗測試與結(jié)果.143.3 實驗總結(jié).153.4 源代碼.1521實驗一 Linux線程及信號燈1.1 實驗?zāi)康呐c內(nèi)容1.1.1實驗?zāi)康?、熟悉Linux線程接口。2、熟悉Linux信號燈編程。3、了解Linux進程同步與通信的主要機制,并通過信號燈操作實現(xiàn)進程間的同步與互斥。1.1.2 實驗內(nèi)容1、 編程模擬實現(xiàn)飛機售票:創(chuàng)建多個售票線程;使用公用全局變量保存已售票數(shù)量;創(chuàng)建互斥信號燈

3、;對售票線程臨界區(qū)實施P、V操作;2、 編程模擬實現(xiàn)雙線程單緩沖區(qū)的合作創(chuàng)建一個計算線程與一個輸出線程;創(chuàng)建同步信號燈;緩沖區(qū)用全局公用數(shù)組變量;對計算線程與輸出線程實施P、V操作;1.2 實驗過程1.2.1 預(yù)備知識Linux下的信號燈及其P、V操作:表1. 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,1); void v(int semid,int semno) struct sem

4、buf sop; sop.sem_num=semno; sop.sem_op=1; sop.sem_flg=0; semop(semid,&sop,1); 線程:表1. 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_retrun); 共享內(nèi)存: 使用共享內(nèi)存是運行在同一計算機上的進程進行進程間通信的最快的方法,shmget與shma

5、t 系統(tǒng)調(diào)用。 進程控制: fork與execv系統(tǒng)調(diào)用; 編譯、編輯、調(diào)試表1. 3 編譯、編輯、調(diào)試編譯cc o test -g test.c lpthread cc o sub1 sub1.c編輯vi調(diào)試gdb1.2.2 實驗測試與結(jié)果測試結(jié)果:模擬售票說明(圖1.1.1和1.1.2):共有300張票,有三個線程分別代表三個售票窗口圖1.1.1圖1.1.2說明(圖1.1.3和1.1.4):每個窗口每次只賣出一張,直到賣完 圖1.1.3 圖1.1.4測試結(jié)果:雙線程單緩沖區(qū)的合作圖1.21.3 實驗總結(jié)本次實驗剛做的時候用三個線程做依次訪問賣幾張來賣出,后來老師讓我改成每次買一張直到賣完,

6、做出來了,但是我加的循環(huán)體加的位置不對,運行一兩次可能沒問題,但運行幾萬次可能會出現(xiàn)問題,此bug老師給我指出的,程序還有待優(yōu)化。1.4 源代碼1:#include <stdio.h>#include <pthread.h>#include <linux/sem.h>#include <sys/types.h>#include <stdlib.h>int ticket=300;int mutex;void p(int semid,int semno) struct sembuf sop; sop.sem_num=semno; sop.

7、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個座位,請問您需要買幾張?n",ticket); scanf("%d",&i); if(i>t

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

9、 p(mutex,0); printf("窗口3:本航班共有%d個座位,請問您需要買幾張?n",ticket); scanf("%d",&i); if(i>ticket) 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;

10、semctl(mutex,0,IPC_RMID,0); ret1=pthread_create(&id1,NULL,(void*)thread1,NULL); 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 p

11、thread error!n"); exit(1); if(ret3!=0) printf("Creat 3st pthread error!n"); exit(1); pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_join(id3,NULL); return 0; 2:#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<linux/sem.h>#include<sys/t

12、ypes.h>int 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;sop.sem_op=1;sop.sem_flg=0;semop(semid,&sop,1);void pa()P(m,1);w+;qw+=1;V(m,0);void

13、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);arg.val=1;semctl(m,1,SETVAL,arg);ret1=pthread_create(&id1,NULL,(vo

14、id*)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);pthread_join(id2,N

15、ULL);return 0;實驗二 Linux進程及同步2.1 實驗?zāi)康呐c內(nèi)容2.1.1 實驗?zāi)康牧私獠⒄莆誏inux進程及同步2.2.2 實驗內(nèi)容 編程模擬實現(xiàn)謄抄; 創(chuàng)建三個謄抄進程; 基于共享內(nèi)存建立緩沖區(qū); 創(chuàng)建同步信號燈; 對各謄抄進程施加P、V操作;2.2 實驗過程 2.2.1 預(yù)備知識并發(fā)程序的謄抄:get程序:負(fù)責(zé)從輸入序列f中讀取字符并送到緩沖區(qū)s中;copy程序:把緩沖區(qū)s中的數(shù)據(jù)復(fù)制到緩沖區(qū)t中去;put程序:從緩沖區(qū)t中取出數(shù)據(jù)打?。恢`抄的實現(xiàn):在相應(yīng)的圓圈對應(yīng)的進程中,通過修改箭頭上對應(yīng)序號的信號燈控制進程的運行,設(shè)有4個信號燈分別為0、1、2、3在進程中對信號燈的控

16、制可簡寫為:get()p(0);get操作;v(2);copy()p(1);p(2);copy操作;v(0);v(3);put()p(3);put操作;v(1);通過設(shè)置信號燈0的初值和利用copy對信號燈0做v操作,使得當(dāng)信號燈0的資源個數(shù)>0時,可以進行g(shù)et操作通過設(shè)置信號燈1、2的初值和利用put對信號燈1做v操作、利用get對信號燈2做v操作,使得當(dāng)信號燈1和信號燈2的資源個數(shù)均>0時,可以進行copy操作通過設(shè)置信號燈3的初值和利用copy對信號燈3做v操作,使得當(dāng)信號燈3的資源個數(shù)>0時,可以進行put操作2.2.2 實驗測試與結(jié)果運行結(jié)果:圖2使用./main

17、打開程序2.3 實驗總結(jié)通過此次實驗了解了進程的創(chuàng)建,知道了進程與線程的區(qū)別。編寫的程序輸出固定的幾個字符,功能上沒做好,欠佳,有待優(yōu)化。2.4 源代碼頭文件m.h#include <sys/types.h>#include <sys/sem.h>#include <semaphore.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/shm.h>#define LO

18、OPS 10#define IPCKEY (key_t)0x11#define SHMKEY1 (key_t)0x222#define SHMKEY2 (key_t)0x333void 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;/*信號燈數(shù)組燈的一個索引,指明哪個信號燈*/ sem.sem_op = 1;/*加到當(dāng)前信號燈的數(shù)值*/ sem.sem_flg = 0; semop(se

19、mid,&sem,1); return; void P(int semid,int index) struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return;Main.c#include"m.h"int main(void) int res,i; struct shmid_ds *buf; int cmd; int shmid1,shmid2; char *s,*t; pid_t p1,p2,p3; semid =

20、semget(IPCKEY,4,IPC_CREAT|0666); res = semctl(semid,0,SETVAL,0); res = semctl(semid,1,SETVAL,1); res = 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(SHM

21、KEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); if(p1=fork() = 0) execv("./get",NULL); else 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,IP

22、C_RMID,0)<0) printf("error"); shmctl(shmid1,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); return 0;Get.c#include"m.h"int main(void) int i=0; int shmid1; char *s,*t,str="linux!" semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s

23、=(char *)shmat(shmid1,NULL,NULL); do P(semid,1); *s=stri; printf("getn"); i+; V(semid,0); while(s0!='0'); Copy.c#include"m.h"int main(void) int j=0; int shmid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666

24、); s=(char *)shmat(shmid1,NULL,NULL); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); do P(semid,0); P(semid,3); strcpy(t,s); printf("copyn"); V(semid,2); V(semid,1); while(t0!='0'); Put.c#include"m.h"int main(void) int k=0; int sh

25、mid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); do /*if(t0='0')break;*/ P(semid,2); if(t0!='0')printf("put->%cn",*t); else printf("put->0n"); V(semid,3

26、); while(t0!='0'); 實驗三 Linux文件目錄操作3.1 實驗?zāi)康呐c內(nèi)容3.1.1 實驗?zāi)康牧私獠⒄莆誏inux文件目錄結(jié)構(gòu)3.1.2 實驗內(nèi)容編程實現(xiàn)目錄查詢命令;功能類似ls -lR;查詢指定目錄下的文件及子目錄信息;顯示文件的類型、大小、時間等信息;遞歸顯示子目錄中的文件信息;3.2 實驗過程3.2.1 預(yù)備知識Linux文件屬性接口:表3. 1 文件屬性接口函數(shù)功能int fstat(int fildes,struct stat *buf);返回文件描述符相關(guān)的文件的狀態(tài)信息int lstat(const char *path, struct stat

27、 *buf);如讀取到了符號連接,讀取符號連接本身的狀態(tài)信息int stat(const char *path, struct stat *buf);如讀取到了符號連接,讀取的是符號連接指向文件的信息stat結(jié)構(gòu)體幾乎保存了所有的文件狀態(tài)信息:本程序中主要用到st_mode 文件的權(quán)限信息和類型信息,檢查類型時使用S_ISDIR(); 宏,檢查是否是目錄Linux目錄結(jié)構(gòu)接口:表3. 2 目錄結(jié)構(gòu)接口函數(shù)功能DIR *opendir(const char *name);通過路徑打開一個目錄,返回一個DIR結(jié)構(gòu)體指針(目錄流),失敗返回NULL;struct dirent *readdir(DI

28、R *)讀取目錄中的下一個目錄項,沒有目錄項可以讀取時,返回為NULL;int chdir(const char *path);改變目錄,與用戶通過cd命令改變目錄一樣,程序也可以通過chdir來改變目錄,這樣使得 fopen(),opendir(),這里需要路徑的系統(tǒng)調(diào)用,可以使用相對于當(dāng)前目錄的相對路徑打開文件(目錄)。int closedir(DIR*)關(guān)閉目錄流在本程序中,用到結(jié)構(gòu)dirent中的char   d_name256; (文件名)項 3.2.2 實驗測試與結(jié)果運行結(jié)果:說明:圖3.1為打開指定某一文件夾里的目錄內(nèi)容;圖3.2為根目錄的內(nèi)容圖3.1圖3.23.3 實驗總結(jié)本程序顯示包含目錄下的文件名及深度、目錄名與深度,功能上創(chuàng)建時間等還未作出,有待改良。3.4 源代碼

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論