- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
通常,列表要么被实现为链表,它的遍历速度很慢,要么是数组列表,它在插入元素时很慢。
我想知道是否可以通过在插入或删除元素时重新映射而不是复制内存来使用处理器的 MMU 更有效地实现列表。这意味着索引和插入/删除数组中任何地方的速度都是 O(1), better than any other list implementation .
我的问题是:
最佳答案
首先对您的问题进行一些具体的回答:
mmap
在类 UNIX 操作系统和 similar APIs 上在 Windows 上。特别是 Linux 最近添加了 several methods允许在不复制的情况下从内核对用户可见的缓冲区进行高级操作——但其中一个有趣的是 no longer for this world (至少在性能方面)。 mmap
-type 调用很快,高效的内存复制例程也很快!
std::vector
之类的东西中。通过使用 MMU 技巧来移动发生插入时需要移动的元素。问题是在典型系统上您只能移动 0、4096、8192 等字节!所以如果你插入一个 4 字节
int
成
vector<int>
这有什么帮助?您或许可以“破解”
vector
的底层存储。在插入点分成两部分并跟踪它,希望在某个点再次合并它们(例如,如果你插入了 4096 字节的东西) - 但你最终会得到不同的数据结构,具有不同的属性,以及 MMU 技巧无论如何,这里并不是真正的基础。
mmap
)。这看起来很快(当您考虑到它涉及获取各种内核锁、弄乱页表、添加 VMA 等时,这还不错)——但复制内存也非常快。在同一个机器上,我可以以大约 12 GB/s 的速度复制内存(即,到/从任何缓存级别的 RAM),而在 L1 或 L2 中的复制速度可能为 80-100 GB/s。因此,复制 4K 页面需要 41 ns(缓存)和 340 ns(未缓存,到 RAM)之间的某个时间。因此,即使有可能,弄乱页表也不是一个明显的胜利,尤其是在缓存的情况下(并且缓存的情况可能是主要的情况,对大多数工作负载进行平均)。
realloc
.在 Linux 和 Windows (
it seems ?) 上,
realloc
可以通过重新映射和扩展内存中的映射页面(又名 MMU 技巧)来实现,这既避免了物理拷贝,又避免了临时让旧分配区域和新区域同时“事件”的需要(如果它们的总和接近物理内存的大小)。
mremap
至
realloc
mmap
的堆区域首先是 ed(默认情况下,这发生在大于 128K 的分配请求,但也可能发生在
sbrk
可用空间耗尽时)。
关于c++ - 使用 MMU 实现可调整大小的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498413/
简短的问题:页表存放在哪里?它是在 MMU(完全硬件实现)还是在 RAM(涉及操作系统)中? 我试图弄清楚 RAM 访问是否涉及将线性地址映射到物理地址以防 TLB 未命中。我想答案是否定的,实现完全
内存管理单元(MMU)如何检测指针的双重释放? 我知道在释放指针后立即将指针设置为 NULL 是一个好习惯,但假设程序员不这样做。有没有什么MMU机制可以检测到? 最佳答案 MMU 与它无关。如果你两
我有一个关于 linux 内核和 MMU 之间关系的问题。我现在明白了 linux 内核管理虚拟内存地址和物理内存地址之间的页表。同时x86架构中有MMU管理虚拟内存地址和物理内存地址之间的页表。如果
我正在学习Windows下的X64汇编语言和MASM64,就是看最新版的《64位汇编语言的艺术》一书。 我有一个关于书中引用的问题: You do have to worry about MMU pa
我试图了解当我们想为特定的虚拟内存地址分配一些值时操作系统是如何工作的。 我的第一个问题涉及 MMU 是否处理 CPU 和 RAM 之间的所有内容。这是真的?从人们可以从维基百科中读到的内容,我会这样
我在我的 s3c2440 板上启用了 MMU(3G - 4G 内存::故障属性),当我没有读/写 3G - 4G 内存时一切都很好。所以为了测试页面错误向量,我写信给一个 0xFF 到 3G 地址,正
这个问题在这里已经有了答案: what is the right way to update MMU translation table (1 个回答) 关闭 6 年前。 更新翻译表中条目的步骤是什
我正在探索 Linux 操作系统中的内存管理。 据我所知,MMU是集成在现代CPU中处理地址转换的硬件。如果虚拟地址不在 TLB 中,则MMU会先通过页表基址寄存器(PTBR)获取进程的页表地址,然后
正在阅读Linux内核,对MMU相关的部分比较感兴趣。在ARM64 cpu中,有如下代码: __create_page_tables: pgtbl x25, x26, x28
我想知道在没有 MMU 支持的情况下如何保护内存。我试图用谷歌搜索它,但没有看到任何有值(value)的论文或研究。那些处理它的人只处理错误,例如未初始化的指针,而不是由于软错误导致的内存损坏,也就是
通常,列表要么被实现为链表,它的遍历速度很慢,要么是数组列表,它在插入元素时很慢。 我想知道是否可以通过在插入或删除元素时重新映射而不是复制内存来使用处理器的 MMU 更有效地实现列表。这意味着索引和
这是我系统讲座的 PowerPoint 中的一句话,但我不明白为什么上下文切换会使 MMU 失效。我知道它会使缓存无效,因为缓存包含另一个进程的信息。但是,对于 MMU,它只是将虚拟内存映射到物理内存
根据一些教程,我们会在 bootlaoder 开始时禁用 MMU 和 I/D-Caches。如果我理解正确,它的目的是在程序中直接使用物理地址,所以如果我错了,请纠正我。谢谢! 其次,我们这样做是为了
内存 Controller 的作用是什么?它们与处理器内的 MMU 有何不同? MMU 的工作是将虚拟地址转换为物理地址(除其他外)并将该物理地址发送到内存 Controller ,内存 Contro
如果我们可以在不使用 mmu 的情况下访问一些 block 内存,而使用 mmu 访问其他内存,则可以获得良好的性能提升。我已经阅读了 intelx86_64 手册,却发现这个任务似乎是不可能的...
所以,对于内核驱动程序,我是一个新手,并且对 ioremap 函数有疑问。 我正在编写一个驱动程序,用于访问在具有 ARM Cortex-M3 和 FPGA 结构的 SoC 上的自定义 VHDL 模块
在 ARM Linux 中,正是在哪个点启用了 mmu。即,在哪个文件中(汇编文件或arch/arm/kernel/setup.c中的paging_init()) ARM linux是否支持不分页运行
我发现 kvm 将 tdp_mmu 更改为默认启用 https://lore.kernel.org/lkml/20210726163106.1433600-1-pbonzini@redhat.com/
这是引用自 ARM ARM® Cortex™-A 系列,版本:4.0,程序员指南,第 9-1 页。 “MMU 使任务或应用程序能够以一种不需要知道系统的物理内存映射或可能同时运行的其他程序的方式编写。
简而言之,我想关闭 Linux 上下文(从内核内部)中的所有 MMU(和缓存)操作,用于调试目的,只是为了运行一些测试。明确地说,我不希望我的系统在那之后仍然可以正常工作。 关于我的设置:我目前正在摆
我是一名优秀的程序员,十分优秀!