操作系統(tǒng)課程設(shè)計63775_第1頁
操作系統(tǒng)課程設(shè)計63775_第2頁
操作系統(tǒng)課程設(shè)計63775_第3頁
操作系統(tǒng)課程設(shè)計63775_第4頁
操作系統(tǒng)課程設(shè)計63775_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一、 課設(shè)題目 Linux系統(tǒng)管理實踐與進(jìn)程通信實現(xiàn)二、 課設(shè)內(nèi)容1、Linux系統(tǒng)的熟悉與常用操作命令的掌握。2、Linux環(huán)境下進(jìn)程通信的實現(xiàn)。(實現(xiàn)m個生產(chǎn)者n個消費(fèi)者的同步互斥問題,緩沖區(qū)大小k=5,m=2,n=2)三、 Linux環(huán)境介紹Linux是一類Unix計算機(jī)操作系統(tǒng)的統(tǒng)稱。Linux操作系統(tǒng)的內(nèi)核的名字也是“Linux”。Linux操作系統(tǒng)也是自由軟件和開放源代碼發(fā)展中最著名的例子。嚴(yán)格來講,Linux這個詞本身只表示Linux內(nèi)核,但在實際上人們已經(jīng)習(xí)慣了用Linux來形容整個基于Linux內(nèi)核,并且使用GNU 工程各種工具和數(shù)據(jù)庫的操作系統(tǒng)。Linux得名于計算機(jī)業(yè)余愛

2、好者Linus Torvalds。理解Linux文件系統(tǒng)標(biāo)準(zhǔn)/:根目錄,系統(tǒng)中所有的目錄都是從根目錄開始 /bin: 存放常用命令 /boot: 引導(dǎo)核心的程序目錄 /dev: 外部設(shè)備名 /etc: (etcetera)系統(tǒng)管理所要的配置文件和子目錄 /home:存放用戶主目錄的地方,一般是/home/用戶名。其他目錄有ftp、httpd、samba等 /lib:(library)系統(tǒng)基本的動態(tài)鏈接庫 /lost+found /opt :optional(可以選擇的) /proc:虛擬系統(tǒng),是由系統(tǒng)初起時在內(nèi)存中產(chǎn)生的 /root:超級用戶默認(rèn)的主目錄; /sbin:系統(tǒng)管理員使用的系統(tǒng)管理

3、程序 /tmp:存放各程序執(zhí)行時所產(chǎn)生的臨時文件 /usr:占空間最大的目錄,用戶的很多應(yīng)用程序和文件幾乎全在這個目錄中 /var:存放一些系統(tǒng)記錄文件和配置文件四、 常用命令介紹(1)顯示目錄文件 ls(2)建新目錄 mkdir(3)刪除目錄rmdir(4) 改變工作目錄位置 cd(5)顯示當(dāng)前所在目錄pwd(6)查看文件(可以是二進(jìn)制的)內(nèi)容 cat(7)刪除文件 rm(8)復(fù)制文件 cp(9)移動或更改文件、目錄名稱mv(10)編譯文件gcc options filenames(11)執(zhí)行文件 ./可執(zhí)行文件名(12)掛載U盤及刪除f-disk lcd /mntmkdir *mount

