免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: eye_onme
打印 上一主题 下一主题

读写文件不是效率很低的嘛,那么数据库为何效率高呢 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2005-04-12 11:21 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

DIRECT-IO如果自己不buffer一定比普通IO慢。
数据库自己要BUFFER。

它也用系统调用read, write, open, close等,只是不用OS的buffer.




  1. //一个简单DIRECT-IO例子 (linux i386)。 JOHN SEEKER

  2. #include <stdio.h>;
  3. #include <sys/types.h>;
  4. #include <sys/stat.h>;
  5. #include <asm/fcntl.h>;
  6. #include <unistd.h>;
  7. #define _XOPEN_SOURCE 600
  8. #include <stdlib.h>;

  9. //int posix_memalign(void **memptr, size_t alignment, size_t size);
  10.       
  11. //#include <fcntl.h>;

  12. char buf[4096] = "123456kasf dklasfkasfkldkladsfklafskldsfkl";
  13. char buf1[256];
  14. main()
  15. {
  16. int fd;
  17. int i, r;
  18. char *bp;

  19.     r = posix_memalign(&bp, 512, 4096*8);
  20.     printf("r = %d\n", r);
  21.     memcpy(bp, buf, 4096);
  22.    
  23.     fd = open("data", O_CREAT | O_RDWR | O_TRUNC | O_DIRECT, 0644);
  24.    
  25.     printf("fd = %d\n", fd);
  26.    
  27.     r = write(fd, bp, 4096);
  28.     printf("%d bytes written.\n", r);

  29.     close(fd);
  30. }
复制代码

论坛徽章:
0
22 [报告]
发表于 2005-04-12 11:50 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

长见识!!呵呵

请教几个问题,再劳烦思兄一下:

1, 象传统的write系统调用,通过文件系统象磁盘文件写数据,写入的过程是在内核态中完成的;上面的这个程序是不是?
2, 你说的“不用OS的buffer”,是什么意思呢?APUE把write/open这些系统调用称为“unbuffered IO”(与标准C库相比),跟你的意思有何区别呢?


Sorry,这个问题一直没弄明白

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2005-04-12 11:55 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

[quote]原帖由 "思一克"][/quote 发表:


你有这个经历,干嘛不试试读写一个文件,和读写数据库
到底速度差别多少

论坛徽章:
0
24 [报告]
发表于 2005-04-12 11:56 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

数据库的特性决定了它在进行写操作的时候必须确实写物理磁盘,而不能使用延时写的方式。当然写入的内容可以放在cache中方便下次读取。

否则使用write等api,实际上os内部还是有buffer的,如果这个时候crash了,事务又已经提交了,但是具体的log没有更新到磁盘上,数据就corrupt了,recover都没有机会。

论坛徽章:
0
25 [报告]
发表于 2005-04-12 11:59 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

To albcamus,

2). 之所以read write 叫UNBUFFER/IO是和fread, fwrite比,因为后者有自己在函数库中的BUFFER。前者直接交给OS,无库BUFFER。但OS中有PAGE BUFFER(linux的buffer_head等结构)。比如write写文件,不是一定写到盘上(比如你写了,然后硬关电,数据可能丢失)。     

1). direct/io饶过了OS page buffer,调用驱动将数据直接写盘。所以应该不怕关电。

DIRECT/IO和普通IO写盘调用的驱动完全相同,调用的系统调用相同(除了O_DIRECT项目外)。对用户几乎是透明的。

论坛徽章:
0
26 [报告]
发表于 2005-04-12 11:59 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

原帖由 "linux_newbie" 发表:

否则使用write等api,实际上os内部还是有buffer的,如果这个时候crash了,事务又已经提交了,但是具体的log没有更新到磁盘上,数据就corrupt了,recover都没有机会。


你的意思是不是说,文件系统的日志功能是不可靠的? 因为日志未必总是与磁盘上的保持同步。
有点理解了。。

论坛徽章:
0
27 [报告]
发表于 2005-04-12 12:03 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

谁知道怎样mount一个direct I/O的文件系统
solaris就可以
linux可以咩

论坛徽章:
0
28 [报告]
发表于 2005-04-12 12:04 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

还有两者读写文件都是在KENREL中执行的,但DIRECT/IO DIO是直接将数据搞到用户的BUFFER,而普通IO先搞到page buffer, 再COPY到用户buffer.

所以如果仅仅写一次一个文件DIO应该快,但对于一般的文件操作(读写,SEEK,再读写),因为无PAGE BUFFER,DIO应该慢许多。

论坛徽章:
62
2016科比退役纪念章
日期:2016-06-28 17:45:06奥兰多魔术
日期:2015-05-04 22:47:40菠菜神灯
日期:2015-05-04 22:35:07菠菜神灯
日期:2015-05-04 22:35:02NBA季后赛大富翁
日期:2015-05-04 22:33:34NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯纪念徽章
日期:2015-04-14 16:54:452015年亚洲杯之朝鲜
日期:2015-03-19 23:03:16明尼苏达森林狼
日期:2015-03-16 21:51:152015小元宵徽章
日期:2015-03-06 15:57:202015年迎新春徽章
日期:2015-03-04 09:55:282015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2005-04-12 12:07 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

原帖由 "思一克" 发表:
还有两者读写文件都是在KENREL中执行的,但DIRECT/IO DIO是直接将数据搞到用户的BUFFER,而普通IO先搞到page buffer, 再COPY到用户buffer.

所以如果仅仅写一次一个文件DIO应该快,但对于一般的文件操作(读写,SE..........


一般的文件,读写,SEEK,再读写,仍然比数据库快的多。

论坛徽章:
0
30 [报告]
发表于 2005-04-12 12:21 |只看该作者

读写文件不是效率很低的嘛,那么数据库为何效率高呢

谁知道怎样mount一个direct I/O的文件系统
是不是用raw命令?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP