![北京工業(yè)大學-操作系統(tǒng)實驗報告_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/e1e627f4-befe-4724-a9b2-a5e6ea38458d/e1e627f4-befe-4724-a9b2-a5e6ea38458d1.gif)
![北京工業(yè)大學-操作系統(tǒng)實驗報告_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/e1e627f4-befe-4724-a9b2-a5e6ea38458d/e1e627f4-befe-4724-a9b2-a5e6ea38458d2.gif)
![北京工業(yè)大學-操作系統(tǒng)實驗報告_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/e1e627f4-befe-4724-a9b2-a5e6ea38458d/e1e627f4-befe-4724-a9b2-a5e6ea38458d3.gif)
![北京工業(yè)大學-操作系統(tǒng)實驗報告_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/e1e627f4-befe-4724-a9b2-a5e6ea38458d/e1e627f4-befe-4724-a9b2-a5e6ea38458d4.gif)
![北京工業(yè)大學-操作系統(tǒng)實驗報告_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/22/e1e627f4-befe-4724-a9b2-a5e6ea38458d/e1e627f4-befe-4724-a9b2-a5e6ea38458d5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統(tǒng)實驗報告姓名: xxx 學號: 110703xx完成時間:2013年11月21日目錄:實驗一:UNIX/LINUIX入門.3 實驗二:進程管理.5實驗三:線程的管理.11實驗四:利用信號量實現(xiàn)進程間通信.15實驗五:基于消息隊列和共享內存的進程間通信.20實驗六:一個進程啟動另一個程序的執(zhí)行.25實驗一 UNIX/LINUIX入門一、實驗目的 了解UNIX/LINUX運行環(huán)境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下c語言程序的編寫、編譯、調試和運行方法。二、實驗內容1、熟悉UNIX/LINUX的常用基本命令如ls、who、pwd、ps等。2、練習UNI
2、X/LINUX的文本行編輯器vi的使用方法3、熟悉UNIX/LINUX下c語言編譯器cc/gcc的使用方法。用vi編寫一個簡單的顯示“Hello,World!”c語言程序,用gcc編譯并觀察編譯后的結果,然后運行它。三、實驗要求按照要求編寫程序,放在相應的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結果,并寫出實驗報告。四、實驗設計代碼如下:#include<stdio.h>int main() printf("Hello, world");return 0;五、運行結果六、收獲及機會此次實驗讓我熟悉了c語言編譯器cc/gcc的使用方法。七、參考資料實驗指導書實驗
3、二 進程管理一、實驗目的 加深對進程概念的理解,明確進程與程序的區(qū)別;進一步認識并發(fā)執(zhí)行的實質二、實驗內容(1)進程創(chuàng)建編寫一段程序,使用系統(tǒng)調用 fork()創(chuàng)建兩個子進程。當此程序運行時,在系統(tǒng)中有一個父進程和兩個子進程活動。讓每一個進程在屏幕上顯示一個字符:父進程顯示“a“;子進程分別顯示字符”b“和字符“c”。試觀察記錄屏幕上的顯示結果,并分析原因。(2)進程控制修改已編寫的程序,將每一個進程輸出一個字符改為每一個進程輸出一句話,再觀察程序執(zhí)行時屏幕上出現(xiàn)的現(xiàn)象,并分析原因。(3)進程的管道通信編寫程序實現(xiàn)進程的管道通信。使用系統(tǒng)調用pipe()建立一個管道,二個子進程P1 和P2 分
4、別向管道各寫一句話:Child 1 is sending a message!Child 2 is sending a message!父進程從管道中讀出二個來自子進程的信息并顯示(要求先接收P1,再接收P2)。三、實驗要求 按照要求編寫程序,放在相應的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結果,并寫出實驗報告。四、實驗設計(1)進程創(chuàng)建使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程執(zhí)行完在運行。(2)進程控制使用fork()創(chuàng)建兩個子進程,父進程等待兩個子進程分別輸出一句話在運行。(3)進程的管道通信建立一個管道。在程序中先建立一個子進程,然后向管道中輸入數(shù)據(jù),然后從子進程中退出到
5、父進程,讀出管道數(shù)據(jù),然后再建立一個子進程,寫入數(shù)據(jù),再讀出,即可。代碼如下:(1) 進程創(chuàng)建:#include<stdio.h>#include<stdlib.h>void main() int pid1, pid2; pid1 = fork(); if (pid1 < 0) printf("Fork 1 failed!"); if (0 = pid1) printf("b"); exit(0); if (pid1 >0) wait(NULL); pid2 = fork(); if (pid2 < 0) pri
6、ntf("Fork 2 failed!"); if (0 = pid2) printf("c"); exit(0); if (pid2 >0) wait(NULL); printf("a"); exit(0); (2) 進程控制:#include<stdio.h>#include<stdlib.h>void main() int pid1, pid2; pid1 = fork(); if (pid1 < 0) printf("Fork 1 failed!"); if (0 = p
7、id1) printf("this is child bn"); exit(0); if (pid1 >0) wait(NULL); pid2 = fork(); if (pid2 < 0) printf("Fork 2 failed!"); if (0 = pid2) printf("this is child cn"); exit(0); if (pid2 >0) wait(NULL); printf("father an"); exit(0); (3) 進程的管道通信#include<
8、stdio.h> #include<stdlib.h> #include<sys/types.h> #include<memory.h> void main() int pid1, pid2; int pfd2; char *msg1="Child 1 is sending a message!" char *msg2="Child 2 is sending a message!" char buf256; int r,w; if(pipe(pfd)<0) printf("pipe create
9、error!n"); exit(1); pid1 = fork(); if (pid1 < 0) printf("Fork 1 failed!"); if (0 = pid1) close(pfd0); /write sleep(3); if(w=write(pfd1,msg1,strlen(msg1)<0) printf("wirte error!n"); exit(1); else printf("child 1 send msg to pipe!n"); exit(0); if (pid1 >0) w
10、ait(NULL); pid2 = fork(); if (pid2 < 0) printf("Fork 2 failed!"); if (pid2 >0) close(pfd1); /read sleep(3); if(r=read(pfd0,buf,256)<0) printf("read error!n"); exit(1); else printf("parent read from pipe: %sn",buf); wait(NULL); close(pfd1); /read sleep(3); if(r=
11、read(pfd0,buf,256)<0) printf("read error!n"); exit(1); else printf("parent read from pipe: %sn",buf); if (0 = pid2) close(pfd0); /write sleep(6); if(w=write(pfd1,msg2,strlen(msg2)<0) printf("write error!n"); exit(1); else printf("child 2 send msg to pipe!n&qu
12、ot;); exit(0); 五、運行結果 (1)進程創(chuàng)建 (2)進程控制(3)進程的管道通信六、收獲及機會此次實驗讓我對進程和管道有了進一步的理解,當需要創(chuàng)建兩個子進程的時候,不能直接在第一個子進程中直接fork(),要保證在在父進程用fork()再次創(chuàng)建子進程,否則創(chuàng)建的不是兩個子進程而會是3個,關于父子進程的執(zhí)行順序,是無法預知的,如果想要先讓子進程運行,那么父進程一定要用wait(NULL)語句進行等待;關于管道,只用一個即可,但必須在第一個fork()之前創(chuàng)建,否則父子進程不會共享。在向管道中寫入數(shù)據(jù)和從管道中讀出數(shù)據(jù)的時候,要控制好管道的讀寫控制,例如讀的時候必先關寫,但是又不能關
13、閉讀(寫)端過多,要確保讀(寫)的時候總是有端口可讀(寫),否則的話會造成讀(寫)失敗。這些是我此次實驗最大的收獲,還需要在今后的時候發(fā)現(xiàn)更多的問題,有更深的理解。七、參考資料實驗指導書實驗三 線程的管理一、實驗目的 編寫 Linux 環(huán)境下的多線程程序,了解多線程的程序設計方法,掌握最常用的三個函數(shù)pthread_create,pthread_join 和pthread_exit 的用法二、實驗內容 1、主 程 序 創(chuàng) 建 兩 個 線 程 myThread1 和myThread2 , 每個線程打印一句話。使用pthread_create(&id,NULL,(void *) threa
14、d,NULL)完成。提示:先定義每個線程的執(zhí)行體,然后在 main 中()創(chuàng)建幾個線程,最后主線程等待子線程結束后再退出。2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù) 傳遞整型值 傳遞字符三、實驗要求 按照要求編寫程序,放在相應的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結果,并寫出實驗報告。四、實驗設計 先定義2個線程的帶有參數(shù)的函數(shù),參數(shù)分別為整型(int)和字符型(char),每個函數(shù)中打印出相對應線程的話。在main函數(shù)中,利用pthread_create函數(shù)創(chuàng)建該兩個線程,在函數(shù)參數(shù)中的第四位,寫入想要傳進各進程的參數(shù)。然后利用pthre
15、ad_join等待第二個結束后退出。代碼如下:1、主程序創(chuàng)建兩個線程 myThread1 和myThread2, 每個線程打印一句話。#include<stdio.h>#include<pthread.h>#include<stdlib.h>void myThread1(void) printf("This is pthread 1.n");void myThread2(void) printf("This is pthread 2.n");int main(void) pthread_t id1, id2; int
16、ret1, ret2; ret1 = pthread_create(&id1, NULL, (void*)myThread1, NULL); if (0 != ret1) printf("Create pthread 1 error!n"); exit(1); ret2 = pthread_create(&id2, NULL, (void*)myThread2, NULL); if (0 != ret2) printf("Create pthread 2 error!n"); exit(2); pthread_join(id1, NULL
17、); pthread_join(id2, NULL); return(0);2、創(chuàng)建兩個線程,分別向線程傳遞如下兩種類型的參數(shù)#include<stdio.h>#include<pthread.h>#include<stdlib.h>void *myThread1(void* arg) int* num; num = (int*)arg; printf("create parameter is %d.n", *num); return (void*)0;void *myThread2(void* arg) char* ch; ch = (
18、char*)arg; printf("create parameter is %c.n", *ch); return (void*)0;int main(void) pthread_t id1, id2; int ret1, ret2; int num = 1; char ch = 'a' int* p_num = # char* p_ch = &ch; ret1 = pthread_create(&id1, NULL, myThread1, (void*)p_num); if (0 != ret1) printf("
19、;Create pthread 1 error!n"); exit(1); ret2 = pthread_create(&id2, NULL, myThread2, (void*)p_ch); if (0 != ret2) printf("Create pthread 2 error!n"); exit(2); pthread_join(id1, NULL); pthread_join(id2, NULL); return(0);五、運行結果1、主程序創(chuàng)建兩個線程 myThread1 和myThread2, 每個線程打印一句話。2、創(chuàng)建兩個線程,分別向線程
20、傳遞如下兩種類型的參數(shù)六、收獲及體會此次實驗讓我對線程的創(chuàng)建有了初步的理解,在熟練掌握pthread_create和pthread_join兩個函數(shù)的應用上,學會了如何向線程中傳入?yún)?shù)。七、參考資料實驗指導書實驗四 利用信號實現(xiàn)進程間通信一、實驗目的 學習 UNIX 類(System V)操作系統(tǒng)信號機制,編寫Linux 環(huán)境下利用信號實現(xiàn)進程間通信的方法,掌握相關系統(tǒng)調用的使用方法。二、實驗內容創(chuàng)建4個線程,其中兩個線程負責從文件讀取數(shù)據(jù)到公共的緩沖區(qū),另兩個線程從緩沖區(qū)讀取數(shù)據(jù)作不同的處理(加和乘運算)。使用信號量控制這些線程的執(zhí)行。三、實驗要求 按照要求編寫程序,放在相應的目錄中,編譯成
21、功后執(zhí)行,并按照要求分析執(zhí)行結果,并寫出實驗報告。四、實驗設計4個線程,兩個生產(chǎn)者兩個消費者;3個信號量:信號量n確保消費者不會從空的緩沖區(qū)取數(shù);信號量S確保所有參與者之間互斥對緩沖區(qū)操作(防止出現(xiàn)兩個生產(chǎn)者同時向一個緩沖區(qū)部分寫,或寫的同時有消費者來讀的情況);信號量e確保緩沖區(qū)滿后不會再向其中寫。兩個生產(chǎn)者分別從兩個文件中讀取數(shù)據(jù)寫到緩沖區(qū),兩個消費者分別做“+”和“*”操作代碼如下:#include<semaphore.h>#include<pthread.h>#include<stdio.h>#include<stdlib.h>#defi
22、ne DATA1 "data1.txt"#define DATA2 "data2.txt"#define MAX_BUFFER 5int in = 0;int out = 0;int count1 = 0;int count2 = 0;int num_bufferMAX_BUFFER;sem_t n;sem_t s;sem_t e;void* produceThread1(FILE* fp1) int num; while (fscanf(fp1, "%d", &num) != EOF) sem_wait(&e); s
23、em_wait(&s); printf("produceThread 1 put %d in buffer%d.n", num, in); num_bufferin = num; in+; in = in % MAX_BUFFER; sem_post(&s); sem_post(&n); void* produceThread2(FILE* fp2) int num; while (fscanf(fp2, "%d", &num) != EOF) sem_wait(&e); sem_wait(&s); pri
24、ntf("produceThread 2 put %d in buffer%d.n", num, in); num_bufferin = num; in+; in = in % MAX_BUFFER; sem_post(&s); sem_post(&n); void* consumeThread3() int nums2; int result; while (1) sem_wait(&n); sem_wait(&s); numscount1 = num_bufferout; printf("consumeThread3 Get %
25、d from buffer%d.n", numscount1, out); out+; out = out % MAX_BUFFER; count1+; if (2 = count1) result = nums0 + nums1; printf("%d + %d = %d.n", nums0, nums1, result); count1 = 0; sem_post(&s); sem_post(&e); void* consumeThread4() int nums2; int result; while (1) sem_wait(&n)
26、; sem_wait(&s); numscount2 = num_bufferout; printf("consumeThread4 Get %d from buffer%d.n", numscount2, out); out+; out = out % MAX_BUFFER; count2+; if (2 = count2) result = nums0 * nums1; printf("%d * %d = %d.n", nums0, nums1, result); count2 = 0; sem_post(&s); sem_post(
27、&e); void main() int ret1, ret2, ret3, ret4; pthread_t id1, id2, id3, id4; sem_init(&n, 0, 0); sem_init(&s, 0, 1); sem_init(&e, 0, MAX_BUFFER); FILE* fp1 = NULL; FILE* fp2 = NULL; fp1 = fopen(DATA1, "r"); fp2 = fopen(DATA2, "r"); if (NULL = fp1) exit(1); if (NULL
28、= fp2) exit(2); ret1 = pthread_create(&id1, NULL, produceThread1, fp1); if (0 != ret1) printf("Create pthread 1 error!n"); exit(1); ret2 = pthread_create(&id2, NULL, produceThread2, fp2); if (0 != ret2) printf("Create pthread 2 error!n"); exit(2); ret3 = pthread_create(&a
29、mp;id3, NULL, consumeThread3, NULL); if (0 != ret3) printf("Create pthread 3 error!n"); exit(3); ret4 = pthread_create(&id4, NULL, consumeThread4, NULL); if (0 != ret4) printf("Create pthread 4 error!n"); exit(4); pthread_join(id1, NULL); pthread_join(id2, NULL); pthread_join
30、(id3, NULL); pthread_join(id4, NULL); fclose(fp1); fclose(fp2);五、運行結果六、收獲及體會此次實驗讓我實踐了在Linux 環(huán)境下利用信號量實現(xiàn)生產(chǎn)者消費者問題的解決,掌握了信號量相關函數(shù)的使用方法。七、參考資料實驗指導書實驗五 基于消息隊列和共享內存的進程間通信一、實驗目的 Linux系統(tǒng)的進程通信機構(IPC)允許在任意進程間大批量地交換數(shù)據(jù)。本實驗的目的是了解和熟悉:1. Linux支持的消息通信機制及其使用方法2. Linux系統(tǒng)的共享存儲區(qū)的原理及使用方法。二、實驗內容 1.消息的創(chuàng)建、發(fā)送和接收 使用消息調用msgget(
31、)、msgsnd()、msggrev()、msgctrl()編制長度為1K的消息的發(fā)送和接收程序。2.共享存儲區(qū)的創(chuàng)建、附接和斷接使用系統(tǒng)調用shmget()、shmat()、shmctl(),編制一個與上述功能相同的程序。三、實驗要求 按照要求編寫程序,放在相應的目錄中,編譯成功后執(zhí)行,并按照要求分析執(zhí)行結果,并寫出實驗報告。四、實驗設計1.消息隊列:先定義一個消息結構,包含消息類型和文本長度(1024)。在主函數(shù)中,首先獲得一個KEY為75的消息的描述符,然后在client子進程中連續(xù)發(fā)消息類型為101的十條消息。然后在server子進數(shù)中,用while(i!=1)循環(huán)接受消息,以i=ms
32、g.mymsgtype=1作為結束條件。接受完后撤銷消息隊列。#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <sys/ipc.h>#include <sys/shm.h>#define MAX 1024struct mymsglong int mymsgtype;char textMAX;msg;int msgid;int i=1;void mai
33、n() pid_t pid_client; pid_t pid_server; msgid=msgget(75,0777|IPC_CREAT);/huode xiaoxi duilie miaoshufu if(pid_client=fork()=0) while(i<11) msg.mymsgtype=11-i; printf("Client sent (No.%d)(type:%d)n",i,msg.mymsgtype); i+; msgsnd(msgid,&msg,MAX,0); exit(0); else /sleep(1); if(pid_serve
34、r=fork()=0) i=10; while(i!=1) msgrcv(msgid,&msg,MAX,0,0); i=msg.mymsgtype;printf("Server received(No.%d)(type:%d)n",11-i,i); msgctl(msgid, IPC_RMID,0); exit(0); else wait(0); wait(0); exit(0); /return 0;2.共享存儲區(qū): 在主進程中先建立共享存儲區(qū),KEY為75,并獲得描述符,然后將該共享存儲區(qū)附接到virtual_address這個虛擬地址上,在client子進程中
35、利用while循環(huán)從10到1打印輸出,并將i值賦給virtual_addressi。在server子進程中,循環(huán)取出virtual_addressi中的內容并打印輸出。最后在主程序中斷開附接,并撤銷共享存儲區(qū)。代碼如下:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#include <string.h>#include <sys/ipc.h>#include <sys/shm.h>#define MAX
36、 1024#define KEY 75int main() int id,i,pid_server,pid_client; char *virtual_address; id=shmget(KEY,sizeof(char)*MAX,IPC_CREAT|0777);/create a shm virtual_address=shmat(id,0,0);/return to address of the shm(fujie) if(pid_server=fork()=-1) printf("Fork server failed!n"); exit(1); if(pid_server=0) sleep(1); for(i=0;i<=10;i+) printf("Server received %dn",virtual_addressi); exit(0); else if(pid_client=fork()=-1) printf("error in fork an"); exit(1); if(pid_client=0) i=0; while(1) virtual_addressi=i; printf("Client sent %dn",virtual_a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史七年級下冊第10課 《蒙古族的興起與元朝的建立》 聽課評課記錄7
- 北師大版歷史八年級上冊第10課《新文化運動》聽課評課記錄
- 豬場購銷合同(2篇)
- 生產(chǎn)承包合同(2篇)
- 仁愛版八年級地理上冊3.2《土地資源》聽課評課記錄
- 八年級道德與法治下冊第四單元崇尚法治精神第七課尊重自由平等第1框自由平等的真諦聽課評課記錄(新人教版)
- 蘇科版數(shù)學七年級下冊10.2.1《二元一次方程組》聽評課記錄
- 冀教版數(shù)學七年級下冊《多項式乘多項式》聽評課記錄2
- 湘教版數(shù)學七年級上冊2.3《代數(shù)式的值》聽評課記錄
- 五年級數(shù)學下冊聽評課記錄《3.1 分數(shù)乘法(一)(4)》北師大版
- 固體廢棄物檢查記錄
- 工程設計費取費標準
- GB/T 5465.1-2009電氣設備用圖形符號第1部分:概述與分類
- 2023年遼寧鐵道職業(yè)技術學院高職單招(數(shù)學)試題庫含答案解析
- CAPP教學講解課件
- 自然環(huán)境的服務功能課件 高中地理人教版(2019)選擇性必修3
- 小耳畸形課件
- 新人教版初中初三中考數(shù)學總復習課件
- 機械制造有限公司組織架構圖模板
- 8.3 摩擦力 同步練習-2021-2022學年人教版物理八年級下冊(Word版含答案)
- 生理學教學大綱
評論
0/150
提交評論