




已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
20140316變長并發(fā)日志文件的設計及實現目錄程序員簡介2設計要求2系統(tǒng)組成2主要功能2結構設計與分析2文件結構設計2數據類型設計3寫入數據設計3文件鎖的設計3寫入數據設計4讀出數據設計5時間獲取轉換方法5讀取數據設計5運行結果截圖6遇到的問題及心得8采用的技術8開發(fā)環(huán)境9程序員簡介姓名:李爾楠學號:11281008班級:計科1101設計要求系統(tǒng)組成系統(tǒng)由兩個文件組成,日志文件及索引文件;日志文件存放日志記錄,日志記錄由日志記錄結構描述,及日志記錄體組成;每個日志記錄可包含任意條數據項,每個數據項可是任意數據類型及長度;日志記錄結構描述對本記錄的每個數據項進行描述。包括數據類型及長度;日志記錄體根據日志記錄結構描述來存放日志記錄數據。索引文件存放自動增長的日志記錄號,日志記錄發(fā)生的日期及時間,指向日志文件中相應日志記錄的文件指針。主要功能增加日志記錄:生成日志記錄并寫入。根據本次日志記錄各數據項生成日志記錄結構描述,再生成日志記錄體,并追加到日志文件尾。追加日志記錄時要考慮并發(fā)寫入問題(加鎖)根據當前日期時間,及日志記錄的位置生成索引記錄,并發(fā)寫入索引文件。日志記錄與索引記錄要同時鎖定,否則會發(fā)生錯誤瀏覽日志:瀏覽給定時間段日志。根據給定時間段,遍歷索引文件找到給定時間段的索引記錄,然后根據索引記錄讀出日志記錄并顯示,直到時間段結束。結構設計與分析文件結構設計本程序總體設計為兩個txt文件,即一個日志文件Log,一個索引文件Index。其中日志文件中主要保存當前記錄的總長度,當前記錄的每個內容的類型及長度,還有具體內容這三部分;索引文件中則保存的是寫入日志的當前時間和當前日志開始的位置指針。其結構體分別定義如下:struct logStructure int dataType; int dataSize;typedef struct indexStructure time_t writeTime; int logF;indexStructure_t;數據類型設計由于要求隨機寫入隨機的數據類型,所以在此定義了6種數據類型,分別為char int short long float double類型,另外用字符數組來存放string類型的數據。數據類型及數據類型的長度保存方法如下: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;寫入數據設計文件鎖的設計在本次的實驗中,要求實現多線程同時訪問文件并進行并發(fā)式的寫入,為此需要對訪問文件進行上鎖。為了盡可能的提高并發(fā)度,文件的打開方式設置為共享打開方式,這樣就可以多個線程同時打開文件了。下面討論如何實現并發(fā)。在本次實驗中,我才用的方式是當線程訪問文件時先對文件的大小進行改變,然后在寫入數據,因為相對于改變文件大小,寫入數據的時間是相對慢一些的,這樣就可以讓各個線程先進行對文件大小的修改,然后再各自慢慢的寫入數據。所以在寫入數據時并不需要進行加鎖,因為大家都往自己改過的空間里寫入數據,需要加鎖的地方只是在修改文件大小的時候。然而,要更改文件的大小實際上是修改文件的屬性中的Size值,如圖1-1所示,文件的Size屬性在文件的頭部,而_locking函數所的是從文件體的當前指針位置指定的長度,此操作并沒有將文件頭部鎖住,所以在實現并發(fā)的過程中就可能出現多個線程同時修改Size的情況導致寫入混亂。圖1-1所以在此處我采用的方法為設置一個互斥變量int test = 0;然后每條線程在打開文件后均進行while循環(huán)當test = 1時進循環(huán)并輸出等待信息,當test = 0時,跳出循環(huán)然后將test置一表示當前有線程在進行文件屬性的修改其他線程則繼續(xù)進行while循環(huán)。寫入數據設計在產生數據方面根據要求所有的內容都是隨機的,這樣我的設計方案是,首先進行播種,然后隨機生成一條記錄要寫的總字節(jié)數即WriteSize。首先將總字節(jié)數寫入到一條記錄的最前面4個字節(jié)方便以后向外讀。然后將type隨機產生個數模7確定隨機產生的類型,將該類型和該類型的長度作為描述寫入日志中,然后寫入對應的隨機產生的該類型的數據。就這樣一個數據一個數據寫入,每寫一次WriteSize減去一個log結構體的字節(jié)大小即數據類型描述的大小,再減去一個數據類型長度的大小即寫入內容的字節(jié)數,這樣直到WriseSize小于或等于0的時候結束循環(huán)不再寫入。文件內容存儲方式如圖1-2所示:圖1-2讀出數據設計時間獲取轉換方法根據題目要求,在讀取數據的時候需要可以讓用戶按照指定的時間范圍來獲取對應的日志記錄,這樣就需要將用戶輸入的字符串類型的日期(年月日時分秒)如20140316164800轉換成系統(tǒng)時間的time_t類型。此方法需要運用系統(tǒng)的tm結構體,進行一系列簡單的運算即可完成,因為time_t類型,我在查看VS2010對其聲明的時候發(fā)現,它就是一個64為的int型長整數。具體的轉換方法見代碼。讀取數據設計此部分的大體思想和寫入時很相近,也是將每條記錄的數據根據其描述按類型一個一個讀取出來。由于功能上要求用戶可以按所輸入的時間范圍讀取日志記錄,所以在這里需要先建立一個indexStructure類型的數組來將索引文件中的時間都保存到其中。然后將獲取的用戶輸入的時間轉換成長整型數,這樣就可以通過大小的比較來確定到底要讀取那條記錄了。接下來只需將文件指針移動到索引中保存的記錄開始位置,進行讀取,方法同寫入時一樣,先讀取4個字節(jié)獲取當時的WriteSize,在此命名為ReadSize,然后讀sizeof(logStructure)長度的字節(jié)獲取該數據的類型,然后按照類型讀入,再按照類型輸出即可。運行結果截圖寫日志:圖1-4讀日志:圖1-5圖1-6遇到的問題及心得在本次實驗中起初設計的比較簡單,為了實現并發(fā)我講文件的打開方式設置為追加方式,同時為不可共享方式,這樣在一個線程打開該文件的情況下其他文件就無法打開,其他文件就進行死循環(huán)判斷直到能打開為止。這種方法下遇到的第一個問題就是每條線程都要打開和關閉2個文件這樣就出現了死循環(huán),以2個線程為例如圖1-3所示:圖1-3這樣當第一個線程成功打開日志和索引正在寫入,當寫入結束時,線程2判斷能不能打開日志文件結果不能,這時線程1將日志文件釋放,再將索引文件釋放;線程2再判斷能不能打開索引文件判斷為能打開,但是并不是同時打開日志和索引,索引就循環(huán)回去重新判斷,此時日志文件可以打開了但是索引文件已經是打開狀態(tài)了此時就會發(fā)生線程2第二次判斷索引文件為打不開,這樣就會死循環(huán)在這里。解決的辦法為當發(fā)生這種一個打開一個沒打開的情況時就將打開的那個文件指針釋放,這樣就解決了問題。但在之后的討論中這種方法由于并發(fā)度過低決定放棄使用。之后便想到先改文件大小再寫日志的方法,在這里出現的問題就是運用_locking函數上鎖的時候然后執(zhí)行寫入操作的時候總會出現錯誤,這個問題通過前面敘述的設置一個變量即可解決。在調試到最后的過程中,出現了個最可笑的錯誤,就是前面剛寫入WriteSize時為了看看是不是正確寫入了,當時我就寫了一個Read進行測試。結果在寫讀取函數的時候發(fā)現,怎么讀好像指針都指的位置不對,每次讀出來的不是笑臉就是零星,通過單步調試發(fā)現讀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司燒烤戶外活動方案
- 公司球衣定制活動方案
- 教育信息化中的學生評價與反饋機制
- 高校輔導員應對非工作時間工作的理論依據與策略
- 低空經濟與應急救援領域的協(xié)同發(fā)展
- 財產保險企業(yè)預算管理優(yōu)化方案探討
- 教育信息化背景下的報告制作與分享
- 循環(huán)經濟與生態(tài)環(huán)境保護實踐
- 提升創(chuàng)新能力驅動產品升級
- 提升教育用戶粘性的營銷方法
- 山西省太原市萬柏林區(qū)多校2023-2024學年二年級下學期期末語文試卷
- DLT 1053-2017 電能質量技術監(jiān)督規(guī)程
- 四川省內江市2023-2024學年七年級下學期7月期末英語試題
- 新教科版三年級下冊科學期末測試卷及完整答案(網校專用)
- 《天然氣壓縮機》
- 市政道路工程技術標正文樣本
- 大腦后動脈動脈瘤破裂伴蛛網膜下腔出血個案護理
- 東方市生活垃圾焚燒爐渣綜合利用項目 環(huán)評報告
- 不規(guī)格符石鑲嵌工藝
- 長期貨物物流運輸合同書
- 基于人工智能的智慧農業(yè)應用案例
評論
0/150
提交評論