胎面偏移量的时间复杂度?

Time complexity of offset in pread?

本文关键字:时间复杂度 偏移量      更新时间:2023-10-16

如果我在 c 或 c++ 中调用 pread

ssize_t pread(int fd, void *buf, size_t count, off_t offset);

偏移的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读取"偏移"字节数?是 O(1( 还是 O(偏移(来获得偏移量?

没有单一的、简单的答案。

首先,I/O系统可能过于复杂,而且肯定有太多的变化,任何一般陈述都无法通用。 文件系统很重要,磁盘驱动器很重要,RAID 配置(如果适用(很重要。 这仅适用于简单的文件系统,如 XFS 或 ext4。 对于组合文件系统/卷管理器(如 ZFS(或复杂的多设备高性能文件系统(如 GPFS 或 QFS/SAMFS(,事情变得非常复杂。 磁带系统和分层存储管理器使事情变得更加复杂。

其次,I/O 操作的实际模式非常重要。 从 SSD 读取随机偏移不会对性能产生太大影响,而从旋转磁盘或磁带读取随机偏移量会极大地影响性能。 任何缓存将如何影响性能? 预读等优化策略怎么样?

所以,如果你想要答案

偏移的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读取"偏移"字节数?是 O(1( 还是 O(偏移(来获得偏移量?

您需要在预期的系统上运行 I/O 操作,对它们进行彻底的基准测试,并查看其实际特征。

或者,您可以彻底描述您的系统和预期的 I/O 模式,这里的某个人可能会为您提供一些关于系统在该负载下可能行为的估计。 然后,如果您在该系统上对 I/O 模式进行基准测试,这些估计甚至可能在某种程度上是正确的。

渐近符号不能应用于有限设备,因为它描述了参数走向无穷大的趋势。偏移量是有界的,因此您的问题无关紧要。


如果您的问题更实用,那么直接访问介质(磁盘,闪存盘,光盘(可以具有恒定时间访问或访问时间,该访问时间是(复杂但缓慢增长(到先前访问的距离的函数。顺序访问介质(磁带、穿孔磁带等(的时间可能与到上一次访问的距离大致成正比,除非需要倒带。

在任何情况下,精确的分析关系都不可用。


更一般地说,访问巨大的存储空间可能被认为是偏移量呈指数级增长,因为您遍历了越来越慢的存储设备层次结构(从超快缓存到磁盘文件,然后到外部甚至离线/高延迟设备,如磁带自动存储塔,然后操作员被要求物理安装磁带......但这让我们远离pread:-(