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

标签:TSRM

共 2 篇相关文章

IT 累计浏览 5,365

深入研究PHP及Zend Engine的线程安全模型

这篇讲的是PHP核心的Zend引擎如何在多线程环境下保证线程安全(ZTS)的实现原理。作者从自己扩展开发中遇到的“TSRM”宏疑惑出发,通过研读PHP 5.3.8的源码,拆解了线程安全资源管理器(TSRM)这个后台管家。 核心思想很巧妙:TSRM在堆上为每个线程创建独立的“全局变量副本”,通过一个资源ID进行存取,避免了多线程间的冲突。文章深入分析了两个关键数据结构`tsrm_tls_entry`(管理单个线程的所有全局变量)和`tsrm_resource_type`(定义资源的属性),并图解了它们如何组成链表与数组进行协作。 实现细节上,`tsrm_startup`函数会根据SAPI(如Apache、FPM)预设的线程和资源数来预先分配内存池,比如大多数常用SAPI默认只分配1个线程和1个资源,因为它们通常运行在单线程模式。而`ts_allocate_id`函数通过一个简单的全局自增整数来分配资源ID,并使用互斥锁确保这个过程在多线程下也安全,同时会动态扩容已分配线程的资源存储空间。 整篇文章将宏背后晦涩的机制,梳理成清晰的内存管理模型,对于想理解PHP多线程扩展(如pthreads)或内核的开发者来说,是一份扎实的源码导读。

IT 累计浏览 2,569

深入研究PHP及Zend Engine的线程安全模型

这篇讲的是作者在阅读PHP源码时的一个具体困惑:那些与线程安全相关的“TSRM”宏究竟在干什么?他没有止步于“按规则使用”,而是选择深入源码一探究竟。 文章首先厘清了PHP中线程安全(ZTS)的基本概念与背景。核心部分则聚焦于PHP线程安全机制TSRM(线程安全资源管理器)的具体实现,剖析了其关键数据结构、实现细节与运行机制。最后,作者还探讨了Zend Engine如何针对单线程与多线程环境进行选择性编译的问题。 作者从一个常见的开发困惑出发,通过源码阅读和资料整理,将相对晦涩的底层机制梳理得清晰可见。对于想理解PHP扩展为何需要特定宏,或对虚拟机内部线程安全设计感兴趣的开发者,这篇文章提供了一次扎实的内部探索。