日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 标准IO缓冲机制探究

發布時間:2025/3/15 linux 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 标准IO缓冲机制探究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、什么是緩存I/O(Buffered I/O)
緩存I/O又被稱作標準I/O,大多數文件系統默認I/O操作都是緩存I/O。在Linux的緩存I/O機制中,操作系統會將I/O的數據緩存在文件系統的頁緩存(page cache)中,也就是說,數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。
1.緩存I/O有以下優點:
A.緩存I/O使用了操作系統內核緩沖區,在一定程度上分離了應用程序空間和實際的物理設備。
B.緩存I/O可以減少讀盤的次數,從而提高性能
當應用程序嘗試讀取某塊數據的時候,如果這塊數據已經存放在頁緩存中,那么這塊數據就可以立即返回給應用程序,而不需要經過實際的物理讀盤操作。當然,如果數據在應用程序讀取之前并未被存放在頁緩存中,那么就需要先將數據從磁盤讀到頁緩存中去。對于寫操作來說,應用程序也會將數據先寫到頁緩存中去,數據是否被立即寫到磁盤上去取決于應用程序所采用的寫操作機制:如果用戶采用的是同步寫機制,那么數據會立即被寫回到磁盤上,應用程序會一直等到數據被寫完為止;如果用戶采用的是延遲寫機制,那么應用程序就完全不需要等到數據全部被 寫回到磁盤,數據只要被寫到頁緩存中去就可以了。在延遲寫機制的情況下,操作系統會定期地將放在頁緩存中的數據刷到磁盤上。與異步寫機制不同的是,延遲寫機制在數據完全寫到磁盤上得時候不會通知應用程序,而異步寫機制在數據完全寫到磁盤上得時候是會返回給應用程序的。所以延遲寫機制本省是存在數據丟失的風險的,而異步寫機制則不會有這方面的擔心。
2.緩存I/O的缺點 在緩存I/O機制中,DMA方式可以將數據直接從磁盤讀到頁緩存中,或者將數據從頁緩存直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數據傳輸,這樣的話,數據在傳輸過程中需要在應用程序地址空間和頁緩存之間進行多次數據拷貝操作,這些數據拷貝操作說帶來的cpu以及內存開銷是非常大的。
二、文件指針
FILE指針:每個被使用的文件都在內存中開辟一個區域,用來存放文件的有關信息,這些信息是保存在一個結構體類型的變量中,該結構體類型是由系統定義的,取名為FILE。
標準I/O庫的所有操作都是圍繞流(stream)來進行的,在標準I/O中,流用FILE *來描敘的。
其在Linux操作系統中的定義:



三、行緩沖、全緩沖、不緩沖的定義
1.Fully buffered means that I/O takes place only when the buffer is fully, the process explicitly calls fflush, or the process terminates by calling exit. A common size for the standard I/O buffer is 4096 bytes;
2. Line buffered means that I/O takes place when a newline is encountered, when the process calls fflush, or when the process terminates by calling exit.
3. Unbuffered means that I/O take place each time a standard I/O output function is called.

Most unix implementations of the standard I/O libarary use the following rules.
1. Standard error is always unbuffered.
2. Standard input and standard output are fully buffered, unless they refer to a terminal device, in which case, they are line buffered.
3. All other streams are fully buffered unless they refer to a terminal device, in which case, they are line buffered.
四、一步步探究



  • #include?<stdio.h>
  • int?stream_attribute(FILE?*fp)
  • {
  • if(fp->_flags?&?_IO_UNBUFFERED)
  • {
  • printf("The IO type is unbuffered\n");
  • }else?if(fp->_flags?&?_IO_LINE_BUF){
  • printf("The IO type is line buf\n");
  • }else{
  • printf("The IO type is full buf\n");
  • }
  • printf("The IO size : %d\n",fp->_IO_buf_end?-?fp->_IO_buf_base);
  • return 0;
  • }
  • int?main()
  • {
  • FILE?*fp;
  • stream_attribute(stdin);
  • printf("___________________________________\n\n");
  • stream_attribute(stdout);
  • printf("___________________________________\n\n");
  • stream_attribute(stderr);
  • printf("___________________________________\n\n");
  • if((fp?=?fopen("test.txt","w+"))?==?NULL)
  • {
  • perror("fail to fopen");
  • }
  • stream_attribute(fp);
  • return 0;
  • }


  • 運行結果:



    我們修改一下代碼再看
  • #include?<stdio.h>
  • int?stream_attribute(FILE?*fp)
  • {
  • if(fp->_flags?&?_IO_UNBUFFERED)
  • {
  • printf("The IO type is unbuffered\n");
  • }else?if(fp->_flags?&?_IO_LINE_BUF){
  • printf("The IO type is line buf\n");
  • }else{
  • printf("The IO type is full buf\n");
  • }
  • printf("The IO size : %d\n",fp->_IO_buf_end?-?fp->_IO_buf_base);
  • return 0;
  • }
  • int?main()
  • {
  • FILE?*fp;
  • getchar();
  • stream_attribute(stdin);
  • printf("___________________________________\n\n");
  • stream_attribute(stdout);
  • printf("___________________________________\n\n");
  • stream_attribute(stderr);
  • printf("___________________________________\n\n");
  • if((fp?=?fopen("test.txt","w+"))?==?NULL)
  • {
  • perror("fail to fopen");
  • }
  • printf("before write:\n");
  • stream_attribute(fp);
  • fputc('a',fp);
  • printf("after write:\n");
  • stream_attribute(fp);
  • return 0;
  • }
  • 運行結果:


    從以上我們可以看出,標準I/O并不是一開始就分配的,只有進行了輸入或者輸出的操作才進行分配的,標準輸入和標準輸出默認是全緩沖,但是如果和終端關了就是行緩沖??梢钥吹皆趌inux操作系統中行緩沖的大小是1k,全緩沖的大小是4k。



    原文地址: http://blog.chinaunix.net/uid-26833883-id-3198114.html

    總結

    以上是生活随笔為你收集整理的linux 标准IO缓冲机制探究的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。