IO效率

ssize_t read(int filedes, void *buf, size_t nbytes);

read函数从打开的文件中读取数据;如果成功则返回读取的字节数,如果已经到文件结尾则返回0,如果出错则返回-1

nbytes是要求读取的字节数,读取之后存放在缓冲区buf中,同时文件读写位置后移;当函数返回,buf中前返回值个字节是读取来的,而实际读取的返回值字节数有可能会小于请求读取的字节数nbytes,也就是请求的nbytes比到达文件末尾的字节数多

 

ssize_t write(int filedes, const void *buf, size_t nbytes);

write函数向打开的文件中写数据;如果成功则返回已写的字节数,如果出错则返回-1

对于普通的文件,函数的返回值应该和请求写的字节数nbytes一致

 

为了说明buf和缓冲区大小,下面是APUE上的一个例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFFSIZE 4096

int main(){
    int n;
    char buf[BUFFSIZE];
   
    while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n){
            printf(“write error\n”);
            exit(1);
        }
    if (n < 0){
        printf(“read error”);
        exit(1);
    }
    return 0;
}

为了通过不同的缓冲区长度来进行测试程序的运行结果,BUFFSIZE范围在1~524288,然后读取的字节数为103316352,在Linux ext2文件系统上,系统CPU时间最小值出现在BUFFSIZE为4096的时候,继续增加缓冲区性能没啥影响甚至略降

大多数文件系统为了提高性能都会采用预读(read ahead)技术;当检测到正进行顺序读取时,系统就试图读入比应用程序所要求更多的数据,并假象应用程序很快就会读这些数据;在ext2上,当BUFFSIZE为128KB的时候,预读取停止了,这就对读操作的性能产生了影响

操作系统通过缓存将相关程序文件放到主存里,如果后序还要运行该程序一般从系统缓存访问文件,性能都会比第一次好,而无需读写磁盘

发表回复