c - 如何选择缓冲区大小?

标签 c linux

我正在阅读 TLPI(Linux 编程接口(interface)),他们似乎使用 1024 作为文件 io 操作的标准缓冲区大小。我想知道为什么选择这个尺寸。是否存在“最佳”文件大小?

详细说明并希望获得一些进一步的见解:在哪些情况下使用 512 或 2048 字节会破坏某些东西?我假设如果 1024 是安全的,那么 512 也是安全的,但速度较慢,因为您必须以两倍的步数移动数据。那么,如果我的想法是正确的,缓冲区大小越大,操作越快,但这也增加了失败的可能性?

最佳答案

虽然我经常看到像您这样的哲学问题被否决和关闭,但我仍然喜欢它们以及它们所鼓励的讨论。 (我试图将评论中的所有内容都包含在内,但它不太奏效。)

简短的回答是相当小的缓冲区是安全的,通常选择它们作为正在操作的结构的最小公分母(例如您的示例 1,024,因为大多数文件系统分配以 1 KB 的倍数为单位的 block ,即 1,024 字节)。

更长的答案是可变缓冲区大小(通常大于安全默认值)在软件与硬件甚至工作负载类型交互时对软件的最佳性能起着非常重要的作用。没有适用于所有硬件和操作系统环境的最佳大小。调整缓冲区大小是使程序在您的系统上更好地运行的一种廉价方法。因此,一些不诚实的软件开发人员也使用它来假装他们的软件更好。例如,考虑网络服务器软件。您可以通过调整所有缓冲区大小,然后将其与具有默认配置的 Apache 安装进行比较,来声称您的 Web 服务器软件具有更好的性能。例如,您还可以通过使用与一个软件的设置匹配但导致另一个软件为每个请求使用额外帧的内核调整来在外部对软件进行瓶颈。

以这种方式进行调整也很危险,因为它可能更容易执行“懒猴”/资源耗尽等拒绝服务攻击。因此,再次重申,越小越安全,尽管不一定“更好”,具体取决于您对安全与性能的优先排序。

关于c - 如何选择缓冲区大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24463601/

相关文章:

c - 我必须使用 getchar();两次结束程序

c - 尝试从文件中读取下一行/字符时出现段错误

linux - bash:什么是工作规范

c - C 语言编程 - 函数问题

c - 如何打开用户指定的COM端口?

c - 这个shellcode又让人头疼

linux ps命令——获取进程运行时间——etime和时间参数的区别

android - 如何从另一个 shell 脚本将一个 shell 脚本作为进程启动

c - 语法错误: missing ')' before 'constant'

linux - 使用一个脚本在具有多个命名选项卡的命名 screen session 中启动多个脚本? [ Derby 安]