【发布时间】:2017-05-20 18:51:54
【问题描述】:
通常,列表要么实现为链表,遍历速度很慢,要么实现为数组列表,在插入元素时很慢。
我想知道是否可以通过重新映射而不是在插入或删除元素时复制内存来更有效地使用处理器的 MMU 来实现列表。这意味着数组中任何位置的索引和插入/删除都具有 O(1) 的速度,better than any other list implementation。
我的问题是:
- 程序是否真的能够控制自己的虚拟内存,或者是否需要对操作系统进行更改?
- 每个进程的页表条目数是否有限制?条目越多,内存访问是否越慢?
- 更改页表条目是否如此缓慢,以至于仅对非常大的列表才更有效?
- 是否有此类列表的任何现有实现?如果是,是什么阻止人们更多地使用它们?
【问题讨论】:
-
将此链接视为一个很好的入口点:msdn.microsoft.com/en-us/library/windows/desktop/… 底线是虚拟内存管理可以由应用程序控制。但是处理的页面不是任意大小的。因此,如果您想尝试一下自己的想法,请继续尝试。但是,如果您的列表项小于页面大小,您将浪费大量(虚拟)内存......无论如何,我怀疑您最终会得到一些有用/执行的东西。但值得称赞的是,具有创造性精神!
-
大多数现代 CPU 使用中等大小但相当大的页面大小。 4kb 和 8kb 是典型的。 MMU 只能用于映射页面大小的偶数倍的内存块。除非您的对象具有精确的对齐方式,并且它们的大小是页面大小的偶数倍,否则 MMU 是无用的。即使你把那只鸭子排成一排:祝你编写自己的操作系统好运!
-
如果您对最新和最先进的数据结构感兴趣:查找“持久数据结构”。想法来自函数式编程,但也可以在 C++/Rust 或其他系统代码中使用。
-
你不应该把 O() 表示法看得太认真。对于任何合理的 $n$,$O(1)$ 和 $O(\log n)$ 之间的差值可以小于乘法常数的差值。使用MMU意味着调用OS,成本很高。
标签: c++ list hardware-acceleration mmu