av在线观看网站免费,欧美成人aaa片一区国产精品,精品国产乱码久久久久久免费,麻豆果冻传媒2021精品传媒一区,国产精品自在欧美一区

電子文檔交易市場(chǎng)
安卓APP | ios版本
電子文檔交易市場(chǎng)
安卓APP | ios版本

linux進(jìn)程與線程通訊實(shí)驗(yàn)報(bào)告

11頁(yè)
  • 賣家[上傳人]:人***
  • 文檔編號(hào):552954516
  • 上傳時(shí)間:2023-11-29
  • 文檔格式:DOCX
  • 文檔大小:30.77KB
  • 下載文檔到電腦,查找使用更方便

    15 金貝

    還剩頁(yè)未讀,繼續(xù)閱讀

    / 11 舉報(bào) 版權(quán)申訴 馬上下載
  • 文本預(yù)覽
  • 下載提示
  • 常見問題
    • 標(biāo)linux 進(jìn)程與線程通訊實(shí)驗(yàn)報(bào)告操作系統(tǒng)實(shí)驗(yàn)一進(jìn)程與線程— Linux 進(jìn)程與線程通訊實(shí)驗(yàn)報(bào)告操作系統(tǒng) 課程設(shè)計(jì)任務(wù)書篇二: 操作系統(tǒng)實(shí)驗(yàn) Linux 進(jìn)程與線程通訊Linux 進(jìn)程與線程通訊報(bào)告人:設(shè)計(jì)目的1、深刻理解線程和進(jìn)程的概念2、掌握線程與進(jìn)程在組成成分上的差別以及與其相適應(yīng)的通訊方式和應(yīng)用目設(shè)計(jì)的內(nèi)容1、 以 Linux 系統(tǒng)進(jìn)程和線程機(jī)制為背景,掌握 fork() 和 clone() 系統(tǒng)調(diào)用的2、 形式和功能以及與其相適應(yīng)的高級(jí)通訊方式由 fork 派生的子進(jìn)程之間通過pipe 通訊,由 clone 創(chuàng)建的線程之間通過共享內(nèi)存通訊,對(duì)于后者需要考慮互斥問題3、 以生產(chǎn)者-消費(fèi)者問題為例,通過實(shí)驗(yàn)理解 fork() 和 clone() 兩個(gè)系統(tǒng)調(diào)的區(qū)別程序要求能夠創(chuàng)建 4 個(gè)進(jìn)程或線程,其中包括兩個(gè)生產(chǎn)者和兩個(gè)消費(fèi)者,生產(chǎn)者和消費(fèi)者之間能夠傳遞數(shù)據(jù)設(shè)計(jì)準(zhǔn)備1、 fork 系統(tǒng)調(diào)用、4、pid=fork()創(chuàng)建一個(gè)子進(jìn)程,子進(jìn)程是父進(jìn)程的完整復(fù)制,正常返回值為非負(fù)整數(shù),對(duì)于 父進(jìn)程來說該數(shù)大于 0,是子進(jìn)程的編號(hào) (pid); 對(duì)于子進(jìn)程來說該數(shù)為 0正是利用反回值的差別可以決定二者不同的后繼動(dòng)作。

      2、 clone 系統(tǒng)調(diào)用int clone(int (*fn)(void * arg), void *stack, int flags, void * arg);其中 fn 是輕進(jìn)程所執(zhí)行的函數(shù), stack 是輕進(jìn)程所使用的棧, flag 是CLONE_VM, CLONE_FS, CLONE_FILES,LONE_SIGHAND,CLONE_的組合,arg是調(diào)用過程的對(duì)應(yīng)參數(shù)Clone()的關(guān)鍵是flag的設(shè)定,CLONE_VS示子進(jìn)程共享父進(jìn)程內(nèi)存,CLONE_F表示子進(jìn)程共享父進(jìn)程的文件系統(tǒng),CLONE_SIGHA表示 子進(jìn)程共享父進(jìn)程的消息處理機(jī)制,CLONE_PI是指子進(jìn)程繼承父進(jìn)程的id號(hào)3、 pipe 系統(tǒng)調(diào)用et_val=pipe(fd);fork 創(chuàng)建的子進(jìn)參數(shù)定義為 int fd[2] 創(chuàng)建一個(gè)管道文件,返回兩個(gè)文件描述符 fd[0] 和fd[1] 分別用于管道文件的讀和寫操作管道文件創(chuàng)建后,可以被 程共享4、 sem_wait(&s) 和 sem_post(&s) 分別相當(dāng)于信號(hào)燈的 P 操作和 V 操 作其中 s 是說明為 sem_t 類型的信號(hào)燈。

      初始化函數(shù) sem_init(s,0,8)5、 pthread_mutex_lock(&mutex) 和 pthread_mutex_unlock(&mutex)分別用于加鎖和解鎖參數(shù)為 pthread_mutex_t mutex 定義的互斥鎖初始化tthread_mutex_init(&mutex,NULL)四、實(shí)驗(yàn)設(shè)計(jì)1、用 pipe() 創(chuàng)建一個(gè)管道文件2、3、它們之間通過 pipe() 傳遞信息4、用 clone() 創(chuàng)建四個(gè)輕進(jìn)程 ( 線程 )5、用參數(shù)指明共享內(nèi)存等資源6、通過共享內(nèi)存模擬生產(chǎn)消費(fèi)問題然后用 fork() 創(chuàng)建兩個(gè)生產(chǎn)進(jìn)程和兩個(gè)消費(fèi)進(jìn)程7、五、程序流程5.1基于 fork 的程序流程5.2基于 clone 的程序流程六、結(jié)果輸出及分析1、基于 fork 的結(jié)果輸出利用 pthread_mutex_lock(), pthread_mutex_unlock() 等函數(shù)實(shí)現(xiàn)對(duì)共享存儲(chǔ)區(qū)訪問的互斥分析結(jié)果 :由程序(1) 結(jié)果可見,當(dāng)一個(gè)進(jìn)程改變其空間數(shù)據(jù)時(shí),其他進(jìn)程空間對(duì)應(yīng)數(shù)據(jù) 內(nèi)容并未改變,說明在使用 fork() 語(yǔ)句創(chuàng)建的子進(jìn)程與其父進(jìn)程具有相對(duì)獨(dú)立的 地址空間,在解決生產(chǎn)消費(fèi)的問題時(shí),可以采用 pipe() 進(jìn)行通信。

      因?yàn)樽舆M(jìn)程復(fù) 制了父進(jìn)程的打開文件表,所以 pipe() 所建立的通信管道可被子進(jìn)程繼承,生產(chǎn) 和消費(fèi)進(jìn)程可以通過對(duì)同一管道文件的讀寫進(jìn)行通訊程序 (1) 中,消費(fèi)者從管道中接收生產(chǎn)者發(fā)送的數(shù)據(jù),并且和自己存儲(chǔ)區(qū)中的 數(shù)據(jù)進(jìn)行比較,兩者的數(shù)據(jù)是不同的,說明兩個(gè)進(jìn)程擁有不同的存儲(chǔ)空間2、 基于 clone() 的結(jié)果輸出分析結(jié)論 :由程序(2) 結(jié)果可見, clone() 語(yǔ)句在創(chuàng)建進(jìn)程時(shí),可通過參數(shù)設(shè)定子進(jìn)程與父 進(jìn)程是否共享存儲(chǔ)空間,從而可以創(chuàng)建真正意義上的線程生產(chǎn)者和消費(fèi)者進(jìn)程共 享內(nèi)存,從而可以通過共享內(nèi)存直接交換數(shù)據(jù)但是多個(gè)進(jìn)程共享內(nèi)存需要互斥機(jī) 制,程序中定義了臨界區(qū)變量 mutex和兩個(gè)信號(hào)量Product , warehouse,臨界區(qū)變量用于共享內(nèi)存操作的互斥,信號(hào)量分別實(shí)現(xiàn)了生產(chǎn)者和消費(fèi)者的等待程序(2) 中,消費(fèi)者輸出存儲(chǔ)區(qū)中的數(shù)據(jù),并且存儲(chǔ)區(qū)中的數(shù)據(jù)隨著生產(chǎn)者存入的數(shù)據(jù)而發(fā)生變化,說明 clone() 語(yǔ)句通過 flag 的設(shè)定實(shí)現(xiàn) 了共享內(nèi)存若在實(shí)驗(yàn)中除去 CLONE_Va項(xiàng),將出現(xiàn)非預(yù)期的結(jié)果篇三: 操作系統(tǒng)實(shí)驗(yàn)報(bào)告 _進(jìn)程和線程計(jì)算機(jī)科學(xué)與軟件學(xué)院操作系統(tǒng)上機(jī)實(shí)驗(yàn)報(bào)告學(xué)生姓名 : 學(xué)號(hào) : 班級(jí): 班 實(shí)驗(yàn)日期 : 2014.4.17實(shí)驗(yàn)名稱 :進(jìn)程和線程實(shí)驗(yàn)?zāi)康?:理解 unix/Linux 下進(jìn)程和線程的創(chuàng)建、并發(fā)執(zhí)行過程。

      實(shí)驗(yàn)內(nèi)容:1(進(jìn)程的創(chuàng)建2(多線程應(yīng)用實(shí)驗(yàn)步驟及分析 :( 此部分為關(guān)鍵內(nèi)容 : 要求整理實(shí)驗(yàn)主要步驟,總結(jié)編寫實(shí)驗(yàn)過程中遇到哪些問題,如何解決的,若未解決也應(yīng)總結(jié),回答思考題的答案 )、進(jìn)程的創(chuàng)建F面這個(gè)C程序展示了 UNIX系統(tǒng)中父進(jìn)程創(chuàng)建子進(jìn)程及各自分開活動(dòng)的情況1、實(shí)驗(yàn)指導(dǎo)fork( )創(chuàng)建一個(gè)新進(jìn)程系統(tǒng)調(diào)用格式 :pid=fork( )參數(shù)定義 :int fork( )fork( ) 返回值意義如下 :0:在子進(jìn)程中, pid 變量保存的 fork( ) 返回值為 0,表示當(dāng)前進(jìn)程是子進(jìn)程0:在父進(jìn)程中, pid 變量保存的 fork( ) 返回值為子進(jìn)程的 id 值(進(jìn)程唯一標(biāo) 識(shí)符) -1: 創(chuàng)建失敗如果fork()調(diào)用成功,它向父進(jìn)程返回子進(jìn)程的 PID,并向子進(jìn)程返回0,即 fork()被調(diào)用了一次,但返回了兩次此時(shí) OS在內(nèi)存中建立一個(gè)新進(jìn)程,所建的新進(jìn)程是調(diào)用 fork( ) 父進(jìn)程 (parent process) 的副本,稱為子進(jìn)程 (child process) 子進(jìn)程繼承了父進(jìn)程的許多特性,并具有與父進(jìn)程完全相同的用戶級(jí)上 下文父進(jìn)程與子進(jìn)程并發(fā)執(zhí)行2、參考程序代碼/*process.c*/#include stdio.h#include sys/types.hmain(int argc,char *argv[])int pid;/* fork another process */pid = fork();if (pid 0) { /* error occurred */fprintf(stderr, Fork Failed);exit(-1);else if (pid == 0) {/* child process */execlp( /bin/ls, ls,NULL);else {/* parent process *//* parent will wait for the child to complete */wait(NULL);printf( Child Complete );exit(0);3、編譯和運(yùn)行$gcc process.c - o processs4、運(yùn)行$./process 程序運(yùn)行截圖5、思考(1)系統(tǒng)是怎樣創(chuàng)建進(jìn)程的 ,(2)擴(kuò)展程序,在父進(jìn)程中輸出 1到 5,在子進(jìn)程中輸出 6-10,要求父子進(jìn)程并發(fā)輸出; 記錄實(shí)驗(yàn)結(jié)果,并給出簡(jiǎn)單分析。

      6. 實(shí)驗(yàn)中遇到的問題和解決方法、多線程應(yīng)用編寫 unix/Linux 下的多線程程序,需要使用頭文件 pthread.h ,連接時(shí)需要使 用庫(kù) libpthread.a 下面是一個(gè)最簡(jiǎn)單的多線程程序 example1.c 1. 實(shí)驗(yàn)指導(dǎo)面的示例中,要使用到兩個(gè)函數(shù), pthread_create 和 pthread_join ,并聲明了一個(gè) pthread_t 型的變量函數(shù) pthread_create 用來創(chuàng)建一個(gè)線程,它的原型為 :extern int pthread_create __P ((pthread_t *__thread, __constpthread_attr_t *__attr,void *(*__start_routine) (void *), void*__arg));第一個(gè)參數(shù)為指向線程標(biāo)識(shí)符的指針,第二個(gè)參數(shù)用來設(shè)置線程屬性,第三個(gè) 參數(shù)是線程運(yùn)行函數(shù)的起始地址,最后一個(gè)參數(shù)是運(yùn)行函數(shù)的參數(shù)這里,我們的 函數(shù) thread 不需要參數(shù),所以最后一個(gè)參數(shù)設(shè)為空指針第二個(gè)參數(shù)我們也設(shè)為空指針,這樣將生成默認(rèn)屬性的線程當(dāng)創(chuàng)建線程成功時(shí),函數(shù)返回 0,若不為 0則說明創(chuàng)建線程失敗,常見的錯(cuò)誤返回代碼為 EAGAINffi EINVAL前者表示系統(tǒng)限制創(chuàng)建新的線程,例如線程數(shù)目過多了后者表示第二個(gè)參數(shù)代表的線程屬性值非法。

      創(chuàng)建線程成功后,新創(chuàng)建的線程 則運(yùn)行參數(shù)三和參數(shù)四確定的函數(shù),原來的線程則繼續(xù)運(yùn)行下一行代碼函數(shù) pthread_join 用來等待一個(gè)線程的結(jié)束函數(shù)原型為 :extern int pthread_join __P ((pthread_t __th, void**__thread_return));第一個(gè)參數(shù)為被等待的線程標(biāo)識(shí)符,第二個(gè)參數(shù)為一個(gè)用戶定義的指針,它可 以用來存儲(chǔ)被等待線程的返回值這個(gè)函數(shù)是一個(gè)線程阻塞的函數(shù),調(diào)用它的函數(shù) 將一直等待到被等待的線程結(jié)束為止,當(dāng)函數(shù)返回時(shí),被等待線程的資源被收回一個(gè)線程的結(jié)束有兩種途徑,一種是象我們上面的例子一樣,函數(shù)結(jié)束了,調(diào) 用它的線程也就結(jié)束了 ; 另一種方式是通過函數(shù) pthread_exit 來實(shí)現(xiàn)它的函數(shù)原 型為:exter n void p thread_exitP ((void *__retval)) __attribute__ ((__noreturn__));唯一的參數(shù)是函數(shù)的返回代碼,只要 pthread_join 中的第二個(gè)參數(shù)thread_return 不是 NULL,這個(gè)值將被傳遞給 thread_return2、參考程序代碼/* thread.c*/#include stdio.h#include pthread.hvoid thread(void)int i;for(i=0;i3;i++)printf(This is a pthread.\n);int main(int argc,char *argv[])int i,ret;pthread_t id;ret=pthread_create(&id,NULL,(void *) thread,NULL);if(r。

      點(diǎn)擊閱讀更多內(nèi)容
    關(guān)于金鋤頭網(wǎng) - 版權(quán)申訴 - 免責(zé)聲明 - 誠(chéng)邀英才 - 聯(lián)系我們
    手機(jī)版 | 川公網(wǎng)安備 51140202000112號(hào) | 經(jīng)營(yíng)許可證(蜀ICP備13022795號(hào))
    ?2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.