IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:引用计数

共 3 篇相关文章

IT 累计浏览 12,292

Linus:为何对象引用计数必须是原子的

Linus在这篇长文里,用一个具体的编程细节,撕开了“并行计算很简单”这个流行错觉的口子。他聚焦于一个看似基础的问题:为什么在多线程环境下,对象的引用计数必须是原子操作。 文章的核心论证在于区分两种完全不同的锁机制:一种是保护“对象数据”的锁,另一种是保护“查找对象”这一过程的锁。Linus指出,引用计数的原子性之所以关键,是因为在复杂的对象图(graph)中遍历时,为了避免死锁(特别是经典的ABBA死锁),你必须在持有对象A的锁时,安全地转向对象B。此时,原子性地增加对象B的引用计数,就成了确保对象B在解锁后不会“消失”的唯一安全绳。如果你认为引用计数不需要原子化,这恰恰暴露了你对锁机制复杂性的无知。 通过这个精巧的例证,Linus抨击了那些只看到简单数组并行排序、却无视真实世界中对象动态分配与释放复杂性的乐观论调。他用这个例子揭示,许多被宣传为“容易并行化”的案例,其实都巧妙回避了并发编程中最棘手的部分。这篇文章最终指向一个硬核结论:并发设计本质上是困难的,而许多关于并行未来的讨论,建立在对这种困难严重低估的基础上。

IT 累计浏览 3,747

PHP原理之内存管理中难懂的几个点

这篇深入剖析了PHP核心Zend内存管理器(Zend MM)的底层实现,着重解析了那些从源码中也未必容易看懂的精巧设计。 文章首先区分了Zend MM管理的两类内存:追求高性能的小块内存与追求稳妥的大块内存。核心亮点在于作者对关键数据结构的解读:例如,为节省内存,free_buckets数组并未分配完整的空闲块结构体,而是巧妙复用了内存,只使用链表指针部分。又如,large_free_buckets被设计成一种结合了双向链表与二叉键树的混合结构——它将内存大小的二进制位作为键,实现了内存块的快速分类与定位查找,其查找逻辑非常独特。 值得注意的是,作者明确指出诸如TIPI等既有资料在此部分存在错误,并对bitmap索引计算、rest_buckets用途等细节进行了澄清和纠正。对于PHP扩展开发者或需要深入理解底层行为的工程师来说,这些辨析极具参考价值。文章揭示了PHP内存管理在高性能与低浪费之间权衡的诸多“小聪明”。

IT 累计浏览 5,121

通过引用计数解决野指针的问题(C&C++)

这篇讲的是如何用引用计数,从根本上缓解C/C++中令人头疼的野指针问题。作者指出,虽然大家都知道`new`和`delete`必须成对使用,但在复杂的逻辑和异常流程中,手动管理内存极易出错,导致空指针解引用或内存泄漏等隐蔽的崩溃问题。 文章没有直接介绍复杂的智能指针实现,而是从最简单的引用计数原理讲起:为每个内存块维护一个引用计数器,每当有指针指向它时计数器加一,当指针不再指向时减一,计数器归零则释放内存。这个清晰的思路,为理解更高级的`std::shared_ptr`等工具打下了基础。 更巧妙的是,作者将这个方案从原始指针延伸到了C++对象。通过在类中增加引用计数成员,并配合拷贝构造和赋值运算符来管理计数,实现了轻量级的对象生命周期管理。这种方法的核心优势在于,它自动处理了对象共享时的计数问题,让开发者能更专注于业务逻辑,而非内存的释放时机,从而显著提升了代码的健壮性。