&'a ::rynco::UntitledChannel
4.4K subscribers
17.3K photos
281 videos
123 files
14.7K links
西郊林密无处去,北城雾沉晚风凉。

本频道是:
- 推送任何有趣的东西的地方
- 偶尔可以看纸片小姐姐的地方
- 管理员随性吐槽的地方

本频道不是:
- 客观的科技新闻频道
- 键政频道

转载不代表立场。
消息仅代表发布者个人观点,不代表其他管理员的观点或立场。
本频道不接收任何广告。

所有原创内容以 CC BY-NC 4.0 发布。

其他
音乐频道 @rynif_music
Download Telegram
乌克兰同事被强制征兵了😢 希望公司能帮帮他。

他在内核做了很多非平凡贡献,主导了某项目 clang10 -> clang17 的升级,是编译器专家,XDP/XSK 专家,网卡性能专家,bpf verifier 专家。

https://lore.kernel.org/netdev/?q=maximmi

🙏21👍1🤯1
🥰7😱3
BlinkDL:
We don't need attention any more. RWKV-7 "Goose" 🪿 1.5B is coming: SotA base LM at its size, 100% RNN, fully multilingual (100+ languages & code), and honest: no eval-maxxing, no HQ-annealing, no post-training. Release in 3 days. More to come, including reasoning models.

https://twitter.com/BlinkDL_AI/status/1882799092335833396

BlinkDL:
RWKV-7 (9M & 26M params) solving Othello via CoT: github.com/Jellyfish042/R…🙂

https://twitter.com/BlinkDL_AI/status/1876649801632395421
🔥7🥰3🤷‍♀1🎉1🤮1🐳1🆒1
🥰11
🥰13
&'a ::rynco::UntitledChannel
https://youtu.be/GZPqDvG615k 视频中提到的论文: Andrew Koenig. Why Are Vectors Efficient. Journal of Object-Oriented Programming, Volume 11, Number 5, September 1998, Page 71-75 https://dblp.org/db/journals/joop/joop11.html#journals/joop/Koenig98f
事实上:
(刚写完在原视频评论区底下发的,懒得自己翻译了,机翻过来作为补充说明)

实际应用和内存分配器比视频中展示的要复杂(也更智能)得多,以至于很多说法都不太适用。

首先,正如视频中提到的,现实世界的应用程序往往同时分配多个数组。使用视频中展示的空闲列表分配器(例如 glibc malloc),不同的重新分配的数组会填补调整大小过程中产生的空隙,所以总体内存使用不会像最初的例子那样糟糕。

此外,许多现代分配器会主动控制和减少内存碎片(分配之间未使用的空隙)。

一些分配器(如 jemalloc 和 mimalloc)有"大小类别" (size class) 的概念,将相似大小的内存分配在一起(浪费一点内存把它们填充到统一大小),而不同大小的分配则完全分开。一个页面可以专门用于分配 481 到 512 字节的内存块,另一个则用于 513 到 640 字节的分配,以此类推。不同大小的数组完全不会相遇,因为它们属于不同的大小类别,而一个页面内的空闲空间会被其他具有相似大小的数组或数据结构的分配所填充(因为它们数量众多)。

其他分配器虽然没有大小类别,但会强制内存分配呈现特定模式以减少碎片,代价是稍微过度分配。伙伴分配(Buddy allocation)是一个著名的技巧,最早出现于 1960 年代,只在预先划分的分区内分配页面内存,如今在 jemalloc 等分配器中仍在使用。其他分配器如 TLSF 则试图将内存分配到最适合的位置,以在受限的内存和时间限制内减少碎片。

对于足够大的内存块分配,例如跨越多个操作系统页面的分配,realloc() 可能就像是将占用的页面重新映射到更大的连续内存地址一样简单。完全不需要复制数据,唯一的变化发生在虚拟地址映射表中,改变虚拟地址指向的物理内存块。

最后,对于使用垃圾回收的语言/分配器,许多垃圾收集器(如用于 V8 JavaScript、JVM、CoreCLR C# 等的收集器)在进行垃圾回收时会主动进行内存压缩,所以内存碎片对它们来说根本不是问题。

这并非否定作者的工作——这是一个很好的方式来可视化和比较内存分配。只是我恰好读过一些这方面的内容,注意到某些说法有点过度简化了 :)

最后,如果你正在自己设计一个动态数组,你大可以根据你对用户扩容频率的预期以及你愿意浪费多少内存,简单地选择 1.5 或 2 作为增长因子,然后让分配器处理剩下的事情。如果你仍然犹豫不决——就选 2 吧。这个选择已经足够好了!

参考资料:
- Glibc malloc 内部实现:https://sourceware.org/glibc/wiki/MallocInternals
- jemalloc 实现说明:http://jemalloc.net/jemalloc.3.html#implementation_notes
- mimalloc:https://microsoft.github.io/mimalloc/index.html
- 伙伴分配:https://en.wikipedia.org/wiki/Buddymemoryallocation
- TLSF:http://www.gii.upv.es/tlsf/files/papers/ecrts04_tlsf.pdf
🥰8👍3🔥3👻1
Forwarded from 春东西 dumb box
🥰6
Forwarded from 春东西 dumb box
😁1
Forwarded from rvalue的生草日常
😁1