为什么内核空间与用户空间得数据交换消耗如此巨大?

月吻长河 2006-05-09 08:56:25
为什么内核空间与用户空间的数据交换消耗如此巨大的系统资源???

我发现在内核空间与用户空间交换数据(copy_to_user), 比在内核空间与内核空间memcpy相同量的数据远远耗费系统资源(主要是处理器时间)? 甚至,我怀疑,比在用户空间与用户空间memcpy相同量的数据都远耗费更多系统资源!

我在调试中发现, 内核空间内的memcpy(240字节)优化了很多个为0 拷贝,结果对系统性能似乎毫无影响. 但是我把内核空间与用户空间的数据交换量减少一点(16字节), 发现系统性能明显提高!!

由此,我们来探讨怎样提高内核空间与用户空间得数据交换的性能?
最容易想到的是mmap
这里有一个疑问就是使用mmap后,用户空间进程从映射的内核空间内存中拷贝数据所消耗的资源为什么就比直接copy_to_user的少呢(未进行实验证明)???
...全文
643 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lirun 2006-05-18
  • 打赏
  • 举报
回复
请说明一下你测试CPU的方法
lirun 2006-05-18
  • 打赏
  • 举报
回复
你是怎么测试CPU占用时间的?有没有准确的论证?
没有MMU,那你的意思不就是全是系统调用占用的时间了?
hbu_dongjt 2006-05-16
  • 打赏
  • 举报
回复
mark一下。
继续讨论啊。
月吻长河 2006-05-14
  • 打赏
  • 举报
回复
copy_to_user是要检查地址合法性
但是,使用不检查地址合法性得__copy_to_user后也没见改善。
此外,我使用的是no mmu的芯片和uClinux系统,没有虚拟内存,完全是线性地址空间,物理地址连续。
所以,
造成copy_to_user性能差应该是其他原因。
看来还是要看看源代码了
tb01412 2006-05-10
  • 打赏
  • 举报
回复
你要是明白copy_to_user与mmap的工作原理就知道区别了
copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低
mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做),另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间
alaiyeshi 2006-05-10
  • 打赏
  • 举报
回复
是个好问题
想一下
关注

4,438

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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