深圳企业网站建设服务公司,wordpress 响应式图片,wordpress 配送插件,做网站的生产方式一、内存的理解你可以将计算机中的内存理解为一本为短期存储而设计的书。这本书中现在什么都没写#xff0c;但最终不同的“作者”会来寻求空间#xff0c;写入他们想写的故事。由于他们之间不能彼此覆盖#xff0c;他们在开始写入之前一定要向这本书的管理者申请#xff0…一、内存的理解你可以将计算机中的内存理解为一本为短期存储而设计的书。这本书中现在什么都没写但最终不同的“作者”会来寻求空间写入他们想写的故事。由于他们之间不能彼此覆盖他们在开始写入之前一定要向这本书的管理者申请由管理者来决定他们写入到哪里。由于这本书会存在很长的时间书中的很多故事可能已经不再有意义。当没有人读或者引用故事这些无意义的故事就会被删除给新的故事腾出空间。本质上电脑内存很像是一本空的书。实际上内存通常被叫做“固定长度的连续内存块”所以这个类比是很贴切的。作者就像是不同的应用程序或者进程需要在内存中存储数据。决定作者写内容位置的管理者则扮演各种各样内存管理器的角色。清除旧故事给新作者提供空间的人就是垃圾回收机制。二、内存管理从硬件到软件内存管理是应用读取、写入数据的流程。内存管理机制决定了在哪里存储应用数据。就像是我们上面以书为类比内存块也是有限的管理机制必须要找出可用的空间并且将其提供给应用。这个提供内存的过程一般被称作内存分配。另一方面当数据不再被需要那么数据可以被删除或者被释放。但是释放到哪里呢这个内存从哪里来的在你的计算机的某个位置当你运行你的Python程序时有一个实体硬件在存储数据。但是在对象实际到达硬件之前Python代码要经过很多抽象层。在硬件之上其中一个主要的抽象层是默认的Python实现在OS中内置或者你从http://python.org中下载Python代码中的内存管理是由Python应用程序处理的。本文聚焦Python应用程序在内存管理中使用的结构和算法。三、默认的Python实现默认的Python实现CPython是使用C语言写的。是不是很震惊一种语言是用另一种语言写的好吧这不是真的但多少有点。Python语言在Python参考文档里有详细的讲解但是光靠文档并不能覆盖一切我们还是需要一些东西来编译实际代码。我们也需要在计算机上实际执行编译后的代码。默认的Python实现满足这两个要求它将你的Python代码转化为指令并且将其运行在虚拟机上。Python是解释型语言你的Python代码实际上被编译成更底层更对计算机友好的bytecode指令。当你运行你的代码时这些指令被虚拟机编译了。你见过.pyc文件或者__pycache__文件夹吗那就是被虚拟机编译后的bytecode代码。必须指出除了CPython之外还有别的Python实现。Ironpython编译后在Microsoft 的公共语言运行时上运行。Jython编译后成为Java bytecode在Java虚拟机上运行还有PyPy但这个Python实现值得用一篇文章专门介绍此处不提。为了理解Python内存管理我们将聚焦于Python的默认实现——Cpython中所实现的内存管理。本文中涉及到的知识适用于目前的通用版本——Python3.7好了我们知道CPython是用C写的并且编译为Python bytecode这和内存管理有什么联系呢是这样的——内存管理算法和结构存在于CPython代码中用C写的。为了理解Python中的内存管理我们需要对CPython有一些基本了解。CPython是用C写的它本身并不支持面向对象编程。正因如此在CPython中有很多有趣的设计。你可能听说过Python中一切皆是对象甚至诸如int、str这样的类型。确实在CPython的实现级别是这样的。有一个结构叫做PyObject在CPython中其他object都在使用它。C中的一个或者多个结构是将不同数据类型组合在一起的自定义数据类型。与面向对象的语言相比就像是具有属性且没有方法的类。PyObject所有Python中对象的老祖宗仅仅包含如下两个部分ob_refcnt引用计数ob_type: 指针 引用计数用于垃圾回收机制。你现在有一个指针指向实际对象类型。该对象类型只是另一种用于描述Python对象的结构例如dict或者int每个对象都有自己的特定对象的内存分配器该分配器知道如何获取存储该对象的内存每个对象也有特定对象的内存释放器用于释放不再被需要的内存。在我们所有关于分配和释放内存的讨论中有一个重要的因素。内存是计算机中被共享的资源如果不同的进程同时写入同一位置糟糕的事情就会发生。四、全局解释器锁GILGIL是在解决共享资源像是内存这类型的共性问题的有效解决办法。当两个线程同时想要修改相同的资源他们可能会互相“踩脚趾”最终的结果可能是乱码在乱码中两个线程都没有得到想要的结果。再考虑一下我们那个用书比作内存的比喻。假设两个作者都固执地一定认为该轮上他来写了而且他们都要写到书的同一页上。他们忽略了其他人也在创作故事那么结果就是一页上两个故事相互重叠整个页面完全不可读。这个问题的解决办法之一是在一个线程与共享资源交互时使用单一的全局解释器锁将该资源上锁。也就是说同一时间只有一个作者可以写作。Python的全局解释器锁通过锁住整个解释器来实现这一点。这意味着另一个线程不可能踩到当前的解释器。当CPython处理内存时使用GIL锁来确保安全。这种方法有利有弊也在Python社区引起了激烈讨论。关于全局解释器锁What is the Python Global Interpreter Lock (GIL)? – Real Pythonrealpython.com