免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8521 | 回复: 12
打印 上一主题 下一主题

直接读写磁盘 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-01 18:36 |只看该作者 |倒序浏览
我要做一个类似字典的程序,通过一个id(无规律、随机出现)检索出数据块,数据量比较大4G左右,而且系统对性能要求比较苛刻。
我打算把数据存储在磁盘上,直接使用了read/write/lseek64读写/dev/sdb,
我试了一下速度奇慢无比,一秒钟30条左右的样子

有没有可以直接读写磁盘扇区的办法?或者其他可以提高效率方法也可以?
使用的sata接口硬盘

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2012-04-01 19:10 来自手机 |只看该作者
弄块祼盘, 然后mmap sda*?  

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2012-04-01 19:24 |只看该作者
先试试mmap。想直接通过磁盘控制器读应该也是可以的,我记得Linux下有库函数可以in,out的,不过小心别把文件系统搞坏了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2012-04-01 19:26 来自手机 |只看该作者
in out 是特权指令吧, 啥库能做到?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
5 [报告]
发表于 2012-04-01 19:28 来自手机 |只看该作者
还有万一dma, 咋搞物理地址9。。。。。。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
6 [报告]
发表于 2012-04-01 19:42 |只看该作者
eflags 
还 是 哪 里有个 
io perm 
位图,
那个库函数
应该是
向OS申请
i n, o ut 权
限。我也没用过这个,但确实见过类似用户程序,包含个什么头文件后就开始i n,o ut了。

DM A,中断什么的,用户态估计没辙了,除非 OS特 意设计机制配合。不过见过读i de磁盘的例子,只是向某个端口o ut一大堆参数,然后i n标志位,轮询,最后再i n数据。只是这个过程的话,估计用户态也可以做。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2012-04-01 19:43 |只看该作者
尼玛,一直提示非法内容,老子一点一点地试,终于找出什么是非法的东西了~~

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
8 [报告]
发表于 2012-04-01 19:58 来自手机 |只看该作者
很显然是tss内的io perm, 但我不知道那玩意有啥效果

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
9 [报告]
发表于 2012-04-01 20:23 |只看该作者
记混了,EFLAGS里是I/O privilege level,TSS是io perm位图。

也找到了相关的man。

http://manpages.ubuntu.com/manpages/hardy/en/man2/ioperm.2.html
http://manpages.ubuntu.com/manpages/hardy/en/man2/iopl.2.html

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
10 [报告]
发表于 2012-04-01 23:11 |只看该作者
zylthinking 发表于 2012-04-01 19:28
还有万一dma, 咋搞物理地址9。。。。。。


1, in/out指令 ──敲成志玲了,唉──

的确是ring 0指令,不过请man iopl, man ioperm。  一个iopl(3),直接搞定65535个port的用户层访问;

2, DMA

需要DMA意味着你有PCI BAR,BAR寄存器存的是物理地址──which你可以访问/dev/mem,搜索到。 然后, 你把这个物理地址,mmap到用户空间的一段内存上, 读些内存虚地址,即是读写寄存器。 同样的,你可以把 被你mmap到用户空间的一段物理地址的首地址,告诉设备的DMA控制器。


可以了解下xorg-vesa的工作方式。  我只是说,这些从技术上来说完全不是问题,并不觉得绕开fs和page cache去读写磁盘,是一个脑子清醒的程序员会经常想到的事情。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP