Linux高級環(huán)境編程實驗報告6_第1頁
Linux高級環(huán)境編程實驗報告6_第2頁
Linux高級環(huán)境編程實驗報告6_第3頁
Linux高級環(huán)境編程實驗報告6_第4頁
Linux高級環(huán)境編程實驗報告6_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

作業(yè)報告學生姓名:學號:指導教師:學生E-mail:一、作業(yè)名稱:英文統(tǒng)計詞頻程序的實現(xiàn)二、作業(yè)要求以英文文章為例,利用執(zhí)行體程序庫實現(xiàn)一個多進程詞頻統(tǒng)計的程序。對于給定的多個目錄,并發(fā)地統(tǒng)計每個目錄下的所有文件(假設每個文件中只有英文字符)中單詞出現(xiàn)的次數(shù),并最終匯總出在給定目錄下所有文件中單詞出現(xiàn)次數(shù),然后記錄下來。該過程要求采用多線程協(xié)作方式。三、設計與實現(xiàn)1、設計思路首先分析程序設計的需求,要對多個目錄下的文件進行詞頻統(tǒng)計,如果只用一個進程順序的對各個目錄下各個文件進行計算,會消耗很大時間,另外也無法充分發(fā)揮執(zhí)行體程序庫的優(yōu)勢。而且要求采用多線程協(xié)作方式,這樣很自然的會想到創(chuàng)建一些進程去各個目錄下進行統(tǒng)計,最后用一個進程統(tǒng)一管理這些進程,那么父進程和子進程的思想就出來了。這個過程中,我們是將一個任務劃分成了多個任務并行地去執(zhí)行,最后把這些子任務的執(zhí)行結果匯總起來就是整個任務的結果,其實這就是Map-Reduce思想——把整個任務執(zhí)行過程劃分為映射(Map)和化簡(Reduce)兩個階段。在詞頻統(tǒng)計程序設計中,這兩個階段具體工作劃分如下:1、映射(Map)階段:①.主進程根據(jù)輸入的目錄數(shù)量創(chuàng)建多個子進程,每個子進程處理一個目錄;②.子進程獲得目錄名后,遍歷整個目錄,統(tǒng)計該目錄下的每個文件的單詞詞頻,作為中間結果保存。③.子進程統(tǒng)計結束后把中間結果發(fā)送給主進程。2、化簡(Reduce)階段:①.父進程接收子進程發(fā)送過來的中間結果,并進行匯總;②.子進程發(fā)送結束后父進程向其發(fā)送退出消息,子進程接收到后退出;③.父進程檢查所有子進程是否全部退出,若是,則工作結束,父進程退出,否則父進程繼續(xù)等待所有子進程結束。圖3-1協(xié)議設計圖3-1顯示了主進程與子進程之間的消息協(xié)議,其消息通信流程也比較清楚。2、詞頻統(tǒng)計程序的實現(xiàn)代碼清單3.2.1classCLFatherInitMsg:publicCLMessage{public: CLFatherInitMsg():CLMessage(FATHER_INIT_MESSAGE_ID){}public: stringdirname};消息由消息頭部、消息標志ID和數(shù)據(jù)組成。代碼清單3.2.1給出了CLFatherInitMsg的聲明,該類繼承了CLMessage類。其中包含一個string類型的dirname變量,用來存放消息中攜帶的目錄名。此消息是由父進程發(fā)送給子進程的初始化消息,該目錄名即為子進程要進行單詞統(tǒng)計的目錄名。代碼清單3.2.2intmain(intargc,char**argv){…… try { if(!CLLibExecutiveInitializer::Initialize().IsSuccess()) { cout<<"Initializeerror"<<endl; return0; } CLFatherWordCountObserver*pFatherWordCountObserver=newCLFatherWordCountObserver; for(inti=1;i<argc;i++) pFatherWordCountObserver->PushDirname(argv[i]); pFatherWordCountObserver->Init(); CLNonThreadForMsgLoopfather_nonthread(pFatherWordCountObserver,"father_pipe",EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE); father_nonthread.RegisterDeserializer(CHILD_INIT_MESSAGE_ID,newCLChildInitMsgDeserializer);father_nonthread.RegisterDeserializer(CHILD_SEND_REQUEST_MESSAGE_ID,newCLChildSendRequestMsgDeserializer); father_nonthread.RegisterDeserializer(INTERMEDIATE_RESULT_MESSAGE_ID,newCLIntermediateResultMsgDeserializer); father_nonthread.RegisterDeserializer(CHILD_WORK_FINISH_MESSAGE_ID,newCLChildWorkFinishMsgDeserializer); father_nonthread.Run(0); throwCLStatus(0,0); } ……}代碼清單3.2.2顯示了主進程的main函數(shù),描述了主進程的執(zhí)行過程。首先實例化一個FatherWordCountObserver類的對象,并進行初始化操作。接著創(chuàng)建主進程的消息循環(huán)過程,該函數(shù)的傳入?yún)?shù)分別是:FahterWordCountObserver類指針,消息循環(huán)過程的名稱以及消息循環(huán)的方式。其中消息通信方式為進程間的管道通信。代碼清單3.2.3intmain(intargc,char*argv[]){if(argc!=2) { cout<<"usage:./a.outchildname"<<endl; exit(-1); } try { if(!CLLibExecutiveInitializer::Initialize().IsSuccess()) { cout<<"Initializeerror"<<endl; return0; }CLNonThreadForMsgLoopchild_nonthread(newCLChildWordCountObserver(argv[1]),argv[1],EXECUTIVE_BETWEEN_PROCESS_USE_PIPE_QUEUE); child_nonthread.RegisterDeserializer(FATHER_INIT_MESSAGE_ID,newCLFatherInitMsgDeserializer);child_nonthread.RegisterDeserializer(FATHER_ACK_MESSAGE_ID,newCLFatherAckMsgDeserializer); child_nonthread.RegisterDeserializer(QUIT_MESSAGE_ID,newCLQuitMsgDeserializer); child_nonthread.Run(0); throwCLStatus(0,0); } catch(CLStatus&s) { if(!CLLibExecutiveInitializer::Destroy().IsSuccess()) cout<<"Destroyerror"<<endl; return0; }}代碼清單3.2.3是子進程的main函數(shù),描述了子進程的執(zhí)行過程。分別將FATHER_INIT_MESSAGE_ID、FATHER_ACK_MESSAGE_ID、QUIT_MESSAGE_ID這三種消息ID的反序列化類注冊到消息循環(huán)過程中。四、測試根據(jù)前面工作,利用執(zhí)行體程序庫實現(xiàn)了詞頻統(tǒng)計程序,下面我們先穿件兩個待遍歷的目錄testdir_1和testdir_2,每個目錄中都有兩個文件(只有英文字符)。輸入如圖4-1所示的命令創(chuàng)建主線程,攜帶兩個目錄的目錄名,此時主線程等待。圖4-1創(chuàng)建主進程在另一個終端創(chuàng)建一個子進程ch1,此時主線程與子線程之間通信如圖4-2所示:圖4-2主進程與子進程ch1可以看出,此時主進程和子進程ch1已經(jīng)完成通信流程,ch1收到退出消息,而主線程并未退出,因為需要一個子進程完成對另個目錄的處理,所以在等待第二個進程的結束。創(chuàng)建子進程ch2,處理第二目錄下文件的詞頻統(tǒng)計,此時主進程與該子進程的通信如圖4-3所示??梢钥吹?,子進程ch2完成操作后,主進程發(fā)出退出消息,子進程ch2接收退出消息后結束,同

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論