当前位置: 技术问答>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), 比在内核空间与内核空间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频繁失效,从而大大节约时间
copy_to_user在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低
mmap仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做),另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来,mmap一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址,无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间
|
是个好问题
想一下
关注
想一下
关注
|
你是怎么测试CPU占用时间的?有没有准确的论证?
没有MMU,那你的意思不就是全是系统调用占用的时间了?
没有MMU,那你的意思不就是全是系统调用占用的时间了?
|
请说明一下你测试CPU的方法
|
mark一下。
继续讨论啊。
继续讨论啊。