延迟释放内存
问题:
怎样在多线程时中进行内存的管理呢?有个简单的方法:内存分配器给所有的线程分配和销毁内存的时候都被一个全局锁保护,但这会造成锁争,效率底下。那么给每个调度器单独的一个内存分配器实例呢,这样就避免了锁争,但是有这样一种情况,本线程创建的内存,有可能被其他线程正在使用,那么当内存需要销毁的时候怎么办呢。难道要等原线程的内存分配器不处在被锁状态才能释放?这样你等我,我等他的还是效率底下啊。
解决方案:
为了减少由内存分配器引起的锁争,我们给每个调度器进程一个无锁状态的内存分配器,给非调度器的进程一个有锁的内存分配器。调度器在erlang虚拟机beam中是做主要工作的(所有的erlang进程的运行都是调度器来做的,erlang进程只是一个虚拟的概念),所以这样能避免大部分的锁争。
既然我们仍然需要一种方法在线程之间共享内存,我们就要管理他们。只有创建一个内存的内存分配器所属的线程才有资格释放这个内存。当其他调度器进程需要释放某个由其他调度器所属分配器实例创建的内存的时候,他把需要被释放的内存概括成一个“释放任务”通知给创建这个内存的内存分配器所属的线程,每个调度器线程都有一个类似“收件箱”的东西来接收这类“释放任务”,当调度器线程探测到了这类“释放任务”后,他会真正的释放这个内存。
“收件箱”是由一个单链表实现的。链表节点的顺序无所谓。插入新节点在链表的尾部附近,而直接在尾端插入新节点容易在多线程同事插入大量节点时导致不必要的数据竞争。
为什么呢?
正常情况下,我们始终有个指针(尾指针)是指向链表的尾部的,但在多线程同时访问链表的时候我们就不能这么做了,而是把尾指针指向尾部附近的某个节点,位置不是固定的,只要在尾部附近就行。
正常情况下,我们往链表插入数据,我们就把原来尾部节点的指针由null改成指向新节点,然后链表的尾指针也指向这个新节点。
但是当有大量的线程来执行上面说的操作的话,有可能1线程刚刚把尾部的节点E的指针指向新创建的节点E1,2线程就把E的指针指向E2,结果导致了1线程刚刚的操作完全失败了,E1节点被弄丢了。为了避免这种情况,每次有线程需要插入节点时都是在单链表尾部节点的附近插入节点,这样只要同一时间不同的线程锁插入的节点位置不是同一个节点后的话,就不会产生数据竞争,从而避免了错误,又提高了效率。
对于某个调度器线程来说,自己的“收件箱”是怎么来维护的呢?首先他有两个指针指向这个收件箱,第一个指针是指向单链表头的(head.first),还有一个是指向单链表尾的(head.unref_end),每当这两个指针不一致的时候,调度器线程就知道应该执行内存的释放任务了。
因为单链表是不断更新的,不断会有其他的线程向这个单链表的尾部附近插入“释放任务”,所以调度器线程会定期的移动head.unref_end去单链表的最尾端。
以上就是延迟释放的大概需要了解的地方。源代码我没,有什么问题欢迎大家指正。
相关推荐
Erlang Runtime System Application, ERTS, contains functionality necessary to run the Erlang system. Note: By default, ERTS is only guaranteed to be compatible with other Erlang/OTP components from the...
kernel - code necessary to run the Erlang runtime system itself; sasl - the system architecture support libraries application; stdlib - modules for manipulating lists, strings, files etc.
#### 一、Erlang OTP系统文档概述 - **版权信息**:文档由爱立信公司版权所有,自1997年至2014年,所有权利保留。 - **版本信息**:文档版本为6.3,发布日期为2014年12月9日。 - **许可协议**:Erlang/OTP系统的...
Erlang OTP 19.1 是一个重要的版本更新,主要包含了Erlang编程语言的运行时系统(ERTS)和其他一系列的库和工具。OTP(Open Telecom Platform)是Erlang的核心部分,提供了一个强大的框架来构建高度并发、容错和...
Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在深入探讨Erlang之前,先要理解它的核心理念:进程隔离、消息传递以及轻量级进程模型。这些特性使得Erlang在处理高并发...
本文将深入探讨"远古封神Server"项目,这是一个采用Erlang编程语言构建的游戏服务器,搭配MongoDB数据库来实现高效的数据存储和处理。Erlang以其并发能力、容错性和分布式特性在实时系统和大规模并发应用中得到了...
vim-erlang-runtime, Vim的Erlang缩进和语法 用于Vim的Erlang缩进和语法这是 Vim ( 来自 Vim 7.4 ) 附带的Erlang缩进和语法。安装方法 1克隆这里存储库: $ mkdir -p ~/.vim/bundle $ cd ~/.vim/b
Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心部分,它提供了一套强大的工具和库,用于构建可靠、可扩展和容错的分布式系统。OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论...
#### 一、Erlang简介 Erlang是一种由Ericsson计算机科学实验室设计和开发的程序语言。它最初是为了满足电信系统的需求而创建的,后来开源化以促进其在Ericsson之外的发展。Erlang特别适合于构建高并发、容错性强的...
Erlang是一种通用的、并发的、容错的编程语言,适用于构建高可用性、高并发性的系统。本篇文章将根据给定的文档资料,详细介绍如何在Windows环境下安装并配置Erlang环境,并结合Eclipse集成开发环境进行开发。 ####...
8. 性能优化:OTP提供了多种工具来监控和优化Erlang应用的性能,如instrument模块可以收集运行时统计信息,erlang:system_info/1函数可以获取系统详细信息,而erlang:memory/0则用于查看内存使用情况。 9. 高可用性...
Erlang的虚拟机(VM)即Erlang Runtime System(ERTS),是Erlang系统运行的基础。它支持轻量级进程,提供了高效的并发处理能力。在性能方面,ERTS经过优化,能够在多种硬件架构上高效运行。进行VM的定量分析是了解...
**Erlang文档资料大集合** 是一个综合性的资源包,包含了丰富的Erlang学习资料,旨在帮助初学者和有经验的开发者深入理解和掌握Erlang编程语言。Erlang是一种面向并发、分布式、容错的函数式编程语言,特别适合于...
erlang介绍介绍opt开发方法中文资料
Vim 的 Erlang 运行时文件 ... ~ /.vim/pack/foo/start/vim-erlang-runtime 重新启动 Vim。 病原关于病原体的信息:。 安装步骤: 克隆这个存储库: $ git clone https://github.com/vim-erlan
此“Erlang-OTP-API 离线查询英文全手册”是Erlang OTP的官方文档,包含了所有API的详细信息,是学习和开发Erlang OTP应用的重要资源。手册内容广泛,包括了以下几个核心部分: 1. **模块和函数**:手册详细列出了...
"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...
erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 Erlang 程序:陷阱和对策 硝烟中的...
《Erlang的单元测试文档,eunit》这一资料深入探讨了Erlang编程语言中的单元测试框架——EUnit,为开发者提供了详尽的指导与实践建议。 ### Erlang与EUnit Erlang是一种通用的、并发的、容错的编程语言,由...