Memory
TLB32 位的操作系统的寻址范围为 4G,64的操作系统用户空间和内核空间寻址范围为 128T 用户空间包含有五个部分,分别是 只读段,包含代码和常量 数据段,包括全局变量 堆,包括动态分配的内存,从低地址开始向上增长 文件映射段,包括动态库、共享内存等,从高地址开始向下增长 栈,包括局部变量和函数调用的上下文。栈的大小一般是固定的,一般是 8MB 每个进程都有自己的页表,记录相关的映射关系,大小一般是 4KB 虚拟内存向物理内存映射的关系图是: 其中 MMU(Memory Management Unit)是一种硬件模块,用于在 CPU和内存之间实现虚拟内存管理。 其主要功能是将虚拟地址转换为物理地址,同时提供访问权限的控制和缓存管理等功能。 放在整个大系统多核架构里面,每个处理器内置了MMU模块,MMU模块包含了 TLB 和TWU两个子模块。 为了加速内存映射,操作系统会将 TLB(Translation Lookaside Buffer)作为 MMU 页表中的高速缓存,进而提高 CPU 的内存访问性能 因此CPU读取数据的过程如图: Page...
Process and Thread
Process进程(process),指的是计算机中运行的一个实例。 进程是操作系统中最小的资源分配单元,接收来自 CPU 的调度。 PCB (Process Control Block)系统中每个进程都有一个相应的 PCB,其中包含与其执行、资源需求和状态相关的信息 主要结构如下: 进程 ID:PID 为 0 的是调度进程,是内核中的一部分,也称为系统进程;PID 为 1 的是 init 进程,是一个拥有超级用户权限的的用户进程;PID 为 2 的进程是页守护进程,负责支持虚拟储存系统的的分页操作。 程序计数器:跟踪下一条要执行的指令的地址 CPU 寄存器:储存CPU 寄存器的值进行上下文切换 进程状态 内存管理信息:跟踪分配给进程的内存 IO Status:指示当前分给进程的相关IO设备 会记信息:记录资源使用情况、执行时间和其他统计数据 相关状态 new:创建进程 ready:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。 running:进程正在处理器上运行(单核 CPU...
GMP
GMP调度器 深入分析Go1.18 GMP调度器底层原理 总述 以下这部分是直接截取的腾讯技术工程的帖子中的内容。 为了解决 Go 早期多线程 M 对应多协程 G 调度器的全局锁、中心化状态带来的锁竞争导致的性能下降等问题,Go 开发者引入了处理器 P 结构,形成了当前经典的 GMP 调度模型; Go 调度器是指:运行时在用户态提供的多个函数组成的一种机制,目的是高效地调度 G 到 M上去执行; Go 调度器的核心思想是:尽可能复用线程 M,避免频繁的线程创建和销毁;利用多核并行能力,限制同时运行(不包含阻塞)的 M 线程数 等于 CPU 的核心数目; Work Stealing 任务窃取机制,M 可以从其他 M 绑定的 P 的运行队列偷取 G 执行;Hand Off 交接机制,为了提高效率,M 阻塞时,会将 M 上 P 的运行队列交给其他 M 执行;基于协作的抢占机制,为了保证公平性和防止 Goroutine 饥饿问题,Go 程序会保证每个 G 运行 10ms 就让出 M,交给其他 G 去执行,这个 G 运行 10ms 就让出 M 的机制,是由单独的系统监控线程通过...
Golang Map
Map参考链接: 万字解析Golang基于桶思想的map实现原理 - MelonTe - 博客园 (2 封私信 / 36 条消息) Go Map底层实现原理 - 知乎 (2 封私信 / 36 条消息) 深入理解Go语言的Map - 知乎 数据结构12345678910111213141516171819202122232425262728293031323334type hmap struct { count int // 当前存储的键值对数量 flags uint8 // 标志位,用于记录 map 的状态(如是否正在扩容等) B uint8 // 桶数组的大小是 2^B,决定了桶的数量 noverflow uint16 // 记录溢出桶的数量 hash0 uint32 // 哈希种子,防止哈希冲突攻击 buckets unsafe.Pointer // 指向主桶数组的指针 ...
golang GC
参考内容 https://segmentfault.com/a/1190000044152767 https://zhuanlan.zhihu.com/p/334999060 8.2 写屏障技术 | Go 语言原本 发展历程 Go V1.3- 普通标记清除法,整体过程需要启动STW,效率极低。 Go V1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通 Go V1.8-三色标记法,混合写屏障机制,栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。 Mark and Sweep(Go V1.3)执行流程主要分为以下两个步骤: Mark(需要进行 STW(stop the world)):暂停程序找到所有可达的对象,然后进行标记 Sweep 删除未被标记的对象。 最后停止 STW,然后恢复正常运行。 优缺点优点 简单,容易实现 缺点 STW,让程序暂停,程序出现卡顿。 标记需要扫描整个 heap。 清除数据会产生 heap 碎片。 三色标记法(Go...