4、/dev/sdb1 /mnt/*cd /mnt/*ls umount /mnt/*五、 程序設(shè)計思想這個程序要實現(xiàn)兩個生產(chǎn)者和兩個消費(fèi)者共享一個存儲區(qū),且存儲區(qū)的大小為5,所以首先要建立一個共享存儲區(qū),還要設(shè)置一個互斥信號量,一個消費(fèi)者同步信號量,一個生產(chǎn)者同步信號量。建立了共享存儲區(qū)和信號量后,我們還需要寫P、V操作的兩個函數(shù)。最后在生產(chǎn)者和消費(fèi)者的程序中實現(xiàn)對共享存儲區(qū)的訪問,生產(chǎn)或者消費(fèi)一件產(chǎn)品的具體過程。六、 程序流程control程序:開始N開辟存儲區(qū)并判斷是否已經(jīng)存在YN是否需要刪除該緩沖區(qū)Y刪除已經(jīng)存在的緩沖區(qū)和相關(guān)的信號量創(chuàng)建三個信號量給信號量賦初值結(jié)束生產(chǎn)者的程序流程:開始取

5、共享緩沖區(qū)地址,連接共享緩沖區(qū)生產(chǎn)者生產(chǎn)一個產(chǎn)品P(&semid_producer)P(&semid_mutex)將產(chǎn)品放入共享存儲區(qū)P(&semid_consumer)P(&semid_mutex)結(jié)束消費(fèi)者的程序流程:開始取共享緩沖區(qū)地址,連接共享緩沖區(qū)P(&semid_consumer)P(&semid_mutex)將產(chǎn)品取出共享存儲區(qū)P(&semid_producer)P(&semid_mutex)消費(fèi)者消費(fèi)一個產(chǎn)品結(jié)束七、 數(shù)據(jù)結(jié)構(gòu)該程序用了結(jié)構(gòu)體來設(shè)置信號量八、 源代碼Control程序:#include #include #include #include #include #i

6、nclude #define SHMKEY 9075 /*共享存儲區(qū)的鍵*/#define SEMKEY_PRODUCER 9085 #define SEMKEY_CONSUMER 9086 #define SEMKEY_MUTEX 9087 /*信號量數(shù)組的鍵*/*注意:上面的鍵在系統(tǒng)中必須唯一*/#define BUFF_LEN 5 /*緩沖區(qū)可以存放5個產(chǎn)品*/#define PRODUCT_LEN 32 /*每個產(chǎn)品是一個字符串:sem_num=semnum; sem-sem_op=semop; sem-sem_flg=semflg; main() char *addr, end; i

7、nt shmid; int semid_producer, semid_consumer, semid_mutex;/*信號量id*/ struct sembuf sem_tmp; /*開辟共享存儲區(qū)*/ if (shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+2, 0777|IPC_CREAT|IPC_EXCL) = -1) if (errno = EEXIST) printf(The Buffer Has Existed!n); printf(Do You Want To Delete The Buffer(Y = yes)?n=:); scan

