想象一下,内存好比一个长长的桌子,桌子有很多连续的抽屉(内存块)。我们可以按照顺序给每一个抽屉从0开始编号(内存地址),这个编号就是抽屉的地址。当我们需要使用抽屉存放东西的时候,就通过编号找到对应的抽屉,放好东西。这个东西就是我们存的数据。 通过编号找东西固然不错,可是有时候我们想直观的知道抽屉里放了什么内容,就给抽屉外面贴上(声明)一个标签(变量名),比如编号5的抽屉式水果
文章目录1.init 函数简介Golang init 函数是一种特殊的函数,主要用于完成程序的初始化工作,如初始化数据库的连接、载入本地配置文件、根据命令行参数初始化全局变量等。package main import "flag" var gopath string func init() { println("init a") } func init() { println("init
一个程序只能有一个main的package. 且pack main 会包含一个main的函数. pack main会包含多个其他的pack. 这里我们假设还有pack1, pack3. pack可能还会包含其他的pack. 这里我们假设 pack1. 还包含了 pack2 . 所有的 pack 都可以包含0个至多个init函数. 没错. 可以有多个init函数... ...
相同库中的包的初始化顺序 相同包 按go文件字典序,先执行不同go文件中的全局变量 按go文件字典序,再执行不同go文件中的init() 遵循字典序初始化顺序 遵循依赖包优先初始化原则,优先于字典序原则 不同包 go文件依赖于不同包的go文件 是 以包为单位初始化,先初始化依赖的包,包括依赖包下不依赖的go文件 否 以包为单位初始化,按go文件字典序初始化包 遵循字典序初始化顺序
go-grpc-middleware封装了认证(auth), 日志( logging), 消息(message), 验证(validation), 重试(retries) 和监控(retries)等拦截器。如何使用呢?在初始化grpcserver的时候,参数传入即可import "github.com/grpc-ecosystem/go-grpc-middleware" myServer :=
首先列一个层级架构:1. 最底层mheap(和操作系统内存打交道)mheap中包含着mache组件和mcentral组件mheap向操作系统申请内存空间,然后分配给mcentral2. 第二级mcentral组件3. 第一级mcache组件(小对象最优先看这个可不可以申请内存) Go会在程序运行时调用一个内存管理初始化的函数mallocinit如下
并行(parallel): 物理上同一时间处理不同任务 并发(concurrent): 逻辑上处理同时的任务的能力 通常所说的并发编程,也就是说它允许多个任务同时执行,但实际上并不一定在同一时刻被执行。在单核处理器上,通过多线程共享CPU时间片串行执行(并发非并行)。而并行则依赖于多核处理器等物理资源,让多个任务可以实现并行执行(并发且并行)。 对于用户层面来说,进程就是一块运行起来的程序
解释GMP模型GMP 模型是 Go 语言调度器采用的并发编程模型,它包含三个重要的组件:Goroutine(G)、逻辑处理器(P)和操作系统线程(M)。这些组件协同工作以实现 Go 程序的高效并发执行。具体来说,Goroutine (G) 是 Go 语言中轻量级的并发执行单元,类似于线程但比线程更小、更灵活。每个 goroutine 都有自己独立的堆栈和寄存器等信息,可以通过 go
golang 大杀器——GMP模型 思维导图: 1. 发展过程 思维导图: 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有: 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 时间片轮训算法 并发执行 这样的好处是充分利用了CPU,但是也带来了一些问题,例如时间片切换需要花费额外的开销 成本就越大浪费
声明 非完全原创,大部分内容来自于学习其他人的理论。如果有侵权,请联系我,可以立即删除掉。 Linux进程的内存使用 CPU对内存的访问 CPU 上有个Memory Management Unit(MMU) 单元CPU 把虚拟地址给MMU,MMU 去物理内存中查询页表,得到实际的物理地址CPU 维护一份缓存Translation Lookaside Buffer(TLB)