pread中偏移的时间复杂度?

问题描述 投票:-1回答:2

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

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

偏移的时间复杂度是多少?我们只是跳到偏移量?或者程序读取“偏移”字节数?到达偏移量是O(1)还是O(偏移量)?

c++ c file posix
2个回答
0
投票

没有一个简单的答案。

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

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

所以,如果你想要答案

偏移的时间复杂度是多少?我们只是跳到偏移量?或者程序读取“偏移”字节数?到达偏移量是O(1)还是O(偏移量)?

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

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


0
投票

渐近符号不能应用于有限设备,因为它描述了参数变为无穷大的趋势。抵消是有限的,因此你的问题是无关紧要的。


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

无论如何,无法获得精确的分析关系。


更一般地说,访问巨大的存储空间可能被认为在偏移量方面呈指数级,因为您遍历较慢和较慢的内存设备的层次结构(从超高速缓存到磁盘文件,然后到外部甚至离线/高延迟设备,如磁带自动点唱机,然后运营商呼叫物理安装磁带......)。但这使我们远离pread :-)

© www.soinside.com 2019 - 2024. All rights reserved.