8、f(%c, &end); if(end = y | end = Y) /* 共享存儲區(qū)、信號量并不隨程序的結(jié)束而被刪除,如果我們沒刪除的話, 可以用ipcs命令查看,用ipcrm刪除 */ /*釋放緩沖區(qū)*/ shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+2, 0777); if (shmctl(shmid,IPC_RMID,0) 0) perror(shmctl:); /*同時釋放信號量*/ semid_mutex = semget(SEMKEY_MUTEX,1, 0777); semid_consumer = semget(SEMKEY_CON

9、SUMER,1, 0777); semid_producer = semget(SEMKEY_PRODUCER,1, 0777); semctl(semid_mutex,0,IPC_RMID); semctl(semid_consumer,0,IPC_RMID); semctl(semid_producer,0,IPC_RMID); else printf(Fail To Create Buffer!n); return -1; addr = (char*)shmat(shmid, 0, 0);/*連接緩沖區(qū)*/ memset(addr, 0, BUFF_LEN * PRODUCT_LEN+2

10、); shmdt(addr); /*離開緩沖區(qū)*/ /*創(chuàng)建3個信號量:1個用于對緩沖區(qū)互斥,2個用于生產(chǎn)者、消費(fèi)者同步*/ if(semid_mutex = semget(SEMKEY_MUTEX,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY_MUTEX Has Existed!n); else printf(Fail To Create SEMKEY_MUTEX!n); return -1; if(semid_consumer = semget(SEMKEY_CONSUMER,1, 0777|IP

11、C_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEMKEY_CONSUMER Has Existed!n); else printf(Fail To Create SEMKEY_CONSUMER!n); return -1; if(semid_producer = semget(SEMKEY_PRODUCER,1, 0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST) printf(The SEM_PRODUCER Has Existed!n); else printf(Fail To Cr

12、eate SEM_PRODUCER!n); return -1; /*給信號量賦初值*/ set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/ semop(semid_producer, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 0, 0);/*0*/ semop(semid_consumer, &sem_tmp,1); set_sembuf_struct(&sem_tmp, 0, 1, 0);/*1*/ semop(semid_mutex, &sem_tmp,1); return 0;/

13、*生產(chǎn)者:producer.c*/#include #include #include #include #include #include #define SHMKEY 9075 /*共享存儲區(qū)的鍵*/#define SEMKEY_PRODUCER 9085 #define SEMKEY_CONSUMER 9086 #define SEMKEY_MUTEX 9087 /*信號量數(shù)組的鍵*/*注意:上面的鍵在系統(tǒng)中必須唯一*/#define BUFF_LEN 5 /*緩沖區(qū)可以存放5個產(chǎn)品*/#define PRODUCT_LEN 32 /*每個產(chǎn)品是一個字符串:=32字符*/*下面的P,V是

14、對系統(tǒng)調(diào)用的簡單封裝*/int P(int semid) struct sembuf p_buf; p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; if(semop(semid, &p_buf, 1)=-1)/*semop參見課件ppt*/ perror (p (semid) falsed); exit (1); else return (0);int V(int semid) struct sembuf v_buf;/*struct sembuf 參見課件ppt*/ v_buf.sem_num = 0; v_buf.sem_o

15、p = 1; v_buf.sem_flg = 0; if(semop(semid, &v_buf, 1)=-1) perror ( v (semid) failed); exit (1); else return (0);main() char *p_buffer;/*共享存儲區(qū)地址*/ unsigned char in;/*生產(chǎn)者存放產(chǎn)品的指針:它的值存放在全局緩沖區(qū)第一個字節(jié)*/ char product128;/*事實只使用32B,128為了避免屏幕輸入超過32*/ int shmid;/*共享存儲區(qū)id*/ int semid_producer, semid_consumer, sem

16、id_mutex;/*信號量集合id*/ shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+2, 0777);/*連接共享存儲區(qū):2 存放in,out的值*/ p_buffer = (char*)shmat(shmid, 0, 0);/*取共享存儲區(qū)地址*/ semid_mutex = semget(SEMKEY_MUTEX,1, 0777);/*獲取全局信號量id*/ semid_producer = semget(SEMKEY_PRODUCER,1, 0777); semid_consumer = semget(SEMKEY_CONSUMER,1,

17、 0777); /*從屏幕接收產(chǎn)品*/ printf(Please Product(a string ,length = 32B):n=:); gets(product);/*128的意義在此,此函數(shù)不檢查字符串長度*/ /*進(jìn)入臨界區(qū)*/ P(semid_producer);/*對私有信號量作P操作*/ P(semid_mutex);/*對公有信號量作P操作*/*二者順序不能換*/ in = (unsigned char)(*p_buffer); strncpy(p_buffer + 2 + in * PRODUCT_LEN, product, PRODUCT_LEN); in = (in

18、+ 1) % BUFF_LEN; *p_buffer = (char)in; shmdt(p_buffer); /*離開緩沖區(qū)*/ /*離開臨界區(qū)*/ V(semid_consumer); V(semid_mutex);/*消費(fèi)者:consumer.c*/#include #include #include #include #include #include #define SHMKEY 9075 /*共享存儲區(qū)的鍵*/#define SEMKEY_PRODUCER 9085 #define SEMKEY_CONSUMER 9086 #define SEMKEY_MUTEX 9087 /*信

19、號量數(shù)組的鍵*/*注意:上面的鍵在系統(tǒng)中必須唯一*/#define BUFF_LEN 5 /*緩沖區(qū)可以存放5個產(chǎn)品*/#define PRODUCT_LEN 32 /*每個產(chǎn)品是一個字符串:=32字符*/*下面的P,V是對系統(tǒng)調(diào)用的簡單封裝*/int P(int semid) struct sembuf p_buf;/*struct sembuf 參見課件ppt*/ p_buf.sem_num = 0; p_buf.sem_op = -1; p_buf.sem_flg = 0; if(semop(semid, &p_buf, 1)=-1)/*semop參見課件ppt*/ perror (p

20、(semid) falsed); exit (1); else return (0);int V(int semid) struct sembuf v_buf; v_buf.sem_num = 0; v_buf.sem_op = 1; v_buf.sem_flg = 0; if(semop(semid, &v_buf, 1)=-1) perror ( v (semid) failed); exit (1); else return (0);main() char *p_buffer;/*共享存儲區(qū)地址*/ unsigned char out;/*消費(fèi)者取出產(chǎn)品的指針:它的值存放在全局緩沖區(qū)第二個字節(jié)*/ char product33;/*它的數(shù)據(jù)從緩沖區(qū)中取*/ int shmid;/*共享存儲區(qū)id*/ int semid_producer, semid_consumer, semid_mutex;/*信號量集合id*/ shmid = shmget(SHMKEY, BUFF_LEN * PRODUCT_LEN+2, 0777);/*連接共享存儲區(qū):2 存放in,out的值*/ p_buff

溫馨提示

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

評論

0/150

提交評論