Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux

Go语言内存分配器设计

Go语言内存分配器设计

Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。十一小长假期为了避开我泱泱大国的人流高峰,于是在家宅了3天把Go语言的内存分配器部分的代码给研究了一番,总的来说还是非常酷的,自己也学到了不少的东西,就此记录分享一下。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍,因此,想看看Go语言的内存分配器实现的话,强烈建议先读一读tcmalloc的介绍文档,然后看看Go runt...
Go语言内存分配器-FixAlloc

Go语言内存分配器-FixAlloc

前面写了一篇Go语言内存分配器设计,记录了一下内存分配器的大体结构。在介绍内存分配器的核心实现前,本文先介绍一下内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。引入FixAlloc的目的只是用来分配MCache和MSpan两个特定的对象,所以内存分配器中有spanalloc和cachealloc两个组...
Go语言内存分配器-MSpan

Go语言内存分配器-MSpan

MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,先解释一下page,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来,注意是连续的page,不是东一个西一个的乱摆设的page。为了直观形象的感受一下span,还是得画个图吧,图形是最好的交流语言。MSpan结构定义在malloc.h头文件中,...
Go语言内存分配器的实现

Go语言内存分配器的实现

前面断断续续的写了3篇关于Go语言内存分配器的文章,分别是Go语言内存分配器设计、Go语言内存分配器-FixAlloc、Go语言内存分配器-MSpan,这3篇主要是本文的前戏,其实所有的内容本可以在一篇里写完的,但内容实在太多了,没精力一口气搞定。本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。内存布局结构图我把整个核心代码的逻辑给抽象绘制出了这个内存布局图,它基本展示了Go语言内存分配器的整体结构以及部分细节...
Python 的 Magic Methods 指南

Python 的 Magic Methods 指南

介绍本指南是数月博客的总结。主题是魔术方法。什么是魔术方法呢?它们是面向对象Python语言中的一切。它们是你可以自定义并添加“魔法”到类中的特殊方法。它们被双下划线环绕(比如__init__或__lt__)。它们的文档也不像它所需要的那么齐备。Python的所有魔术方法都在Python文档的同一区域,但它们的使用分散,组织松散。而且文档的这部分区域中几乎没有一个示例(这很有可能是设计好的,因为在语法参考里它们都很详尽,但伴随的是枯...
Linux select详解

Linux select详解

select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,通过socket函数的声明就明白了:int socket(int domain, int type, int protocol);我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、s...
C++中构造函数何时才会构建

C++中构造函数何时才会构建

当用户未定义一个默认的构造函数,编译器并不是在任何时候都给自动给我们定义一个默认的构造函数,它只会在编译器需要的时候才会生成,并且只有class类型的变量会被初始化,其他的诸如内置类型变量或者指针都不会被初始化,这些变量的初始化工作是程序员的责任。同样,一个类的默认复制构造函数也不是什么时候都会由编译器自动生成,它需要满足以下几种情况:当class内含有一个member object,而这个member object的class声明有一个copy cons...
Java源文件命名规范

Java源文件命名规范

Java源文件命名规范命名规则:1、一个源文件中可以有多个类的定义。注意:此处的类指的是类级别的定义,并不仅仅指class,还包括interface,enum,@interface。2、一个源文件中最多只能有一个类的访问权限为public。注意:此处的类指的是顶级类,并不包括内部类。3、如果源文件中某个类的访问权限为public,则源文件的文件名必须和该类的名称一样,包括大小写都必须一致,并且以.java为后缀。4、如果源文件中没有访问权限为public的...
Java中class.forName和classLoader加载类的区分

Java中class.forName和classLoader加载类的区分

Java中class.forName和classLoader都可用来对类进行加载。前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。Class.forName(name, initialize, loader)带参函数也可控制是否加载static块。并且只...
Go语言的国际化支持(基于gettext-go)

Go语言的国际化支持(基于gettext-go)

hello, world!假设有以下的程序, 输出: “Hello, world!”.package mainimport ("fmt")func main() {fmt.Println("Hello, world!")}现在要让改程序支持不同语言的用户, 然后以本地语言输出相同意思的信息. 这就是很多程序面临的国际化问题.Go 语言的国际化思路程序的国际化一般涉及到编码和翻译两个概念. 其中编码一般采用 UTF8 编码标准, Go...
Python 并行任务技巧

Python 并行任务技巧

Python的并发处理能力臭名昭著。先撇开线程以及GIL方面的问题不说,我觉得多线程问题的根源不在技术上而在于理念。大部分关于Pyhon线程和多进程的资料虽然都很不错,但却过于细节。这些资料讲的都是虎头蛇尾,到了真正实际使用的部分却草草结束了。传统例子在DDG https://duckduckgo.com/搜索“Python threadingtutorial”关键字,结果基本上却都是相同的类+队列的示例。标准线程多进程,生产者/消...
Java instrment手工加载Log4j配置文件

Java instrment手工加载Log4j配置文件

使用java instrument做一个代码监控的工具,监控日志想用log4j记录,遇到了点问题。启动应用的命令行加入-javaagent参数,可以在加载类时对其字节码做修改,常用工具有asm、javasssit。我希望能额外加载用于监控的log4j的配置,但发现如果在instrument类中手工加载了监控的log4j配置,应用程序使用Logger.getLogger(“xx”)时,不会去classpath下查找应用log4j.pr...
<< 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 >>