最新 最热

记一次SIMD指令优化计算的失败经历

书接上回 《统计一个数字二进制位1的个数》,现在我们已经知道如何快速计算出一个int64数字的二进制位1的个数,那么回到我们最初的需求,我们的目的是快速统计一个bitmap中二进制位1的个数,假设我们使用[]uint64来实现bitma...

2024-09-02
1

深入理解原子操作的本质

本文以go1.14 darwin/amd64中的原子操作为例,探究原子操作的汇编实现,引出LOCK指令前缀、可见性、MESI协议、Store Buffer、Invalid Queue、内存屏障,通过对CPU体系结构的探究,从而理解以上概念,并在最终给出一些事实。...

2024-09-02
1

Go源码解析之sync.Mutex锁

在解释Lock()和Unlock()源码之前我们必须先整体了解下Mutex的设计,不然下面的源码很难看懂。

2024-09-02
1

Golang切片与实现原理

array是切片用来存储数据的底层数组的指针,len为切片中元素的数量,cap为切片的容量即数组的长度

2024-09-02
1

brk与mmap

glibc的malloc函数在申请大于128K的内存时使用mmap分配内存,mmap会从堆区和栈区中间的部分划分内存,而在申请小于128K的内存时使用brk从堆上划分内存。

2024-09-02
1

golang sync.Pool分析

pin的作用是将当前G与P绑定,禁止被抢占。那么为什么要禁止被抢占呢?原因是G被抢占后再恢复执行之后再绑定的可能就不是被抢占之前的P了

2024-09-02
1

x86 CPU与IA-32架构

现代计算机使用的CPU大部分都是x86CPU,包括现在牙膏厂的酷睿。x86系列CPU的原型是Intel 1978年推出的8086 CPU

2024-09-02
1

x64架构下Linux系统函数调用

push指令将数据压栈。具体就是将esp(stack pointer)寄存器减去压栈数据的大小,再将数据存储到esp寄存器所指向的地址。

2024-09-02
1

一些范畴论上的概念

函子与函数不同,函数描述的是类型之间的映射,而函子描述的是 范畴(category) 之间的映射

2024-09-02
1

haskell 中的newtype

但有些情况下要使用newtype来定义, 举个例子,对于数字来说,它有两种选择可以表现为一个monoid,一个是 * 作为二元函数,1 作为identity, 另外一种是 + 作为二元函数,0 作为identity。那么问题来了怎么把这两种选择都实现 (...

2024-09-02
1