• 文件I/O(不带缓冲)之I/O的效率


    程序清单3-3中的程序使用read和write函数复制文件。关于该程序应注意下列各点:

    它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入、输出已由shell安排好。确实,所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必自行打开输入和输出文件。

    很多应用程序假定标准输入是文件描述符0,标准输出是文件描述符1。本示例中则使用在<unistd.h>中定义的两个名字:STDIN_FILENO和STDOUT_FILENO。

    考虑到进程终止时,UNIX系统内核会关闭该进程的所有打开的文件描述符,所以此示例并不会关闭输入和输出文件。

    对UNIX系统内核而言,文本文件和二进制代码文件并无区别,所以本示例对这两种文件都能工作。

    程序清单3-3 将标准输入复制到标志输出

    [root@localhost apue]# cat prog3-3.c
    #include "apue.h"
    
    #define BUFFSIZE 4096
    
    int
    main(void)
    {
            int n;
            char buf[BUFFSIZE];
    
            while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
            {
                    if(write(STDOUT_FILENO, buf, n) != n)
                            err_sys("write error");
            }
            if(n < 0)
                    err_sys("read error");
            exit(0);
    }

    这里有一个问题是,如何选取BUFFSIZE值?

    用程序清单3-3中的程序读文件,其标准输出被重定向到/dev/null上。此测试所用的文件系统是Linux ext2文件系统,其块长是4096字节(块长由st_blksize表示)。发现,系统CPU时间的最小值出现在BUFFSIZE为4096处,继续增加缓冲区长度对此时间几乎没有影响。

    大多数文件系统为改善其性能都采用某种预读(read ahead)技术。当检测到正进行顺序读取时,系统就试图读入比应用程序所要求的更多的数据,并假想应用程序很快就会读这些数据。

    本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

  • 相关阅读:
    spring mvc常用配置
    spring data redis使用1——连接的创建
    spring session使用小记
    log4j2使用入门(一)
    com.google.common.eventbus.EventBus介绍
    使用java远程调试技术监控代码运行
    阿里云数加平台——数据同步任务调度及管理
    阿里云数加平台——BI报表使用概述和总结
    解决因block的损坏而导致hdfs启动后进入安全模式
    iOS 6 自动布局入门
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3498248.html
Copyright © 2020-2023  润新知