

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> I/O系統(tǒng)調(diào)用開銷比較</p><p><b> 任務(wù)目的:</b></p><p> 了解I/O系統(tǒng)調(diào)用的特點(diǎn),并通過性能測試增強(qiáng)直觀認(rèn)識。</p><p><b> 任務(wù)要求:</b></p><p> Linux平臺用C變成實(shí)現(xiàn)文本文件內(nèi)容的倒序。</p&g
2、t;<p> 分別使用三種方法,考慮效率,比較性能。</p><p> 標(biāo)準(zhǔn)C的I/O庫函數(shù):fopen fread fwrite</p><p> Unix的函數(shù):open read write</p><p><b> Open和mmap</b></p><p><b> 設(shè)計(jì)方案:
3、</b></p><p> 實(shí)驗(yàn)的主思路即提供中間容器,將文件中的數(shù)據(jù)讀出存入中間容器,再將容器的內(nèi)容逐次讀入文件內(nèi)部。其要求在于讀入文件的時(shí)候?qū)崿F(xiàn)文件內(nèi)容的倒序,則要求中間容器的內(nèi)容從最后一個(gè)數(shù)據(jù)讀起,或是在中間容器中早早實(shí)現(xiàn)數(shù)據(jù)內(nèi)容的倒序。類似于數(shù)據(jù)的壓棧操作和出棧操作,從文件中讀出數(shù)據(jù)壓入棧底,再從棧底讀出數(shù)據(jù)寫入文件頭,中間容器則為棧。</p><p> 為實(shí)現(xiàn)對數(shù)
4、據(jù)的倒序,本任務(wù)采取定義一個(gè)大容量的數(shù)組作為中間的容器,從文件里以要求讀取的數(shù)據(jù)塊大小讀取文件的內(nèi)容,同時(shí)將讀出的數(shù)據(jù)存入數(shù)組中,讀完數(shù)據(jù)可知數(shù)組的大小,再重寫源文件,實(shí)現(xiàn)數(shù)組的最后一個(gè)元素寫入文件頭,數(shù)組下標(biāo)不斷減少,以所要求寫入的數(shù)據(jù)塊大小重新寫入文件。</p><p> 針對read和fread每次讀取大小有要求,主要在于讀取或?qū)懭霑r(shí)緩沖區(qū)的大小,動態(tài)定義緩沖區(qū)的大小實(shí)現(xiàn)每次讀取或?qū)懭霐?shù)據(jù)的大小控制。為實(shí)
5、現(xiàn)測試文件的內(nèi)容能完整地存入中間容器,即字符串?dāng)?shù)組,需要動態(tài)申請文件大小的數(shù)組,存取文件中的內(nèi)容。</p><p> Mmanp指memory-mapped(存儲映射)其將文件內(nèi)容映射到進(jìn)程地址空間,相比傳統(tǒng)的方法而言,減少了系統(tǒng)調(diào)用和內(nèi)容拷貝,無需進(jìn)行文件內(nèi)容的讀取和寫入,減少了完成所需要的時(shí)間,提高了整體的效率,從而提高了性能。主要在于數(shù)據(jù)的重新排序。</p><p><b&g
6、t; 設(shè)計(jì)內(nèi)容:</b></p><p> 使用標(biāo)準(zhǔn)的C語言I/O庫函數(shù)。存儲結(jié)構(gòu)為數(shù)組,使用fopen以只讀模式打開源文件,用fread and fwrite 實(shí)現(xiàn)數(shù)據(jù)的讀入和寫入,其核心代碼如下:</p><p> //讀出文件數(shù)據(jù) </p><p> while(!feof(fpout)&&i<FILESPAC
7、E)</p><p><b> { </b></p><p> fread(buff,READSPACE*sizeof(char),1,fpout); </p><p> for(j=0;j<READSPACE;j++,i++)</p><p> { *(DATE+i)=*(
8、buff+j);} </p><p><b> }</b></p><p> for(k=0;k<(FILESPACE/READSPACE);k++)</p><p><b> { </b></p><p> for(j=0;j<READSPACE;j
9、++,i--)//從數(shù)組讀出數(shù)據(jù)塊存入buff</p><p><b> {</b></p><p> *(buff+j)=*(DATE+i);</p><p><b> }</b></p><p> fwrite(buff,READSPACE*sizeof(char),1,fpin);&l
10、t;/p><p><b> } </b></p><p> 使用Unix的I/O庫函數(shù)。利用文件的底層操作,完成文件內(nèi)容的讀取,打開文件時(shí)以讀取方式打開,方便文件內(nèi)容的讀取和寫入。核心代碼如下:</p><p> size=read(fd,buff,READSPACE*sizeof(char));for(j=0;j<RE
11、ADSPACE;j++) { *(DATE+i)=*(buff+j); //printf("%c",*(DATE+i)); i++; }//存入數(shù)組 for(k=0;k<(FILESPACE/READSPACE);k++) { for(j=0;j<READSPACE;j++,i--)
12、{ *(buff+j)=*(DATE+i); //printf("%c",*(buff+j)); }//從數(shù)組中倒序存入緩沖區(qū) size=write(fdi,buff,READSPACE*sizeof(char));//寫回文件}</p><p> mmap和ope
13、n。此方式實(shí)現(xiàn)地址內(nèi)容的映射,對共享內(nèi)存的數(shù)據(jù)進(jìn)行了更改,同時(shí)也將反映在文件內(nèi)容,此處只需將數(shù)據(jù)存儲在數(shù)組中,再寫回到內(nèi)存中,這樣就對文件中的內(nèi)容實(shí)現(xiàn)倒序。核心代碼如下:</p><p> sm=mmap(0,FILESPACE*sizeof(char),PROT_WRITE|PROT_READ,MAP_SHARED,src,0); while(i<FILESPACE) { DA
14、TE[i]=*sm; i++; sm++; } sm--; while(i>0) { *sm=DATE[FILESPACE-i]; sm--; i--; } 任務(wù)結(jié)果性能測試:</p><p> 參與測試的文件有三種大?。?KB、256KB、64MB.每次讀
15、取的大小分別為1字節(jié),256字節(jié),4KB和16KB。使用time測試各種文件,讀取大小不同其結(jié)果的變化規(guī)律。</p><p> 測試文件為4KB,分別以1字節(jié)、256字節(jié)、4KB大小讀取,以標(biāo)準(zhǔn)C語言I/O讀取</p><p> 測試文件為4KB,分別以1字節(jié)、256字節(jié)、4KB大小讀取,以unix的I/O讀取</p><p> 測試文件為4KB,256KB和
16、64MB,以open和mmap讀取</p><p> 測試文件為256KB,分別以1字節(jié)、256字節(jié)、4KB、16KB大小讀取,以標(biāo)準(zhǔn)C語言I/O讀取</p><p> 測試文件為256KB,分別以1字節(jié)、256字節(jié)、4KB、16KB大小讀取,以unix的I/O讀取</p><p> 測試文件為64MB,分別以1字節(jié)、256字節(jié)、4KB、16KB大小讀取,以標(biāo)
17、準(zhǔn)C語言I/O讀取</p><p> 測試文件為64MB,分別以1字節(jié)、256字節(jié)、4KB、16KB大小讀取,以unix的I/O讀取</p><p><b> 運(yùn)行結(jié)果分析:</b></p><p> 從性能測試得到的結(jié)果,可以得出以下結(jié)論:</p><p> 對于同大小的測試文件,同樣讀取大小的三個(gè)不同的方式,
18、標(biāo)準(zhǔn)C語言I/O庫函數(shù)花費(fèi)的總時(shí)間相對比較小。</p><p> 對于同大小的測試文件,使用標(biāo)準(zhǔn)C語言I/O庫函數(shù),針對不同的讀取大小,隨著讀取大小增加而時(shí)間總的趨勢有減少。</p><p> 對于同大小的測試文件,使用Unix I/O庫函數(shù),針對不同的讀取大小,隨著讀取大小增加而時(shí)間總的趨勢若減少。</p><p> 對于同大小的測試文件,使用mmap函數(shù),
19、針對不同的讀取大小,隨著測試文件大小增加而時(shí)間總的趨勢先減少后增加。</p><p><b> 感想與體會:</b></p><p> 本次課程設(shè)計(jì)我學(xué)到了很多東西,我的專業(yè)知識不是很好,所以我實(shí)驗(yàn)做的比較吃力。但是每次課程設(shè)計(jì)我都很好的向老師同學(xué)學(xué)習(xí),在他們樂于幫助之下我學(xué)到了怎樣去寫,怎樣去調(diào)試,怎樣把書本上的東西付諸實(shí)踐。當(dāng)我把代碼寫好并運(yùn)行成功時(shí),那份感覺
20、棒極了,盡管我的代碼有些是參考同學(xué)的,但我還是從中學(xué)到很多,學(xué)到了怎樣用數(shù)組,怎樣用指針去存儲,怎樣用函數(shù)等等。我很高興,但我會繼續(xù)努力。之前看到老師在新浪微博上的參考資料,我就跟著老師的指導(dǎo)一步一步的做,我很感謝我有這樣的老師,每天晚上1點(diǎn)才睡,就是為了我們能夠?qū)W到知識,就像老師自己說的,您確實(shí)做到了,是一位盡職的好老師。</p><p> 這就是我本次課程設(shè)計(jì)的感想和體會。</p><p
21、><b> *實(shí)驗(yàn)源代碼如下:</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p> #include <stdlib.h></p><p> int main()</p>
22、<p><b> {</b></p><p> const long int LEN = (4*1024);</p><p> FILE * fp;</p><p><b> int i;</b></p><p> char s[LEN];</p><p
23、> fp = fopen("4kb.txt","r+");</p><p> fread(s,sizeof(s),1,fp);</p><p> fseek(fp,0L,SEEK_SET);//把文件指針移動到文件到首部</p><p> for(i = LEN - 1;i >= 0;i --)</p
24、><p><b> {</b></p><p> fwrite(&s[i],sizeof(char),1,fp);</p><p><b> }</b></p><p> fclose(fp);</p><p><b> return 0;</b
25、></p><p><b> }</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #include <string.h></p><p> void re
26、verse(FILE *fp,long int offset,long int buffer)</p><p><b> {</b></p><p> int i,sum;</p><p> char* buff = (char *)malloc(sizeof(char)*buffer);</p><p><
27、b> char c;</b></p><p> fseek(fp,0,2);</p><p> sum = ftell(fp);</p><p> if(offset>sum-buffer)//當(dāng)最后一次到文檔長度小于buffer時(shí) 根據(jù)實(shí)際長度讀取寫入</p><p><b> {</b&g
28、t;</p><p> if(offset == sum-buffer)</p><p><b> return;</b></p><p> fseek(fp,offset,0);</p><p> fread(buff,sum-offset-1,1,fp);</p><p> fsee
29、k(fp,0,0);</p><p> for(i = 0;i < sum-offset-2 - i;i ++)</p><p><b> {</b></p><p> c = buff[i];</p><p> buff[i] = buff[sum-offset-2 - i];</p>&l
30、t;p> buff[sum-offset-2-i] = c;</p><p><b> }</b></p><p> fwrite(buff,sum-offset-1,1,fp);</p><p><b> return;</b></p><p><b> }</b&
31、gt;</p><p><b> else</b></p><p><b> {</b></p><p> fseek(fp,offset,0);</p><p> fread(buff,buffer,1,fp);</p><p> //puts(buff);&l
32、t;/p><p> reverse(fp,ftell(fp),buffer);//遞歸</p><p><b> }</b></p><p> for(i = buffer - 1;i > buffer-1-i;i --)</p><p><b> {</b></p><
33、;p> c = buff[i];</p><p> buff[i] = buff[buffer-1-i];</p><p> buff[buffer-1-i] = c;</p><p><b> }</b></p><p> fwrite(buff,buffer,1,fp);</p><
34、;p> free(buff);</p><p><b> }</b></p><p> int main (int argc,char *argv[])//命令+文件名+緩沖區(qū)大小(B)</p><p><b> {</b></p><p><b> FILE *fp;&l
35、t;/b></p><p> int a,b,c,d;</p><p> long int buffer = atol(argv[2]);//緩沖區(qū)大小</p><p> if((fp = fopen(argv[1],"r+"))==NULL)</p><p><b> {</b><
36、;/p><p> printf("open file error\n");</p><p><b> return 1;</b></p><p><b> }</b></p><p> reverse(fp,0,buffer);</p><p> f
37、close(fp);</p><p> for(a = 0;a < 40000000;a++)</p><p><b> {</b></p><p> for(b = 0;b < 40000000;b++)</p><p> for(c = 0;c < 44440000;c++)</p&g
38、t;<p><b> d = 0;</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> #include <stdio.h
39、></p><p> #include <stdlib.h></p><p> #include <fcntl.h></p><p> #include <unistd.h></p><p> #include <string.h></p><p> //
40、extern long tell (long fd);</p><p> //const long int buffer = 1024*1024;</p><p> void reverse(int id,long offset,long buffer)</p><p><b> {</b></p><p> i
41、nt i,sum;</p><p> char *buff = (char *)malloc(sizeof(char)*buffer);</p><p><b> char c;</b></p><p> sum = lseek(id,0,2);</p><p> if(offset>=sum-buffer
42、)//當(dāng)最后一次到文檔長度小于buffer時(shí) 根據(jù)實(shí)際長度讀取寫入</p><p><b> {</b></p><p> free(buff);</p><p> buff = (char *)malloc(sizeof(char)*(sum-buffer+1));</p><p> lseek(id,offs
43、et,0);</p><p> read(id,buff,sum-offset+1);</p><p> lseek(id,0,0);</p><p> //if(buff[sum-offset+1]=='\n')</p><p> //sum--;</p><p> for(i = 0
44、;i < sum-offset - i;i ++)</p><p><b> {</b></p><p> c = buff[i];</p><p> buff[i] = buff[sum-offset-1- i];</p><p> buff[sum-offset-1-i] = c;</p>
45、<p><b> }</b></p><p> write(id,buff,sum-offset);</p><p><b> return;</b></p><p><b> }</b></p><p><b> else</b>&
46、lt;/p><p><b> {</b></p><p> lseek(id,offset,0);</p><p> read(id,buff,buffer);</p><p> // printf("%s|\n",buff);</p><p> reverse(id,
47、lseek(id,0,1),buffer);//遞歸</p><p><b> }</b></p><p> for(i = buffer - 1;i > buffer-1-i;i --)</p><p><b> {</b></p><p> c = buff[i];</p&g
48、t;<p> buff[i] = buff[buffer-1-i];</p><p> buff[buffer-1-i] = c;</p><p><b> } </b></p><p> write(id,buff,strlen(buff));</p><p> // printf(&quo
49、t;%d",strlen(buff));</p><p><b> }</b></p><p> int main (int argc,char *argv[])//命令+文件名+緩沖區(qū)大?。˙)</p><p><b> {</b></p><p> long int buffe
50、r = atol(argv[2]);</p><p><b> int id;</b></p><p> if((id = open(argv[1],O_RDWR))==-1)</p><p><b> {</b></p><p> printf("open file error
51、\n");</p><p><b> return 1;</b></p><p><b> }</b></p><p> printf("open success\n");</p><p> reverse(id,0,buffer);</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-文件管理實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程實(shí)驗(yàn)報(bào)告
- 讀者與寫者-操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告--內(nèi)存的連續(xù)分配算法
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)實(shí)驗(yàn)報(bào)告 (5)
- 操作系統(tǒng)實(shí)驗(yàn)報(bào)告模板
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 《操作系統(tǒng)》課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)作業(yè)調(diào)度實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告2014217151
- 《操作系統(tǒng)原理》課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告2
評論
0/150
提交評論