`
乱蓬头199303
  • 浏览: 81235 次
文章分类
社区版块
存档分类
最新评论

PHP 源码学习之线程安全

php 
阅读更多

摘要: 注:本篇非我一己之力所完成,最后发布在了《TIPI》这本电子书上。 了解线程安全之前,我们先回顾几点基础知识点,是我们后面分析学习的基础。 变量的作用域 从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量。 下面仅从函数作用域的角度分析一下不同的变

注:本篇非我一己之力所完成,最后发布在了《TIPI》这本电子书上。

了解线程安全之前,我们先回顾几点基础知识点,是我们后面分析学习的基础。

变量的作用域

从作用域上来说,C语言可以定义4种不同的变量:全局变量,静态全局变量,局部变量,静态局部变量。

下面仅从函数作用域的角度分析一下不同的变量,假设所有变量声明不重名。

上面几种作用域都是从函数的角度来定义作用域的,可以满足所有我们对单线程编程中变量的共享情况。 现在我们来分析一下多线程的情况。

在多线程中,多个线程共享除函数调用栈之外的其他资源。 因此上面几种作用域从定义来看就变成了。

线程安全资源管理器的由来

在多线程系统中,进程保留着资源所有权的属性,而多个并发执行流是执行在进程中运行的线程。 如 Apache2 中的 worker,主控制进程生成多个子进程,每个子进程中包含固定的线程数,各个线程独立地处理请求。 同样,为了不在请求到来时再生成线程,MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数; 而 MaxClients 设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

当 PHP 运行在如上类似的多线程服务器时,此时的 PHP 处在多线程的生命周期中。 在一定的时间内,一个进程空间中会存在多个线程,同一进程中的多个线程公用模块初始化后的全局变量, 如果和 PHP 在 CLI 模式下一样运行脚本,则多个线程会试图读写一些存储在进程内存空间的公共资源(如在多个线程公用的模块初始化后的函数外会存在较多的全局变量)。

此时这些线程访问的内存地址空间相同,当一个线程修改时,会影响其它线程,这种共享会提高一些操作的速度, 但是多个线程间就产生了较大的耦合,并且当多个线程并发时,就会产生常见的数据一致性问题或资源竞争等并发常见问题, 比如多次运行结果和单线程运行的结果不一样。如果每个线程中对全局变量、静态变量只有读操作,而无写操作,则这些个全局变量就是线程安全的,只是这种情况不太现实。

为解决线程的并发问题,PHP 引入了 TSRM: 线程安全资源管理器(Thread Safe Resource Manager)。 TRSM 的实现代码在 PHP 源码的 /TSRM 目录下,调用随处可见,通常,我们称之为 TSRM 层。 一般来说,TSRM 层只会在被指明需要的时候才会在编译时启用(比如,Apache2+worker MPM,一个基于线程的MPM), 因为 Win32 下的 Apache 来说,是基于多线程的,所以这个层在 Win32 下总是被开启的。

TSRM的实现

进程保留着资源所有权的属性,线程做并发访问,PHP 中引入的 TSRM 层关注的是对共享资源的访问, 这里的共享资源是线程之间共享的存在于进程的内存空间的全局变量。 当 PHP 在单进程模式下时,一个变量被声明在任何函数之外时,就成为一个全局变量。

首先定义了如下几个非常重要的全局变量(这里的全局变量是多线程共享的)。

其中涉及到两个关键的数据结构 tsrm_tls_entry 和 tsrm_resource_type

当新增一个全局变量时,id_count 会自增1(加上线程互斥锁)。然后根据全局变量需要的内存、构造函数、析构函数生成对应的资源tsrm_resource_type,存入 *resource_types_table,再根据该资源,为每个线程的所有tsrm_tls_entry节点添加其对应的全局变量。

有了这个大致的了解,下面通过仔细分析 TSRM 环境的初始化和资源 ID 的分配来理解这一完整的过程。

TSRM 环境的初始化

模块初始化阶段,在各个 SAPI main 函数中通过调用 tsrm_startup 来初始化 TSRM 环境。tsrm_startup 函数会传入两个非常重要的参数,一个是 expected_threads,表示预期的线程数, 一个是 expected_resources,表示预期的资源数。不同的 SAPI 有不同的初始化值,比如mod_php5,cgi 这些都是一个线程一个资源。

​​​​​​​

原文链接

分享到:
评论

相关推荐

    百度云多线程转存易语言源码带PHP后台源码

    总的来说,这个资源对于学习易语言编程、多线程技术、百度云API使用、PHP后台开发以及文件管理系统的构建都具有很高的参考价值。开发者可以借此深入理解云存储服务的集成以及后端程序的设计与实现。

    php语言源码

    PHP源码是其底层实现的核心代码,对于开发者来说,理解PHP源码有助于深入学习PHP的工作原理,提升编程技能,以及进行二次开发或优化。 标题中的“php语言源码”指的就是PHP的原始代码,这些源码是PHP解释器和扩展的...

    PHP7.2源码 下载

    7. **线程安全**:虽然PHP通常是非线程安全的,但在某些环境下(如Apache的mod_php模块),理解线程安全的实现也很重要。 8. **编译和安装过程**:通过阅读源码,我们可以了解如何配置、编译和安装PHP,这对于...

    PHP源码分析

    ### PHP源码分析 在深入探讨PHP源码之前,我们需要明确几个关键概念和技术背景,以便更好地理解接下来的内容。 #### PHP简介 PHP(Hypertext Preprocessor,即“超文本预处理器”)是一种通用开源脚本语言。语法...

    PHP网页斗地主源码

    学习这个源码,不仅可以深入理解PHP编程,还能掌握网络游戏中的一些核心概念,如游戏循环、状态机、网络同步等。对于想要从事游戏开发或者提升PHP编程能力的开发者来说,这是一个很好的实践案例。通过分析和修改这个...

    CurlMulti 一个php多线程类库

    提供的"CurlMulti-master"可能是该多线程库的一个版本或者示例代码仓库,包含类库的源码和其他相关文件,供开发者下载学习和应用到自己的项目中。下载后,可以通过阅读源码了解其实现细节,并根据实际需求进行定制...

    基于PHP的辰光PHP客服tb多商户全开源源码.zip

    【标题】"基于PHP的辰光PHP客服tb多商户全开源源码.zip"指的是一个开源的PHP客服系统,专门设计用于支持多个商户的环境。这个系统由辰光PHP团队开发,提供完全的源代码,允许用户自定义和扩展功能,以满足不同商户的...

    php-5.3.29源码

    9. **TSRM**: TSRM (Thread Safe Resource Manager) 是PHP中用于处理线程安全的模块,尤其在多线程环境中,它负责资源管理和内存分配,确保不同线程间的正确交互。 通过研究这些源码文件,开发者可以了解PHP的内部...

    程序实践三 单线程 多线程

    然而,多线程也引入了新的挑战,如线程安全问题、死锁、竞态条件等。因此,对线程的同步和互斥控制显得尤为重要。 在Java或C++等支持多线程的语言中,我们可以使用特定的API来创建和管理线程。例如,Java中的`...

    PHP实例开发源码——php目录下载器.zip

    综上所述,这个PHP实例开发源码涵盖了文件系统操作、HTTP交互、安全性、性能优化等多个关键领域,对于学习和理解PHP在实际项目中的应用具有很高的价值。通过分析和理解这个代码,开发者不仅可以提升PHP技能,还能...

    php7.1.2源代码

    PHP 7.1.2支持线程安全模式,`TSRM`库负责管理线程间的资源,这对于多线程应用至关重要。 通过深入研究`php-7.1.2-src`源代码,开发者不仅可以提高对PHP语言的理解,还能学习到C语言编程、编译原理、内存管理等多...

    图片采集程序 PHP源码

    【标题】:“图片采集程序 PHP源码”是一个用于自动化收集网络上图片的PHP脚本,它可以帮助用户批量获取并下载指定网站上的图像资源。这样的程序在网页数据抓取、图片库构建、网络监控等领域有着广泛的应用。 ...

    PHP实例开发源码——Mars_Qvod资源采集爬虫程序 php版.zip

    【描述】提到的"PHP实例开发源码"意味着这是一个实际的项目代码,提供了一个学习和参考的样例。"Mars_Qvod资源采集爬虫程序"表明该程序的主要目标是自动抓取与"Mars"相关的Qvod平台上的视频或相关资源。爬虫程序是一...

    易语言源码易语言PHP服务器源码.rar

    《易语言PHP服务器源码详解》 易语言是一款由中国程序员王江民开发的,专为中国人设计的编程语言,它的特点在于使用了贴近中文的词汇,使得编程过程更加...希望这个源码能帮助大家在易语言和PHP的学习之路上更进一步。

    Android源码——与php服务器交互实例源码_new_25.zip

    开发者可以通过分析和运行这些代码来学习如何在实际项目中实现Android与PHP服务器的数据交互。 总之,这个实例提供了Android客户端与PHP服务器交互的完整流程,从发起请求、处理响应到错误处理和数据格式化,涵盖了...

    PHP解释器 -C++源码

    - **线程安全**:对于多线程环境下的PHP解释器,这部分代码会确保线程安全。 - **标准库和内置函数**:PHP的内建函数和标准库的实现,如字符串操作、数学运算等。 学习和分析C++源码对于深入理解PHP的工作原理非常...

    基于PHP的MySQL数据管理MySQLDumperphp版源码.zip

    MySQLDumper是一款基于PHP的开源工具...通过对MySQLDumper源码的学习和实践,不仅可以掌握数据库管理的实用技巧,还能提升PHP编程和Web开发的整体技能。同时,这也为自定义数据库管理工具或者扩展其功能提供了可能性。

    安卓仿微博客户端源码&php;后端源码

    《安卓仿微博客户端源码与PHP后端源码解析》 在移动互联网时代,安卓(Android)作为全球最大的智能手机操作系统,其...总之,安卓仿微博客户端源码与PHP后端源码是移动开发领域的一份宝贵资源,值得大家下载学习。

    PHP7多线程搭建教程

    不过需要注意,多线程编程也会带来新的挑战,如线程安全、同步问题等,需要开发者具备相应的知识来避免竞态条件和其他潜在的问题。 总结一下,本教程详细介绍了如何在PHP7环境中搭建并使用pthreads扩展来实现多线程...

    基于PHP的喧喧(开源免费的企业即时通讯IM软件) 源码包.zip

    通过对喧喧源码的学习,开发者不仅可以掌握PHP编程和即时通讯技术,还能深入理解企业级应用的架构设计、性能优化和安全性实践。同时,开源软件的透明性也意味着你可以从中学习到良好的编程习惯和项目管理经验。

Global site tag (gtag.js) - Google Analytics