当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2015-11-25

    本文导语:  为什么内核空间与用户空间的数据交换消耗如此巨大的系统资源???      我发现在内核空间与用户空间交换数据(copy_to_user), 比在内核空间与内核空间memcpy相同量的数据远远耗费系统资源(主要是处理器时间)? 甚至,...

为什么内核空间与用户空间的数据交换消耗如此巨大的系统资源???

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

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

     由此,我们来探讨怎样提高内核空间与用户空间得数据交换的性能?
     最容易想到的是mmap
     这里有一个疑问就是使用mmap后,用户空间进程从映射的内核空间内存中拷贝数据所消耗的资源为什么就比直接copy_to_user的少呢(未进行实验证明)???

|
你要是明白copy_to_user与mmap的工作原理就知道区别了
copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低
mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做),另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间

|
是个好问题
想一下
关注

|
你是怎么测试CPU占用时间的?有没有准确的论证?
没有MMU,那你的意思不就是全是系统调用占用的时间了?

|
请说明一下你测试CPU的方法

|
mark一下。
继续讨论啊。

    
 
 

您可能感兴趣的文章:

  • 内核空间能否调用用户空间程序?
  • 请问内核空间和用户空间有什么区别,是怎么划分的.谢谢
  • 用户进程有自己独立的地址空间,内核线程没有自己的地址空间 该怎样理解: ?
  • linux用户空间到内核空间数据传递
  • 关于在内核空间和用户空间引用一个空指针的后果很原因
  • Linux中内核线程不访问内核态地址空间?
  • 关于内核空间和用户空间之间的实时通信?
  • 内核空间和用户空间怎么通信?
  • 如何将数据包sk_buff从内核空间提交给用户空间呢?
  • 内核空间与用户空间通讯
  • 驱动中如何将用户空间内存映射到内核空间使用?
  • (来拿分了)谁提供一个简单的netlink的程序? 要求是内核空间发往用户空间的。
  • 有人做过内核空间和用户空间的内存映射吗 内核空间和用户空间交换数据用内存映射的方法,结果做的驱动可以工作,但经常会引起死机
  • 求助关于内核空间和用户空间通信的问题
  • 划分内核空间大小?
  • Linux 内核空间与用户空间批量数据传输问题!
  • 在内核的某个函数中,如何能知道是哪个用户空间的函数调用了它,以及这个用户空间函数所在的文件?
  • 用户空间/内核空间
  • 用netlink从内核空间向用户空间传送数据为何失败!
  • 内核访问用户空间
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • 2.6内核下编译2.4内核
  • 操作系统 iis7站长之家
  • 谁能提供kgdb内核补丁内核模块的下载
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 编译新内核后怎么进入原来内核
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 内核模块跟内核版本不匹配????????
  • docker使用的技术之Container内核原理介绍
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 不重新编译内核能修改内核函数吗?
  • 如何学好内核?学了内核能应用于哪方面?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3