版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、一、實驗步驟:1. 在linux下編寫一個應(yīng)用程序,命名為an_ch2_1b。這個程序不斷地輸出如下行:Those output come from child,系統(tǒng)時間另外寫一個應(yīng)用程序,命名為an_ch2_1a。這個程序創(chuàng)建一個子進程,執(zhí)行an_ch2_1b。這個程序不斷地輸出如下行:Those output come from child,系統(tǒng)時間觀察程序運行的結(jié)果,并對你看到的現(xiàn)象進行解釋。2. 在linux環(huán)境下編寫一個控制臺應(yīng)用程序,程序中有一個共享的整型變量shared_var,初始值為0;創(chuàng)建一個線程并使其立即與主線程并發(fā)執(zhí)行。新創(chuàng)建的線程與主線程 均不斷地循環(huán),并輸出shar
2、ed_var 的值。主線程在循環(huán)中不斷地對shared_var 進行加1操作,即每次循環(huán)shared_var 被加1;而新創(chuàng)建的線程則不斷地對shared_var 進行減1 操作,即每次循環(huán)shared_var 被減1。觀察程序運行的結(jié)果,并對你看到的現(xiàn)象進行解釋。二、實驗數(shù)據(jù): an_ch2_1b.cpp文件:#include <iostream>#include <string>#include <stdlib.h>#include <unistd.h>#include <time.h>using namespace std;st
3、ring getTime() /獲取系統(tǒng)時間time_t timep;time(&timep);char tmp64;strftime(tmp,sizeof(tmp),"%Y-%m-%d%H:%M:%S",localtime(&timep);return tmp;int main()while (true)string tmn = getTime();cout << "Those output come from child," << tmn << endl;sleep(1); /為了便于截屏使用sle
4、ep()函數(shù)延遲輸出return 0;an_ch2_1a.cpp文件:#include <iostream>#include <sys/types.h>#include <unistd.h>#include <cstdio>#include <stdlib.h>using namespace std;int main()pid_t pid;pid = fork();if (pid = -1) cout << "fail to create" << endl;else if (pid = 0)
5、 system("./an_ch2_1b");return 0;Consoleapp.c文件:#include <sys/types.h>#include <stdio.h>#include <unistd.h>#include <pthread.h>int shared_var = 0;void * thread(void * arg)while (1)printf("in the thread shared_var:%dn", -shared_var);int main()pthread_t pt;in
6、t ret = pthread_create(&pt, NULL, (void*)thread, NULL);if (ret != 0) printf("fail to create threadn");while (1)printf("in the main shared_var:%dn", +shared_var);pthread_join(pt, NULL);return 0;1. 生產(chǎn)者消費者問題(信號量)參考教材中的生產(chǎn)者消費者算法,創(chuàng)建5個進程,其中兩個進程為生產(chǎn)者進程,3個進程為消費者進程。一個生產(chǎn)者進程試圖不斷地在一個緩沖中寫入大
7、寫字母,另一個生產(chǎn)者進程試圖不斷地在緩沖中寫入小寫字母。3個消費者不斷地從緩沖中讀取一個字符并輸出。為了使得程序的輸出易于看到結(jié)果,仿照的實例程序,分別在生產(chǎn)者和消費者進程的合適的位置加入一些隨機睡眠時間??蛇x的實驗:在上面實驗的基礎(chǔ)上實現(xiàn)部分消費者有選擇地消費某些產(chǎn)品。例如一個消費者只消費小寫字符,一個消費者只消費大寫字母,而另一個消費者則無選擇地消費任何產(chǎn)品。消費者要消費的產(chǎn)品沒有時,消費者進程被阻塞。注意緩沖的管理。2. 用線程實現(xiàn)睡覺的理發(fā)師問題,(同步互斥方式采用信號量或mutex方式均可)理發(fā)師問題的描述:一個理發(fā)店接待室有n張椅子,工作室有1張椅子;沒有顧客時,理發(fā)師睡覺;第一個
8、顧客來到時,必須將理發(fā)師喚醒;顧客來時如果還有空座的話,他就坐在一個座位上等待;如果顧客來時沒有空座位了,他就離開,不理發(fā)了;當(dāng)理發(fā)師處理完所有顧客,而又沒有新顧客來時,他又開始睡覺。3. 讀者寫者問題教材中對讀者寫者問題算法均有描述,但這個算法在不斷地有讀者流的情況下,寫者會被阻塞。編寫一個寫者優(yōu)先解決讀者寫者問題的程序,其中讀者和寫者均是多個進程,用信號量作為同步互斥機制。1. 生產(chǎn)者消費者問題(pro_con.c)#include <pthread.h>#include <unistd.h> #include <semaphore.h> #includ
9、e <stdio.h>#include <stdlib.h>#include <time.h>#include <malloc.h>#define N 10 /緩沖區(qū)大小為100char *buffer;int capacity = N;sem_t mutex, empty, full;void * produce_1()while (1)sem_wait(&empty);sem_wait(&mutex);int r1 = rand() % 26; int ju = 0; for(int i = 0; i < N; i+)
10、if (bufferi = '0')bufferi = 'A' + r1;printf("生產(chǎn)者1號生產(chǎn)一個產(chǎn)品 : %c 剩余容量為:%dn", bufferi, -capacity); ju = 1; break; if(ju = 0)printf("沒有足夠容量!n");sem_post(&mutex);sem_post(&full);usleep(r1 * 100000);void * produce_2()while (1)sem_wait(&empty);sem_wait(&mu
11、tex);int r2 = rand() % 26; int ju = 0; for(int i = 0; i < N; i+) if (bufferi = '0')bufferi = 'a' + r2;printf("生產(chǎn)者2號生產(chǎn)一個產(chǎn)品 : %c 剩余容量為:%dn", bufferi, -capacity);ju = 1; break; if(ju = 0)printf("沒有足夠容量!n");sem_post(&mutex);sem_post(&full);usleep(r2 * 10000
12、0);void * consume_1()while (1)sem_wait(&full);sem_wait(&mutex);int ju = 0; for (int i = 0; i < N; i+)if (bufferi >= 'A'&&bufferi <= 'Z')printf("消費者1號消費一個產(chǎn)品 : %c 剩余容量為:%dn", bufferi, +capacity); bufferi = '0'ju = 1; break;if (ju = 0)printf(&q
13、uot;沒有消費者1號所需的產(chǎn)品!n");sem_post(&mutex);sem_post(&empty);int r3 = rand() % 26;usleep(r3 * 100000);void * consume_2()while (1)sem_wait(&full);sem_wait(&mutex);int ju = 0; for (int i = 0; i < N; i+)if (bufferi >= 'a'&&bufferi <= 'z')printf("消費者2
14、號消費一個產(chǎn)品 : %c 剩余容量為:%dn", bufferi, +capacity); bufferi = '0' ju = 1;break;if (ju = 0)printf("沒有消費者2號所需的產(chǎn)品!n");sem_post(&mutex);sem_post(&empty);int r4 = rand() % 26;usleep(r4 * 100000);void * consume_3()int ju = 0;while (1)sem_wait(&full);sem_wait(&mutex);int ju
15、 = 0; for (int i = 0; i < N; i+)if (bufferi >= 'A' && bufferi <= 'Z') | (bufferi >= 'a' && bufferi <= 'z')printf("消費者3號消費一個產(chǎn)品 : %c 剩余容量為:%dn", bufferi, +capacity); bufferi = '0'ju = 1; break;if (ju = 0)printf("沒有產(chǎn)品
16、可以消費!n");sem_post(&mutex);sem_post(&empty);int r5 = rand() % 26;usleep(r5 * 100000);int main()buffer = (char*)malloc(N * sizeof(char*);for (int i = 0; i < N; i+)bufferi = '0'sem_init(&mutex, 1, 1);sem_init(&empty, 0, N);sem_init(&full, 0, 0); srand(time(0);pthread
17、_t tid5;pthread_attr_t attr;pthread_attr_init(&attr);pthread_create(&tid0,&attr,produce_1,NULL);pthread_create(&tid1,&attr,produce_2,NULL);pthread_create(&tid2,&attr,consume_1,NULL);pthread_create(&tid3,&attr,consume_2,NULL); pthread_create(&tid4,&attr,con
18、sume_3,NULL); for(int i=0;i<5;i+)pthread_join(tidi,NULL);return 0;2. 用線程實現(xiàn)睡覺的理發(fā)師問題(barber.c)#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <unistd.h>#include <semaphore.h>#define N 5sem_t customer,barber;int chairs,waiting =
19、0,work = 0;pthread_mutex_t mutex;void * Barber ( ) printf("無顧客,理發(fā)師睡覺n"); while (1) sem_wait(&customer); pthread_mutex_lock(&mutex); chairs+; pthread_mutex_unlock(&mutex); work = 1; printf ( "理發(fā)師正在給一名顧客理發(fā). %d 個顧客正在接待室等待。n", -waiting); sleep(2); printf ( "一名顧客理發(fā)完成。
20、n" ); work = 0; sem_post(&barber); if(waiting = 0)printf("無顧客,理發(fā)師睡覺n"); void * Customer ( void* arg ) int *p = (int*) arg; int x = *p; pthread_mutex_lock(&mutex); if ( chairs > 0 ) chairs-; sem_post(&customer); if(waiting = 0 && work = 0) printf( "第 %d 個顧客進
21、來 , 喚醒理發(fā)師.n" , +x); waiting+; else printf ( "第 %d 個顧客進來 , %d 個顧客正在接待室等待.n" , x+1 , +waiting ); pthread_mutex_unlock(&mutex); sem_wait(&barber); else pthread_mutex_unlock(&mutex); printf ( "第 %d 個顧客進來,沒有座位而離開!n" , x+1 ); int main ( ) sem_init (&customer , 0 ,
22、0 ); sem_init (&barber , 0 , 1 ); chairs = N; pthread_t bar; pthread_t cusN*100; int cus_idN*100; pthread_create ( &bar , NULL , Barber , NULL ); int i; srand(time(0); for ( i = 0 ; i < N*100 ; i + ) usleep(100000*(rand() % 30); cus_idi = i; pthread_create ( &cusi , NULL , Customer ,
23、&cus_idi ); pthread_join ( bar , NULL ); for ( i = 0 ; i < N*100 ; i+ ) pthread_join ( cus_idi , NULL ); 3. 讀者寫者問題(reader_writer.c)# include <stdio.h># include <stdlib.h># include <time.h># include <sys/types.h># include <pthread.h># include <semaphore.h>#
24、include <string.h># include <unistd.h>sem_t RWMutex, mutex1, mutex2, mutex3, wrt;int writeCount, readCount;struct data int id;int lastTime;void* Reader(void* param)int id = (struct data*)param)->id;int lastTime = (struct data*)param)->lastTime;printf("讀進程 %d 等待讀入n", id);s
25、em_wait(&mutex3);sem_wait(&RWMutex);sem_wait(&mutex2);readCount+;if(readCount = 1) sem_wait(&wrt);sem_post(&mutex2);sem_post(&RWMutex);sem_post(&mutex3);printf("讀進程 %d 開始讀入,%d 秒后完成n", id, lastTime);sleep(lastTime);printf("讀進程 %d 完成讀入n", id);sem_wait(&a
26、mp;mutex2);readCount-;if(readCount = 0) sem_post(&wrt);sem_post(&mutex2);pthread_exit(0);void* Writer(void* param) int id = (struct data*)param)->id;int lastTime = (struct data*)param)->lastTime;printf("寫進程 %d 等待寫入n", id);sem_wait(&mutex1);writeCount+;if(writeCount = 1) s
27、em_wait(&RWMutex);sem_post(&mutex1);sem_wait(&wrt);printf("寫進程 %d 開始寫入,%d 秒后完成n", id, lastTime);sleep(lastTime);printf("寫進程 %d 完成寫入n", id);sem_post(&wrt);sem_wait(&mutex1);writeCount-;if(writeCount = 0) sem_post(&RWMutex);sem_post(&mutex1);pthread_exit
28、(0);int main() pthread_t tid;pthread_attr_t attr;pthread_attr_init(&attr); sem_init(&mutex1, 0, 1); sem_init(&mutex2, 0, 1); sem_init(&mutex3, 0, 1); sem_init(&wrt, 0, 1); sem_init(&RWMutex, 0, 1); readCount = writeCount = 0;int id = 0; srand(time(0);while(1) int role = rand(
29、) % 100; int lastTime = rand() % 10; id+;struct data* d = (struct data*)malloc(sizeof(struct data);d->id = id;d->lastTime = lastTime;if(role < 50) /讀 printf("創(chuàng)建讀進程,PID : %dn", id);pthread_create(&tid, &attr, Reader, d);else if(role >= 50) /寫 printf("創(chuàng)建寫進程,PID : %dn
30、", id);pthread_create(&tid, &attr, Writer, d); sleep(rand() % 8);return 0; 1. 實現(xiàn)一個“difftree”命令,其功能是比較兩個目錄下的文件結(jié)構(gòu)和文件信息。當(dāng)在命令行方式下執(zhí)行“difftree <dir1> <dir2>”命令時,能夠比較目錄dir1和 目錄dir2是否具有相同的結(jié)構(gòu),對相同的部分,進一步比較相同文件名的文件內(nèi)容。列出比較的文件系統(tǒng)結(jié)構(gòu)圖。本實驗是對單個文件比較的擴展,設(shè)計中需要考慮目錄操作。difftree.c#include <stdio.
31、h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <string.h>#include <dirent.h>int filelevel1 = 0, filelevel2 = 0;char DIRNAME1256, DIRNAME2256;void my_error(const char *strerr) perror(strerr); exit(1);void findfile(char fileN
32、ame1, char direntName1, char direntName2) char command512 = "diff " DIR *p_dir = NULL; struct dirent *p_dirent = NULL; p_dir = opendir(direntName2); if(p_dir = NULL) my_error("opendir error"); while(p_dirent = readdir(p_dir) != NULL) char *backupDirName = NULL; if(p_dirent->d_
33、name0 = '.')continue; int i; if(p_dirent->d_type = DT_DIR) int curDirentNameLen = strlen(direntName2) + 1; backupDirName = (char *)malloc(curDirentNameLen); memset(backupDirName, 0, curDirentNameLen); memcpy(backupDirName, direntName2, curDirentNameLen); strcat(direntName2, "/")
34、; strcat(direntName2, p_dirent->d_name); findfile(fileName1, direntName1, direntName2); memcpy(direntName2, backupDirName, curDirentNameLen); free(backupDirName); backupDirName = NULL; else if(!strcmp(fileName1, p_dirent->d_name) char FileDirName256; strcpy(FileDirName, direntName2); int curDi
35、rentNameLen = strlen(direntName2) + 1; backupDirName = (char *)malloc(curDirentNameLen); memset(backupDirName, 0, curDirentNameLen); memcpy(backupDirName, FileDirName, curDirentNameLen); strcat(FileDirName, "/"); strcat(FileDirName, p_dirent->d_name); strcat(command, direntName1); strca
36、t(command, " "); strcat(command, FileDirName); printf("%s%sn", p_dirent->d_name,"文件相同,比較:"); system(command); closedir(p_dir); void comparefile(char direntName1, char direntName2) char command512; DIR *p_dir = NULL; struct dirent *p_dirent = NULL; p_dir = opendir(dir
37、entName1); if(p_dir = NULL) my_error("opendir error"); while(p_dirent = readdir(p_dir) != NULL) char *backupDirName = NULL; if(p_dirent->d_name0 = '.') continue; int i; if(p_dirent->d_type = DT_DIR) int curDirentNameLen = strlen(direntName1) + 1; backupDirName = (char *)mallo
38、c(curDirentNameLen); memset(backupDirName, 0, curDirentNameLen); memcpy(backupDirName, direntName1, curDirentNameLen); strcat(direntName1, "/"); strcat(direntName1, p_dirent->d_name); comparefile(direntName1, direntName2); memcpy(direntName1, backupDirName, curDirentNameLen); free(backu
39、pDirName); backupDirName = NULL; else char FileDirName256; strcpy(FileDirName, direntName1); int curDirentNameLen = strlen(direntName1) + 1; backupDirName = (char *)malloc(curDirentNameLen); memset(backupDirName, 0, curDirentNameLen); memcpy(backupDirName, FileDirName, curDirentNameLen); strcat(File
40、DirName, "/"); strcat(FileDirName, p_dirent->d_name); findfile(p_dirent->d_name, FileDirName, direntName2); closedir(p_dir); void PrintDirentStruct(char direntName, int level) DIR *p_dir = NULL; struct dirent *p_dirent = NULL; p_dir = opendir(direntName); if(p_dir = NULL) my_error(&q
41、uot;opendir error"); while(p_dirent = readdir(p_dir) != NULL) char *backupDirName = NULL; if(p_dirent->d_name0 = '.') continue; int i; for(i = 0; i < level; i+) printf(""); printf(" "); printf(" "); printf("%sn", p_dirent->d_name); /如果目錄項
42、仍是一個目錄的話,進入目錄 if(p_dirent->d_type = DT_DIR) int curDirentNameLen = strlen(direntName) + 1; backupDirName = (char *)malloc(curDirentNameLen); memset(backupDirName, 0, curDirentNameLen); memcpy(backupDirName, direntName, curDirentNameLen); strcat(direntName, "/"); strcat(direntName, p_dir
43、ent->d_name); level += 1; PrintDirentStruct(direntName, level); memcpy(direntName, backupDirName, curDirentNameLen); free(backupDirName); backupDirName = NULL; closedir(p_dir); int main() memset(DIRNAME1, 0, sizeof(DIRNAME1); memset(DIRNAME2, 0, sizeof(DIRNAME2); scanf("%s%s", DIRNAME1,
44、 DIRNAME2); printf("%sn", "第一個目錄:"); PrintDirentStruct(DIRNAME1, filelevel1); printf("n"); printf("%sn", "第二個目錄:"); PrintDirentStruct(DIRNAME2, filelevel2); if(filelevel1 = filelevel2)printf("n兩個目錄文件結(jié)構(gòu)相同n"); comparefile(DIRNAME1, DIRNAME2);
45、 return 0;1. 在linux中實現(xiàn)一個命令執(zhí)行程序doit,它執(zhí)行命令行參數(shù)中的命令之后統(tǒng)計1) 命令執(zhí)行占用的CPU時間(包括用戶態(tài)和系統(tǒng)態(tài)時間,以毫秒為單位),2) 命令執(zhí)行的時間,3) 進程被搶占的次數(shù),4) 進程主動放棄CPU的次數(shù),5) 進程執(zhí)行過程中發(fā)生缺頁的次數(shù)2. 在linux中實現(xiàn)一個簡單的命令解釋程序,功能要求:1) 同時支持內(nèi)部命令和外部命令,內(nèi)部命令支持兩個(cd、exit)2) 支持后臺命令提示:實驗中可能用到的系統(tǒng)調(diào)用如下: fork() 創(chuàng)建一個新進程 getrusage() 取得進程的資源使用情況 gettimeofday() 取當(dāng)前的時間 execv
46、e() 裝入一個程序并執(zhí)行 wait() 等待子進程結(jié)束 chdir() 改變進程的工作目錄 strtok() 字符串解析1. doit.c #include<sys/types.h>#include<sys/time.h>#include<sys/resource.h>#include<string.h>#include<stdlib.h>#include<errno.h>#include<stdio.h>extern int errno;int main(int argc, char*argv)char c
47、ommand200;struct timeval start, end;strcpy(command, argv1);for (int i = 2; i < argc; i+)strcat(command, " ");strcat(command, argvi);gettimeofday(&start, NULL);system(command);gettimeofday(&end, NULL);if (errno != 0)printf("error:%sn", strerror(errno);exit(0);elsestruct
48、 rusage result;memset(&result, 0, sizeof(struct rusage);getrusage(RUSAGE_CHILDREN, &result);double time = (double)end.tv_sec - (double)start.tv_sec) * 1000 + (double)end.tv_usec - (double)start.tv_usec) / 1000;printf("n命令執(zhí)行占用的CPU時間: 用戶態(tài):%f毫秒t系統(tǒng)態(tài):%f毫秒n",(double)result.ru_utime.tv_usec / 1000 + (double)result.ru_utime.tv_sec * 1000, (double)result.ru_stime.tv_usec / 1000 + (double)result.ru_stime.tv_sec * 1000);printf("命令執(zhí)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年特許經(jīng)營合同:某品牌授權(quán)某店鋪經(jīng)營
- 2024年度綠色辦公區(qū)租賃合同(含可持續(xù)發(fā)展承諾)3篇
- 2024版安全工程施工人員培訓(xùn)與考核合同3篇
- 2024年度土地市場分析與投資建議代理合同3篇
- 2024年度混凝土框架結(jié)構(gòu)中鋼筋供應(yīng)與施工合同3篇
- 2024年度網(wǎng)絡(luò)游戲運營合同版權(quán)保護措施3篇
- 2024衛(wèi)生室裝修及醫(yī)療廢物處理與資源化利用合同范本3篇
- 2024年獨家陶瓷品牌代理合同
- 2024事業(yè)單位聘用合同教師(附教育信息化應(yīng)用要求)3篇
- 2024年度拖車租賃與貨運代理服務(wù)合同3篇
- 2024年公路造價師繼續(xù)教育在線自測答案共科
- 2024新人教版初中七年級數(shù)學(xué)上冊新教材《第三章 代數(shù)式》大單元整體教學(xué)設(shè)計
- 2024年新青島版(六三制)六年級上冊科學(xué)全冊知識點
- YC-T 591-2021 煙草行業(yè)實驗室安全管理要求
- 2024(新高考2卷)英語試題詳解解析 課件
- 信托公司保密管理策略
- 煙酒行轉(zhuǎn)讓合同范本
- 報告文學(xué)研究
- 5.2《大學(xué)之道》課件+2024-2025學(xué)年統(tǒng)編版高中語文選擇性必修上冊
- 棄土綜合利用協(xié)議
- 案例2-5 節(jié)能效果對比講解
評論
0/150
提交評論