用多进程读写文件的效率为什么会远远不如一个进程直接IO的效率

viki34 2012-10-06 09:00:20
请高手解答:上主要代码:
...全文
653 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-10-08
  • 打赏
  • 举报
回复
stdio是FILE结构体内带buffer而已,缓存是为了减少磁盘I/O,不代表就会加速I/O,另外多线程写慢是因为磁盘寻道太折腾了,顺序写最快。
jackyjkchen 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
追问:
我在测试IO效率的时候,比较无缓冲IO,和标准IO。
发现标准IO的效率只有在首次执行的时候比无缓冲IO慢,之后就差不多了。
在网上看的解释说,标准IO会调用操作系统的页缓冲区,pagecache。那么也就是说,APUE上所说标准IO的全缓冲,行缓冲都是对于这个PAGECACHE来说的吗?
[/Quote]

不是的吧,标准I/O的缓冲是库函数自己实现的,数据累积到一定大小之后才调用system call,并不依赖于操作系统机制,操作系统还有自己的缓冲,当然这是我的想法,不确定。

但我认为,真正调用system call之前不可能会涉及到页缓冲的,而且标准库可以自行调整缓冲区大小不是么
fdl19881 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

引用 6 楼 的回复:
追问:
我在测试IO效率的时候,比较无缓冲IO,和标准IO。
发现标准IO的效率只有在首次执行的时候比无缓冲IO慢,之后就差不多了。
在网上看的解释说,标准IO会调用操作系统的页缓冲区,pagecache。那么也就是说,APUE上所说标准IO的全缓冲,行缓冲都是对于这个PAGECACHE来说的吗?


不是的吧,标准I/O的……
[/Quote]

虽然我没看标准IO函数的源码,但是我猜测:
有缓冲的标准IO函数在第一次fwrite或者fprintf的时候会分配缓中内存,,所以第一次会慢,后面就差不多了。有缓冲和无缓冲的速度差不多是建立在他们每次写入或者读出的字节数比较大(如几KB以上)。。如果一次写几个字节,那肯定是有缓冲的标准IO快。
标准IO的缓冲确实是为库自己实现的。
viki34 2012-10-07
  • 打赏
  • 举报
回复
追问:
我在测试IO效率的时候,比较无缓冲IO,和标准IO。
发现标准IO的效率只有在首次执行的时候比无缓冲IO慢,之后就差不多了。
在网上看的解释说,标准IO会调用操作系统的页缓冲区,pagecache。那么也就是说,APUE上所说标准IO的全缓冲,行缓冲都是对于这个PAGECACHE来说的吗?
viki34 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

了解一下计算机各级器件的大概性能差距吧

CPU大概比二级缓存快1个数量级,二级缓存大概比内存快1-2个数量级,内存大概比硬盘(极限速度)快2个数量级,而机械硬盘的磁头寻址大概是ms级,磁头寻址一次,CPU能跑大约百万条指令

换句话说,胡乱并行机械硬盘的I/O,多一次磁头寻址,意味着浪费了百万条CPU指令时间
[/Quote]
惭愧啊
viki34 2012-10-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
追问:
我在测试IO效率的时候,比较无缓冲IO,和标准IO。
发现标准IO的效率只有在首次执行的时候比无缓冲IO慢,之后就差不多了。
在网上看的解释说,标准IO会调用操作系统的页缓冲区,pagecache。那么也就是说,APUE上所说标准IO的全缓冲,行缓冲都是对于这个PAGECACHE来说的吗?


不是的吧,标准I/O的缓冲是库函数自己实现的,数据累积……
[/Quote]
那么为什么,在第二次执行标准IO的时候效率会大幅度提升。
jackyjkchen 2012-10-06
  • 打赏
  • 举报
回复
了解一下计算机各级器件的大概性能差距吧

CPU大概比二级缓存快1个数量级,二级缓存大概比内存快1-2个数量级,内存大概比硬盘(极限速度)快2个数量级,而机械硬盘的磁头寻址大概是ms级,磁头寻址一次,CPU能跑大约百万条指令

换句话说,胡乱并行机械硬盘的I/O,多一次磁头寻址,意味着浪费了百万条CPU指令时间
jackyjkchen 2012-10-06
  • 打赏
  • 举报
回复
因为写文件的瓶颈在磁盘IO,不在CPU,你并行了有毛用……

机械硬盘的悬臂寻址,你并行越多寻址次数越多,性能反而成指数级下降
viki34 2012-10-06
  • 打赏
  • 举报
回复
程序的主要功能是复制一个960M的文件。。利用多进程,同时读写一个文件,用pread和pwrite分段读写。
max是次数,23次,每次也就是每个进程复制40m的文件到指定位置。
但是经过测试:复制同一个文件,使用cp命令需要1min10sec多一点,只是用一个进程,缓冲设置为4096也就只比cp慢30sec左右。
用上面这个程序10min之后都没有执行完成。
我崩溃了。
请解释。。。
viki34 2012-10-06
  • 打赏
  • 举报
回复

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