当前位置:首页 > CN2资讯 > 正文内容

【Linux】Linux文件I/O

7小时前CN2资讯


文件I/O

直接使用系统调用的缺点:

  • 影响系统性能
  • 系统调用比普通函数调用开销大,因为系统调用要进行用户空间和内核空间的切换。

  • 系统调用一次所能读写的数据量大小,受硬件的限制。
  • 解决方案:使用带缓冲功能的标准I/O库,以减少系统调用的次数。

    例如: fwrite、fread、fopen、fclose、fseek、fflush


    文件系统接口

    文件系统——一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。

    (一系列的接口。)

    文件系统缓存

    主存(通常是DRAM)的一块区域用来缓存文件系统的内容,包含各种数据和元数据。

    标准文件访问方式


    直接IO方式

    OPEN +O_DIRECT = 绕过内核缓冲区的直接访问,有效避免了CPU和内存的多余时间开销。要求内存边界对齐。

    直接IO,绕过缓存,不会出现write成功数据丢失情况。

    注意:直接IO的缺点就是如果访问的数据不在应用程序缓存中,那么每次数据都会直接从磁盘进行加载,这种直接加载会非常慢,通常直接IO跟异步IO结合使用会得到较好的性能。

    示例:

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>

    #define TOTAL 10

    //直接IO要考虑到硬件特性
    //磁盘最基本的单位是扇区,一个扇区512字节
    #define BUF_LEN 512


    int writeToFile(int fd,const char* buf,int len) {
    int wlen = 0;
    if ((wlen = write(fd, buf, len)) < 0) {
    fprintf(stderr,"write to %d failed,reason:%s.\n",fd,strerror(errno));
    return -3;
    }

    return wlen;
    }

    int main(int argc, char** argv) {

    //const char* TEXT = "This is a test.\n";

    char* buf = NULL;

    //buf = (char*)malloc(BUF_LEN);
    //地址要是512的倍数——内存边界对齐

    posix_memalign((void**)&buf,512,BUF_LEN);
    strcpy(buf,"This is test.\n");

    const char* filename = "./io_test.txt";
    int fd = 0;
    int i = 0;

    fd = open(filename,O_RDWR | O_TRUNC | O_CREAT | O_DIRECT);
    if (fd < 0) {
    fprintf(stderr, "fopen %s failed,reason:%s.\n exit\n",filename,strerror(errno));
    return -1;
    }

    for (i = 0; i < TOTAL; i++) {
    if (writeToFile(fd, buf, BUF_LEN) < 0) {
    fprintf(stderr,"write to %s failed,reason: %s.\n exit\n",filename,strerror(errno));
    //return -2;
    }
    printf("%d\n",i+1);
    }

    printf("finished.\n");

    //printf("Start to sleep 30 second....\n");

    if (buf)free(buf);
    close(fd);
    return 0;

    }

    直接IO和标准方式进行对比

    **示例:**测试20s内对同一文件的读取次数0

    #define _GNU_SOURCE
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>


    #define BUF_SIZE 512


    int main(int argc, char** argv) {

    char* buf = NULL;
    const char* filename = "./open_compare.txt";
    int fd = -1;
    time_t start;
    time_t cur;
    int rlen = 0;
    int ret = 0;
    static int read_total = 0;


    ret = posix_memalign((void**)&buf,512,BUF_SIZE);
    if (ret)fprintf(stderr,"posix_memalign failed.reason:%s\n",strerror(errno));

    start = time(NULL);

    do
    {
    read_total++;
    //fd = open(filename, O_RDWR | O_DIRECT);
    fd = open(filename,O_RDWR);

    if (fd < 0) {
    fprintf(stderr, "fopen %s failed,reason:%s.\n exit\n", filename, strerror(errno));
    return -1;
    }


    do
    {
    if ((rlen = read(fd, buf, BUF_SIZE)) < 0) {
    fprintf(stderr, "read to %s failed,reason: %s.\n exit\n", filename, strerror(errno));
    }

    } while (rlen>0);
    close(fd);

    cur = time(NULL);
    } while ((cur-start) < 20);

    printf("total time:%d\n",read_total);

    return 0;

    }

    直接IO

    标准方式

    (高速页缓存,多次读取速度快。)


    O_SYNC

    缓存同步

    为了保证磁盘系统与缓冲区内容一致,Linux系统提供了sync,fsync,fdatasync三个函数。

    函数描述:向打开的文件写数据,成功返回写入的字节数,出错则返回-1。

    #include<unistd.h> int fsync(int fd); int fdatasync(int fd); void sync(void);

    说明:

    • sync——将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。
    • fsync——将fd对应文件的块缓冲区立即写入磁盘,并等待实际写磁盘操作结束返回。
    • fdatasync——类似fsync,但只影响文件的数据部分。而除数据外,fsync还会同步更新文件属性。

    Linux文件IO流程图

    内核中会有一个线程,不断地将高速页缓冲区中的数据写入到物理磁盘中。



      你可能想看:

      扫描二维码推送至手机访问。

      版权声明:本文由皇冠云发布,如需转载请注明出处。

      本文链接:https://www.idchg.com/info/32258.html

      分享给朋友:

      “【Linux】Linux文件I/O” 的相关文章

      DMIT VPS评测:高性能与稳定性的完美结合

      在了解DMIT VPS之前,我想先分享一下我对这家公司的最初印象。记得第一次听到DMIT时,它的名字总是在VPS领域中流传。人们提到它时,无一不带着敬仰,增加了我对它的好奇心。自从它在2017年成立以来,DMIT便以其优秀的服务和产品迅速吸引了不少用户。我也开始关注起它背后的故事。 DMIT的崛起显...

      如何优化网络体验:VPS中转全面指南

      我一直对如何使用技术来优化我的网络体验感到好奇。最近,我发现了VPS中转这种神奇的方法。简单来说,VPS中转就是利用一台虚拟私人服务器(VPS),将我的网络流量转发到另一个指定的网络地址。这种功能主要用于加速访问某些海外网站,帮助我突破网络限制以及保护我的上网隐私等。 在日常使用中,我会遇到一些网站...

      VPS是什么?全面解析虚拟专用服务器的优势与选择

      VPS 是 什么 VPS,全称虚拟专用服务器,是一种通过虚拟化技术在物理服务器上创建多个独立环境的方案。具体来说,每个VPS都能运行自己的操作系统,并拥有独立的CPU、内存和存储资源。这就意味着,用户可以像在独立服务器上那样自由管理自己的VPS,进行各种应用和服务的部署。 最初,当我接触到VPS时,...

      Vultr注册送50美元优惠活动详细指南

      Vultr新用户注册活动概述 在寻找合适的云服务提供商时,我总是觉得选对平台会显得尤为重要。Vultr做为一个非常受欢迎的云服务提供商,给新用户带来了一项非常吸引人的优惠活动——注册即送50美元。这个活动让我感到非常兴奋,也让更多人有机会体验到高性价比的VPS服务。 这项活动非常简单易行。新用户只需...

      如何在PVE中使用OVA文件进行高效虚拟机管理

      在探讨PVE和OVA之前,我想分享一下我的个人体验。近年来,随着云计算和虚拟化技术的飞速发展,我们越来越频繁地接触到这些概念。PVE,即Proxmox Virtual Environment,成为了许多企业青睐的虚拟化解决方案。而OVA,则丰富了我们对动画内容的理解。接下来,我将分别介绍这两个重要的...

      apernet评测:提升用户网络体验的利器

      在这一部分,我想给大家介绍一下apernet,这是一款非常有前景的网络工具。首先,apernet不仅仅是一个普通的网络应用,它的意图是通过提供稳定可靠的连接,帮助用户更好地利用网络资源。无论你是普通用户还是专业人士,apernet都致力于通过其独特的功能和服务来改善你的网络体验。 接下来的重点在于评...