已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
20140316變長并發(fā)日志文件的設計及實現(xiàn)目錄程序員簡介2設計要求2系統(tǒng)組成2主要功能2結(jié)構(gòu)設計與分析2文件結(jié)構(gòu)設計2數(shù)據(jù)類型設計3寫入數(shù)據(jù)設計3文件鎖的設計3寫入數(shù)據(jù)設計4讀出數(shù)據(jù)設計5時間獲取轉(zhuǎn)換方法5讀取數(shù)據(jù)設計5運行結(jié)果截圖6遇到的問題及心得8采用的技術(shù)8開發(fā)環(huán)境9程序員簡介姓名:李爾楠學號:11281008班級:計科1101設計要求系統(tǒng)組成系統(tǒng)由兩個文件組成,日志文件及索引文件;日志文件存放日志記錄,日志記錄由日志記錄結(jié)構(gòu)描述,及日志記錄體組成;每個日志記錄可包含任意條數(shù)據(jù)項,每個數(shù)據(jù)項可是任意數(shù)據(jù)類型及長度;日志記錄結(jié)構(gòu)描述對本記錄的每個數(shù)據(jù)項進行描述。包括數(shù)據(jù)類型及長度;日志記錄體根據(jù)日志記錄結(jié)構(gòu)描述來存放日志記錄數(shù)據(jù)。索引文件存放自動增長的日志記錄號,日志記錄發(fā)生的日期及時間,指向日志文件中相應日志記錄的文件指針。主要功能增加日志記錄:生成日志記錄并寫入。根據(jù)本次日志記錄各數(shù)據(jù)項生成日志記錄結(jié)構(gòu)描述,再生成日志記錄體,并追加到日志文件尾。追加日志記錄時要考慮并發(fā)寫入問題(加鎖)根據(jù)當前日期時間,及日志記錄的位置生成索引記錄,并發(fā)寫入索引文件。日志記錄與索引記錄要同時鎖定,否則會發(fā)生錯誤瀏覽日志:瀏覽給定時間段日志。根據(jù)給定時間段,遍歷索引文件找到給定時間段的索引記錄,然后根據(jù)索引記錄讀出日志記錄并顯示,直到時間段結(jié)束。結(jié)構(gòu)設計與分析文件結(jié)構(gòu)設計本程序總體設計為兩個txt文件,即一個日志文件Log,一個索引文件Index。其中日志文件中主要保存當前記錄的總長度,當前記錄的每個內(nèi)容的類型及長度,還有具體內(nèi)容這三部分;索引文件中則保存的是寫入日志的當前時間和當前日志開始的位置指針。其結(jié)構(gòu)體分別定義如下:struct logStructure int dataType; int dataSize;typedef struct indexStructure time_t writeTime; int logF;indexStructure_t;數(shù)據(jù)類型設計由于要求隨機寫入隨機的數(shù)據(jù)類型,所以在此定義了6種數(shù)據(jù)類型,分別為char int short long float double類型,另外用字符數(shù)組來存放string類型的數(shù)據(jù)。數(shù)據(jù)類型及數(shù)據(jù)類型的長度保存方法如下:const int typeSize6 = sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(float), sizeof(double);const char typeName710= char, short, int, long, float, double, char;const char output76 = %cn, %dn, %dn, %ldn, %lldn, %fn, %sn;寫入數(shù)據(jù)設計文件鎖的設計在本次的實驗中,要求實現(xiàn)多線程同時訪問文件并進行并發(fā)式的寫入,為此需要對訪問文件進行上鎖。為了盡可能的提高并發(fā)度,文件的打開方式設置為共享打開方式,這樣就可以多個線程同時打開文件了。下面討論如何實現(xiàn)并發(fā)。在本次實驗中,我才用的方式是當線程訪問文件時先對文件的大小進行改變,然后在寫入數(shù)據(jù),因為相對于改變文件大小,寫入數(shù)據(jù)的時間是相對慢一些的,這樣就可以讓各個線程先進行對文件大小的修改,然后再各自慢慢的寫入數(shù)據(jù)。所以在寫入數(shù)據(jù)時并不需要進行加鎖,因為大家都往自己改過的空間里寫入數(shù)據(jù),需要加鎖的地方只是在修改文件大小的時候。然而,要更改文件的大小實際上是修改文件的屬性中的Size值,如圖1-1所示,文件的Size屬性在文件的頭部,而_locking函數(shù)所的是從文件體的當前指針位置指定的長度,此操作并沒有將文件頭部鎖住,所以在實現(xiàn)并發(fā)的過程中就可能出現(xiàn)多個線程同時修改Size的情況導致寫入混亂。圖1-1所以在此處我采用的方法為設置一個互斥變量int test = 0;然后每條線程在打開文件后均進行while循環(huán)當test = 1時進循環(huán)并輸出等待信息,當test = 0時,跳出循環(huán)然后將test置一表示當前有線程在進行文件屬性的修改其他線程則繼續(xù)進行while循環(huán)。寫入數(shù)據(jù)設計在產(chǎn)生數(shù)據(jù)方面根據(jù)要求所有的內(nèi)容都是隨機的,這樣我的設計方案是,首先進行播種,然后隨機生成一條記錄要寫的總字節(jié)數(shù)即WriteSize。首先將總字節(jié)數(shù)寫入到一條記錄的最前面4個字節(jié)方便以后向外讀。然后將type隨機產(chǎn)生個數(shù)模7確定隨機產(chǎn)生的類型,將該類型和該類型的長度作為描述寫入日志中,然后寫入對應的隨機產(chǎn)生的該類型的數(shù)據(jù)。就這樣一個數(shù)據(jù)一個數(shù)據(jù)寫入,每寫一次WriteSize減去一個log結(jié)構(gòu)體的字節(jié)大小即數(shù)據(jù)類型描述的大小,再減去一個數(shù)據(jù)類型長度的大小即寫入內(nèi)容的字節(jié)數(shù),這樣直到WriseSize小于或等于0的時候結(jié)束循環(huán)不再寫入。文件內(nèi)容存儲方式如圖1-2所示:圖1-2讀出數(shù)據(jù)設計時間獲取轉(zhuǎn)換方法根據(jù)題目要求,在讀取數(shù)據(jù)的時候需要可以讓用戶按照指定的時間范圍來獲取對應的日志記錄,這樣就需要將用戶輸入的字符串類型的日期(年月日時分秒)如20140316164800轉(zhuǎn)換成系統(tǒng)時間的time_t類型。此方法需要運用系統(tǒng)的tm結(jié)構(gòu)體,進行一系列簡單的運算即可完成,因為time_t類型,我在查看VS2010對其聲明的時候發(fā)現(xiàn),它就是一個64為的int型長整數(shù)。具體的轉(zhuǎn)換方法見代碼。讀取數(shù)據(jù)設計此部分的大體思想和寫入時很相近,也是將每條記錄的數(shù)據(jù)根據(jù)其描述按類型一個一個讀取出來。由于功能上要求用戶可以按所輸入的時間范圍讀取日志記錄,所以在這里需要先建立一個indexStructure類型的數(shù)組來將索引文件中的時間都保存到其中。然后將獲取的用戶輸入的時間轉(zhuǎn)換成長整型數(shù),這樣就可以通過大小的比較來確定到底要讀取那條記錄了。接下來只需將文件指針移動到索引中保存的記錄開始位置,進行讀取,方法同寫入時一樣,先讀取4個字節(jié)獲取當時的WriteSize,在此命名為ReadSize,然后讀sizeof(logStructure)長度的字節(jié)獲取該數(shù)據(jù)的類型,然后按照類型讀入,再按照類型輸出即可。運行結(jié)果截圖寫日志:圖1-4讀日志:圖1-5圖1-6遇到的問題及心得在本次實驗中起初設計的比較簡單,為了實現(xiàn)并發(fā)我講文件的打開方式設置為追加方式,同時為不可共享方式,這樣在一個線程打開該文件的情況下其他文件就無法打開,其他文件就進行死循環(huán)判斷直到能打開為止。這種方法下遇到的第一個問題就是每條線程都要打開和關(guān)閉2個文件這樣就出現(xiàn)了死循環(huán),以2個線程為例如圖1-3所示:圖1-3這樣當?shù)谝粋€線程成功打開日志和索引正在寫入,當寫入結(jié)束時,線程2判斷能不能打開日志文件結(jié)果不能,這時線程1將日志文件釋放,再將索引文件釋放;線程2再判斷能不能打開索引文件判斷為能打開,但是并不是同時打開日志和索引,索引就循環(huán)回去重新判斷,此時日志文件可以打開了但是索引文件已經(jīng)是打開狀態(tài)了此時就會發(fā)生線程2第二次判斷索引文件為打不開,這樣就會死循環(huán)在這里。解決的辦法為當發(fā)生這種一個打開一個沒打開的情況時就將打開的那個文件指針釋放,這樣就解決了問題。但在之后的討論中這種方法由于并發(fā)度過低決定放棄使用。之后便想到先改文件大小再寫日志的方法,在這里出現(xiàn)的問題就是運用_locking函數(shù)上鎖的時候然后執(zhí)行寫入操作的時候總會出現(xiàn)錯誤,這個問題通過前面敘述的設置一個變量即可解決。在調(diào)試到最后的過程中,出現(xiàn)了個最可笑的錯誤,就是前面剛寫入WriteSize時為了看看是不是正確寫入了,當時我就寫了一個Read進行測試。結(jié)果在寫讀取函數(shù)的時候發(fā)現(xiàn),怎么讀好像指針都指的位置不對,每次讀出來的不是笑臉就是零星,通過單步調(diào)試發(fā)現(xiàn)讀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025江蘇淮安市洪澤區(qū)中醫(yī)院招聘合同制專業(yè)技術(shù)人員2人(第二批)備考考試試題及答案解析
- 團結(jié)部門的活動策劃方案
- 2025四川綿陽市中心醫(yī)院合同制工勤人員招聘3人參考考試試題及答案解析
- 2025福建福州市園開港灣經(jīng)貿(mào)有限公司招聘1人參考筆試題庫附答案解析
- 2025江蘇南通市蘇錫通科技產(chǎn)業(yè)園區(qū)招商服務有限公司第二批次招聘延期模擬筆試試題及答案解析
- 2025湖南郴州市第四人民醫(yī)院招聘(引進)高層次專業(yè)技術(shù)人才24人參考考試試題及答案解析
- 深度解析(2026)《GBT 25728-2024糧油機械 氣壓磨粉機》
- 2025人民網(wǎng)寧夏分公司招聘媒介顧問2人參考筆試題庫附答案解析
- 2026年河北張家口經(jīng)開區(qū)編辦青年就業(yè)見習崗位招聘備考筆試試題及答案解析
- 2025青海海南州同德縣人民醫(yī)院招聘消防專職人員1人參考筆試題庫附答案解析
- 2025年淮北市相山區(qū)公開招考村(社區(qū))后備干部66名筆試考試參考試題及答案解析
- 2025年貴州錦麟化工有限責任公司招聘備考題庫及一套參考答案詳解
- 2025年石家莊市公安局鹿泉分局公開招聘留置看護警務輔助人員30人的備考題庫有答案詳解
- 【數(shù) 學】2025-2026學年北師大版七年級數(shù)學上冊期末綜合提升卷III
- 車輛運營托管協(xié)議書
- 文創(chuàng)創(chuàng)業(yè)IP打造與產(chǎn)品變現(xiàn)實戰(zhàn)方案2026年
- 2025年甘肅省書記員考試試題及答案
- 【MOOC】3D工程圖學-華中科技大學 中國大學慕課MOOC答案
- 快消品年度工作計劃
- 醫(yī)院后勤設備安全運維管理
- 思想道德與法治課件:第六章 第四節(jié) 自覺尊法學法守法用法
評論
0/150
提交評論