版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 i/o系統(tǒng)調(diào)用開銷比較任務目的:了解i/o系統(tǒng)調(diào)用的特點,并通過性能測試增強直觀認識。任務要求:linux平臺用c變成實現(xiàn)文本文件內(nèi)容的倒序。分別使用三種方法,考慮效率,比較性能。標準c的io庫函數(shù):fopen fread fwriteunix的函數(shù):open read writeopen和mmap設計方案:實驗的主思路即提供中間容器,將文件中的數(shù)據(jù)讀出存入中間容器,再將容器的內(nèi)容逐次讀入文件內(nèi)部。其要求在于讀入文件的時候?qū)崿F(xiàn)文件內(nèi)容的倒序,則要求中間容器的內(nèi)容從最后一個數(shù)據(jù)讀起,或是在中間容器中早早實現(xiàn)數(shù)據(jù)內(nèi)容的倒序。類似于數(shù)據(jù)的壓棧操作和出棧操作,從文件中讀出數(shù)據(jù)壓入棧底,再從棧底讀出數(shù)
2、據(jù)寫入文件頭,中間容器則為棧。為實現(xiàn)對數(shù)據(jù)的倒序,本任務采取定義一個大容量的數(shù)組作為中間的容器,從文件里以要求讀取的數(shù)據(jù)塊大小讀取文件的內(nèi)容,同時將讀出的數(shù)據(jù)存入數(shù)組中,讀完數(shù)據(jù)可知數(shù)組的大小,再重寫源文件,實現(xiàn)數(shù)組的最后一個元素寫入文件頭,數(shù)組下標不斷減少,以所要求寫入的數(shù)據(jù)塊大小重新寫入文件。針對read和fread每次讀取大小有要求,主要在于讀取或?qū)懭霑r緩沖區(qū)的大小,動態(tài)定義緩沖區(qū)的大小實現(xiàn)每次讀取或?qū)懭霐?shù)據(jù)的大小控制。為實現(xiàn)測試文件的內(nèi)容能完整地存入中間容器,即字符串數(shù)組,需要動態(tài)申請文件大小的數(shù)組,存取文件中的內(nèi)容。mmanp指memory-mapped(存儲映射)其將文件內(nèi)容映射到
3、進程地址空間,相比傳統(tǒng)的方法而言,減少了系統(tǒng)調(diào)用和內(nèi)容拷貝,無需進行文件內(nèi)容的讀取和寫入,減少了完成所需要的時間,提高了整體的效率,從而提高了性能。主要在于數(shù)據(jù)的重新排序。設計內(nèi)容:使用標準的c語言i/o庫函數(shù)。存儲結(jié)構(gòu)為數(shù)組,使用fopen以只讀模式打開源文件,用fread and fwrite 實現(xiàn)數(shù)據(jù)的讀入和寫入,其核心代碼如下:/讀出文件數(shù)據(jù) while(!feof(fpout)&ifilespace) fread(buff,readspace*sizeof(char),1,fpout); for(j=0;jreadspace;j+,i+) *(date+i)=*(buff+j); f
4、or(k=0;k(filespace/readspace);k+) for(j=0;jreadspace;j+,i-)/從數(shù)組讀出數(shù)據(jù)塊存入buff *(buff+j)=*(date+i); fwrite(buff,readspace*sizeof(char),1,fpin); 使用unix的i/o庫函數(shù)。利用文件的底層操作,完成文件內(nèi)容的讀取,打開文件時以讀取方式打開,方便文件內(nèi)容的讀取和寫入。核心代碼如下:size=read(fd,buff,readspace*sizeof(char);for(j=0;jreadspace;j+) *(date+i)=*(buff+j); /printf(
5、%c,*(date+i); i+; /存入數(shù)組 for(k=0;k(filespace/readspace);k+) for(j=0;jreadspace;j+,i-) *(buff+j)=*(date+i); /printf(%c,*(buff+j); /從數(shù)組中倒序存入緩沖區(qū) size=write(fdi,buff,readspace*sizeof(char);/寫回文件mmap和open。此方式實現(xiàn)地址內(nèi)容的映射,對共享內(nèi)存的數(shù)據(jù)進行了更改,同時也將反映在文件內(nèi)容,此處只需將數(shù)據(jù)存儲在數(shù)組中,再寫回到內(nèi)存中,這樣就對文件中的內(nèi)容實現(xiàn)倒序。核心代碼如下:sm=mmap(0,filespac
6、e*sizeof(char),prot_write|prot_read,map_shared,src,0); while(i0) *sm=datefilespace-i; sm-; i-; 任務結(jié)果性能測試:參與測試的文件有三種大?。?kb、256kb、64mb.每次讀取的大小分別為1字節(jié),256字節(jié),4kb和16kb。使用time測試各種文件,讀取大小不同其結(jié)果的變化規(guī)律。測試文件為4kb,分別以1字節(jié)、256字節(jié)、4kb大小讀取,以標準c語言i/o讀取實際時間用戶cpu時間系統(tǒng)cpu時間1字節(jié)0m0.002s0m0.001s0m0.001s256字節(jié)0m0.002s0m0.001s0m0.
7、001s4kb0m0.002s0m0.000s0m0.001s測試文件為4kb,分別以1字節(jié)、256字節(jié)、4kb大小讀取,以unix的i/o讀取實際時間用戶cpu時間系統(tǒng)cpu時間1字節(jié)0m0.019s0m0.003s0m0.015s256字節(jié)0m0.004s0m0.002s0m0.001s4kb0m0.002s0m0.000s0m0.001s測試文件為4kb,256kb和64mb,以open和mmap讀取實際時間用戶cpu時間系統(tǒng)cpu時間4kb0m0.020s0m0.003s0m0.015s256kb0m0.006s0m0.002s0m0.003s64mb0m1.398s0m0.802s0
8、m0.149s測試文件為256kb,分別以1字節(jié)、256字節(jié)、4kb、16kb大小讀取,以標準c語言i/o讀取實際時間用戶cpu時間系統(tǒng)cpu時間1字節(jié)0m0.034s0m0.033s0m0.001s256字節(jié)0m0.006s0m0.005s0m0.001s4kb0m0.007s0m0.002s0m0.005s16kb0m0.005s0m0.004s0m0.001s測試文件為256kb,分別以1字節(jié)、256字節(jié)、4kb、16kb大小讀取,以unix的i/o讀取實際時間用戶cpu時間系統(tǒng)cpu時間1字節(jié)0m1.233s0m0.088s0m1.138s256字節(jié)0m0.021s0m0.002s0m
9、0.010s4kb0m0.004s0m0.002s0m0.002s16kb0m0.008s0m0.004s0m0.004s測試文件為64mb,分別以1字節(jié)、256字節(jié)、4kb、16kb大小讀取,以標準c語言i/o讀取實際時間用戶cpu時間系統(tǒng)cpu時間1字節(jié)0m5.792s0m5.579s0m0.298s256字節(jié)0m0.882s0m0.613s0m0.266s4kb0m0.820s0m0.494s0m0.353s16kb0m0.800s0m0.578s0m0.275s測試文件為64mb,分別以1字節(jié)、256字節(jié)、4kb、16kb大小讀取,以unix的i/o讀取實際時間用戶cpu時間系統(tǒng)cpu
10、時間1字節(jié)5m21.923s0m17.469s4m44.656s256字節(jié)0m1.774s0m0.548s0m1.210s4kb0m0.603s0m0.493s0m0.178s16kb0m0.534s0m0.488s0m0.146s運行結(jié)果分析:從性能測試得到的結(jié)果,可以得出以下結(jié)論:對于同大小的測試文件,同樣讀取大小的三個不同的方式,標準c語言i/o庫函數(shù)花費的總時間相對比較小。對于同大小的測試文件,使用標準c語言i/o庫函數(shù),針對不同的讀取大小,隨著讀取大小增加而時間總的趨勢有減少。對于同大小的測試文件,使用unix i/o庫函數(shù),針對不同的讀取大小,隨著讀取大小增加而時間總的趨勢若減少。
11、對于同大小的測試文件,使用mmap函數(shù),針對不同的讀取大小,隨著測試文件大小增加而時間總的趨勢先減少后增加。感想與體會: 本次課程設計我學到了很多東西,我的專業(yè)知識不是很好,所以我實驗做的比較吃力。但是每次課程設計我都很好的向老師同學學習,在他們樂于幫助之下我學到了怎樣去寫,怎樣去調(diào)試,怎樣把書本上的東西付諸實踐。當我把代碼寫好并運行成功時,那份感覺棒極了,盡管我的代碼有些是參考同學的,但我還是從中學到很多,學到了怎樣用數(shù)組,怎樣用指針去存儲,怎樣用函數(shù)等等。我很高興,但我會繼續(xù)努力。之前看到老師在新浪微博上的參考資料,我就跟著老師的指導一步一步的做,我很感謝我有這樣的老師,每天晚上1點才睡,
12、就是為了我們能夠?qū)W到知識,就像老師自己說的,您確實做到了,是一位盡職的好老師。這就是我本次課程設計的感想和體會。*實驗源代碼如下:#include #include #include int main()const long int len = (4*1024);file * fp;int i;char slen; fp = fopen(4kb.txt,r+);fread(s,sizeof(s),1,fp);fseek(fp,0l,seek_set);/把文件指針移動到文件到首部for(i = len - 1;i = 0;i -)fwrite(&si,sizeof(char),1,fp);fc
13、lose(fp);return 0;#include #include #include void reverse(file *fp,long int offset,long int buffer) int i,sum; char* buff = (char *)malloc(sizeof(char)*buffer);char c;fseek(fp,0,2);sum = ftell(fp); if(offsetsum-buffer)/當最后一次到文檔長度小于buffer時 根據(jù)實際長度讀取寫入 if(offset = sum-buffer)return; fseek(fp,offset,0);
14、 fread(buff,sum-offset-1,1,fp); fseek(fp,0,0); for(i = 0;i buffer-1-i;i -) c = buffi; buffi = buffbuffer-1-i; buffbuffer-1-i = c; fwrite(buff,buffer,1,fp); free(buff);int main (int argc,char *argv)/命令+文件名+緩沖區(qū)大?。╞)file *fp;int a,b,c,d; long int buffer = atol(argv2);/緩沖區(qū)大小 if(fp = fopen(argv1,r+)=null
15、)printf(open file errorn);return 1; reverse(fp,0,buffer); fclose(fp);for(a = 0;a 40000000;a+)for(b = 0;b 40000000;b+)for(c = 0;c 44440000;c+)d = 0; return 0;#include #include #include #include #include /extern long tell (long fd);/const long int buffer = 1024*1024;void reverse(int id,long offset,lon
16、g buffer) int i,sum; char *buff = (char *)malloc(sizeof(char)*buffer);char c;sum = lseek(id,0,2); if(offset=sum-buffer)/當最后一次到文檔長度小于buffer時 根據(jù)實際長度讀取寫入 free(buff);buff = (char *)malloc(sizeof(char)*(sum-buffer+1); lseek(id,offset,0); read(id,buff,sum-offset+1); lseek(id,0,0);/if(buffsum-offset+1=n)/sum-; for(i = 0;i buffer-1-i;i -) c = buffi; buffi = buffbuffer-1-i; buffbuffer-1-i = c; write(id,bu
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無擔保借款協(xié)議書
- 遼寧省葫蘆島市(2024年-2025年小學五年級語文)人教版小升初真題(下學期)試卷及答案
- 《世界經(jīng)濟地理》課件2
- 《怎樣挑選羽毛球》課件
- 關于工程類實習報告范文錦集8篇
- 健康管理師試用期工作總結(jié)(5篇)
- 《詩歌構(gòu)思技巧》課件
- 2024年成品油公路運輸合同
- 2024年房屋二次抵押貸款合同
- 2024年建筑項目工程師聘請協(xié)議
- 道亨送電線路三維設計平臺使用培訓ppt模板
- 民族式摔跤競賽規(guī)則
- 不合理處方登記表
- 國內(nèi)外利用活性炭處理硫化氫的原理
- 07版監(jiān)理收費標準插入法計算器
- 重慶市七年級數(shù)學上學期期中試題新人教版
- 08S305-小型潛水泵選用及安裝圖集
- 吉林省長春市東北師大附中2019-2020上學期——九年級數(shù)學大練習題試卷
- 新能源汽車充電樁運營平臺建設商業(yè)計劃書
- 圖形創(chuàng)意-表現(xiàn)手法(課堂PPT)課件
- 北京某進修護理匯報ppt課件
評論
0/150
提交評論