linux文件系统系统调用实测的一个方法

简介:


通过几个C代码来检测一下文件系统相关系统调用时间,以及和标准I/O库函数的性能差异。主要以read和fread函数为例。

1.1.1 read系统调用开销

我们来模拟一下read系统调用的开销情况,

代码如下:

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

 

int main()

{

      char c;

      int in,out;

      in = open("file.in",O_RDONLY);

      out=open("file.out",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);

      while(read(in,&c,1)==1)

           write(out,&c,1);

      exit(0);

}

创建输入文件file.in如下:

dd if=/dev/zero of=file.in bs=1 count=1024000

执行测试如下:

# time ./a.out

real    0m1.080s

user    0m0.064s

sys   0m1.012s

发现主要时间是花在了sys上的,即内核态,当然我们知道是系统调用了,因为就是我们写的嘛。

       可以使用strace来跟踪程序,就会不断显示系统调用write和read了。

       通过测试时间,其实我们计算得到一次write+read的时间的。就是1.012s/1024000=0.98us。

       修改程序如下:

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

 

int main()

{

      char c;

      int in,out;

      in = open("file.in",O_RDONLY);

      while(read(in,&c,1)==1)

           ;

      exit(0);

}

       程序中,去掉了write只留下了read系统调用,运行后时间如下:

# time ./a.out

real    0m0.222s

user    0m0.012s

sys   0m0.208s

可以计算得到每次read的大概时间为0.208/1024000=0.2us.在不同的机器上运行会有不同的结果,大家可以自行测试,祝玩的愉快。

后续会将该程序进行优化。

1.1.2 read系统调用开销二

将代码进行优化如下:

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

 

int

main ()

{

  char block[1024];

  char c;

  int in, out;

  in = open ("file.in", O_RDONLY);

  out = open ("file.out", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

  while (read (in, block, sizeof(block)) >0 )

    write (out, &c, 1);

  exit (0);

}

       一次read的字节数量修改为1024个字节。

执行后如下,

# time ./a.out

real    0m0.002s

user    0m0.000s

sys 0m0.000s

发现执行时间大幅降低了,性能得到了优化,理论上应该快了千倍被,毕竟系统调用次数减少了千次。

1.1.3 标准I/O库

标准I/O库是由stdio及头文件stdio.h为底层i/o系统调用提供的一个通用接口,例如fopen,fread,fclose等。现在是ANSI标准C的一部分。

1.1.4 性能差异

使用标准I/O库的函数来进行测试,代码如下,

#include <stdio.h>

#include <stdlib.h>

int

main ()

{

      int c;

      FILE  *in,*out;

 

     

  in = fopen ("file.in", "r");

  out = fopen ("file.out", "w");

  while((c=fgetc(in))!=EOF)

        fputc(c,out);

  exit (0);

}

编译执行,

# time ./a.out

real    0m0.036s

user    0m0.032s

sys   0m0.000s

       发现sys时间几乎为0,说明主要是在用户态的操作,相比read系统调用所化时间(如下)快了很多。

real    0m1.080s

user    0m0.064s

sys   0m1.012s

       这个主要是因为在 stdio 库在 FILE 结构里使用了一个内部缓冲区。只有在缓冲区满时候才进行底层系统调用再刷数据,当然比直接系统调用快很多了。
目录
相关文章
|
5天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
53 34
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
99 15
|
2月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
243 7
|
2月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
58 7
|
2月前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
3月前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
109 8
|
3月前
|
存储 Linux 文件存储
Linux文件系统
Linux文件系统 一切皆文件 在Linux中,“一切皆文件”的概念意味着系统中的所有资源,包括硬件设备、目录及进程等,均被视为文件。这种设计简化了操作和管理,具体包括: 普通文件:存储数据的常规文件。 目录文件:包含其他文件和子目录的文件。 进程文件:在/proc目录下代表系统中运行的进程。 设备文件:位于/dev目录,代表硬件设备。 网络字节流套接字文件:用于网络通信的数据流。 链接文件:指向另一个文件的符号链接或硬链接。 管道文件:用于进程间通信的文件。
75 7
|
3月前
|
Linux Shell 数据库
文件查找是Linux用户日常工作的重要技能介绍了几种不常见的文件查找方法
文件查找是Linux用户日常工作的重要技能。本文介绍了几种不常见的文件查找方法,包括使用`find`和`column`组合、`locate`和`mlocate`快速查找、编写Shell脚本、使用现代工具`fd`、结合`grep`搜索文件内容,以及图形界面工具如`Gnome Search Tool`和`Albert`。这些方法能显著提升文件查找的效率和准确性。
92 2
|
4月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
168 1
|
4月前
|
运维 安全 Linux
Linux文件清空的五种方法总结分享
每种方法各有优势,选择最合适的一种或几种,可以极大提高您的工作效率。更多有关Linux系统管理的技巧与资源,欢迎访问,持续提升您的运维技能。
128 1