操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告---io系統(tǒng)調(diào)用開銷比較_第1頁
已閱讀1頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論