- 博客(9)
- 收藏
- 关注
原创 Go垃圾回收初探
每个对象都包含一个引用计数,每当其他对象引用了此对象时,引用技术+1,反之,取消引用后,引用计数-1,一旦引用计数为0,表明该对象为垃圾对象,需要被回收。标记-压缩分为标记与压缩两个阶段,在压缩阶段,需要扫描活着的对象并将其压缩到空闲的区域,这可以保证压缩后的空间更紧凑,从而解决内存碎片问题。同时,压缩后的空间能以更快的速度查找到空闲的内存区域。这种算法的重要前提是:死去的对象一般都是新创建不就的,因此,没有必要反复地扫描旧对象,这大概率会加快垃圾回收的速度,提高处理能力和吞吐量,减少程序暂停的时间。
2024-08-04 11:23:29
247
原创 Go栈内存管理
1、要分配栈内存时,对于小于32KB的栈空间,比如8KB,会优先使用当前P的本地缓存,如果对应规则的内存块链表为空,就从stackpool这里分配16KB的内存放到本地缓存stackcache中,然后继续从本地缓存分配,若是stackpool中对应的链表也为空,就从堆内存直接分配一个32KB的span,划分成对应的内存块大小放到stackpool中。唯一发起栈收缩的地方就是GC,GC通过scanstack函数,寻找标记root节点时,如果发现可以安全的收缩栈,就会执行栈收缩。这些栈释放到了哪里?
2024-08-04 02:23:54
332
原创 GO堆内存管理
如果不够分配,就从当前P的mcache种找到对应的mspan重新拿一个16字节大小的内存块过来用,如果本地缓存中响应规格的mspan也没有空间了,就会从mcentral中拿一个新的mspan过来,分配完以后,如果新拿过来的内存块剩余空间比旧内存块的剩余空间还大,那就用新的内存块把旧的tiny替换掉。heapArena.bitmap:用1位标记这个arena中一个指针大小的内存单元是标量还是指针(0代表标量,1代表指针),再用1位来标记这块内存空间的后续单元是否包含指针(0终止,不包含,1扫描,包含)。
2024-08-04 01:12:39
753
原创 Go编译器初步探索
2、语法解析:Go语言采用了标准的自上而下的递归下降(Top-Down Recursive-Descent)算法,以简单高效的方式完成无须回溯的语法扫描,核心算法位于syntax/nodes.go及syntax/parser.go中。源文件中的每一种声明都有对应的语法,递归下降通过识别初始的标识符,例如_const,采用对应的语法进行解析。1、词法解析:词法阶段Go语言编译器会扫描输入的Go源文件,并将其符号(token)化,符号定义在syntax/token.go中。
2024-06-17 16:19:21
117
原创 DMA(Direct Memory Access)
DMA中也有CPU(DMA数据传输需要使用CPU,只不过这里使用的CPU不是计算机里面所有进程共享的CPU,而是由另外一个CPU来负责数据传输。这个另外的CPU就是DMA控制器) 只不过里面的CPU可以比通用CPU简单,且价格便宜很多,它只需要能够以不慢于I/O设备的速度进行数据读写即可。将数据从一个地址空间复制到另一个地址空间,提供在外设和存储之间或者存储器和存储器之间的高度数据传输。无需CPU的干预,通过DMA数据可以快速地移动,这样节省了CPU的资源。
2024-06-17 10:45:25
503
原创 Btrfs
文件系统允许你的 PC 去寻找存储在磁盘上的数据。这听起来像是微不足道的工作,但实际上时至今日各种类型的非易失性存储设备(比如机械硬盘、固态硬盘、SD 卡等等)仍然与 1970 年代 PC 被发明时基本相同:一个(巨大的)存储块集合。块(Block)” 是最小的可寻址存储单元。PC 上的每个文件内容被存储在多个块中。一个块通常是 4096 字节的大小。这取决于你的硬件和在这之上的软件(即文件系统)。文件系统允许我们从海量的存储块中查找文件的内容,这是通过所谓的inode去实现的。
2024-06-14 12:12:25
1207
原创 Linux存储系统概述
内存在这个过程中扮演了一个磁盘缓存的角色,把上下两个部分隔离成异步运行的两个过程,对上半部分来说,让数据一直留在内存中是最好的方式,因为没有办法预料到之后还会不会修改,如果需要对同一个位置频繁地进行修改,则与磁盘进行不断地数据同步是没有必要的。例如,堆不存在相对应的磁盘路径,所以它的映射就称为匿名的内存映射(注意一下最后一个[anon]区域,它的地址在内核地址空间,这是VDSO(Virtual Dynamic Shared Object)技术的应用,相当于将一个内核动态库共享给应用进程);
2024-06-14 11:35:41
1414
1
原创 网络存储技术
主机通过SCSI控制器与SCSI设备相连,通常把发起SCSI数据存储的一端叫作Initiator,而把存储数据的SCSI设备叫作Target。主机通过控制器与Target相连,而Target也可以通过SCSI总线与其他的SCSI设备相连,在SCSI总线的末端一般都会连接一个终结器,用来减少相互影响的信号,维持SCSI链上的电压恒定。4)iSCSI:为了降低使用SAN的成本,可以利用普通的数据网络来传输SCSI数据,实现和SAN相似的功能,同时系统的灵活性也得到了提高。
2024-06-13 18:03:32
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人