自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 Redis之HyperLogLog算法原理

Redis HyperLogLog算法原理

2022-07-19 17:48:13 369 1

原创 ip2region 设计与实现

ip2region设计与实现

2022-07-19 17:45:19 463

原创 Golang 字符串拼接

Golang字符串拼接效率对比

2022-07-19 17:42:20 430

原创 Golang 栈内存与堆内存

Golang 栈内存 堆内存 内存逃逸

2022-05-25 14:16:12 1154

转载 多进程与多线程

多进程和多线程,以及其优缺点

2022-03-10 19:17:37 142

原创 Go语言的函数调用栈

函数栈帧我们知道,Golang可以把程序直接编译成.exe可执行文件,运行时,可执行文件被加载到内存,这些个机器指令对应到虚拟地址空间中,位于代码段(虚拟地址空间分别有:栈、堆、数据段、代码段)。在这其中,如果在一个函数调用另一个函数,编译器就会对应生成一条call指令,每个函数最后都有一条ret指令,负责函数结束后跳回到调用处。函数执行时,需要有足够的空间存放局部变量、参数、返回值等信息,这段空间对应虚拟地址空间中的栈。分配给函数的空间叫做函数栈帧,这就是咱们的主角了。栈底通常叫栈基bp,栈顶又叫

2021-06-02 16:26:29 498

原创 Go语言的Map

哈希表说到Map,键值对的存储,我们就会想到哈希表,哈希表通常会有一堆桶来存储键值对,一个键值对来了,就根据哈希规则选择一个桶,选择的桶冲突的话,就使用开放地址法、链表法等来处理冲突,这些都都比较简单,我就先不写到这块了。关键字段Map的底层实现就是哈希表,map类型变量本质上是一个指针,指向hamp结构体,其中关键的字段有:count(int):键值对数目B(uint8):记录桶(用来存放map)的数目2^Bbuckets(unsafe.Pointer):记录桶的位置oldbucket

2021-06-02 14:59:48 162

原创 关于内存对齐与其在GO中应用

嘛是内存对齐?为了保持顺序高效的读取各种数据,编译器会把各种类型的数据排列到合适的地址,并占用合适的长度,这,就是内存对齐。不同类型的对齐边界不同类型有不同的大小,自然会有不同的对齐边界,比如int16占用两个字节,对齐边界就是2,int32占用四个字节,对齐边界就是4,那么在奇数个int16后是不能紧跟int32的,因为这样是无法便捷快速的找到int32这个类型对应的数据。解决办法是往后空2个字节,这个空2个字节怎么算出来的呢?就是要算出当前的地址是否可以整除你的对其边界。不同的系统和语言中

2021-06-02 14:44:32 133

原创 Go语言的Slice

Slice结构主要包含三个部分:地址、长度、容量基础结果Slice一般都会依赖一个底层数组(数组和切片的最主要区别数组长度不可变;切片长度可变),通过make得到的Slice会直接分配Slice的三大金刚,长度容量可指定,默认为0;通过new得到的Slice不会分配Slice的三大金刚,只是给你个地址,这个地址指向三大金刚的位置,也就是指针,不过这个时候三大金刚也是未初始化的。未初始化,就不能直接操作、赋值之类的(new得到的变量可通过append进行添加值,然后分配三大金刚)那数组是什么Sl

2021-06-02 14:36:59 162 1

原创 计算机里的字符串与GO语言中的字符串

引入OK,计算机中使用0和1存储所有数据,对于数字,容易理解,通过二进制可以表示和存储。那么字符串呢?首先的解决方法是,定义一个字符集,比如OK我是夏洛,分别对六个字符进行对应编码。所以最初的ASCII字符集出现了,不过由于较早,所以很多字符没收入,比如中文,经过一系列增加修订,一直有很多字符集出现。最终Unicode出现,制霸统一,实现跨语言,跨平台的文本转换和处理。如何划分好了,编码解决了,如何读取?一长串内容该怎么划分?首先的解决办法是,每一个字符都使用固定长度进行编码,可行,也就是

2021-06-02 14:26:20 111

原创 为什么要引入协程

随口说进程创建了一个个线程小弟用来给它服务,线程做小弟做久了,心想我也弄几个手下啊,然后它也背着操作系统偷偷整了几个小弟,给他干活,这几个小弟就是协程了。介绍协程,就是线程创建的执行体,同样线程需要维护每个协程的执行入口,栈基,栈指针和执行现场等,用来不同协程进行切换。由于用户态不能操作内核空间,所以协程只存在于用户空间中,操作系统是浑然不知的。原因既然切换也得保存现场、也得各种设置寄存器,那么它和本来的线程区别在哪?首先,它是更加灵活、轻量级的,因为现在CPU、内存啥的确实厉害,线程

2021-06-01 17:21:44 243

原创 进程线程的执行与切换

引入之前有一篇文章我写了为什么要引入虚拟内存,它可以维护内存的安全。之后,为了进一步保证系统和内存安全,操作系统又把虚拟地址划分为内核空间和用户空间,内核空间主要由操作系统控制,用户不可直接访问。内核空间保存了像进程控制信息PCB这样有关进程的信息。而线程就是进程的执行体,它需要一个执行入口,通常会是某个函数的指令入口,这样的信息保存在用户空间。执行在创建进程时,操作系统会分别在内核空间和用户空间分配两段栈,即内核栈和用户栈,用来存储线程执行时需要保存的数据。执行程序前,IP指向执行入口,e

2021-06-01 16:50:12 788

原创 为什么要引入虚拟内存 / 虚拟内存的作用

引入当一个可执行文件被加载到内存时,就成为了一个可执行的程序,也就是一个进程。在DOS时器,进程直接使用物理内存,使用实地址,这样的话,一个进程可能会操作到另一个进程的内存空间,甚至覆盖操作系统的内存。所以,引入了一种保护模式,也就是虚拟内存机制。进程不使用物理内存地址,而使用虚拟内存地址,然后操作系统将虚拟内存地址映射到物理内存地址。另不同进程的相同虚拟内存地址映射不同的物理内存地址,实现内存隔离。不同进程的不同虚拟内存地址映射相同的物理内存地址,实现内存共享。...

2021-06-01 16:03:43 1864

原创 什么是JWT

定义JWT(Json Web Token)是一个开放标准,定义了一种紧凑且自成一体的方式,以便将各方之间的信息安全地传输为JSON对象。使用场景授权:最常用的使用场景,登陆后,每个后续请求将包括JWT,允许用户访问该令牌允许的路线、服务和资源。单一登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够在不同领域轻松使用。信息交换:JSON网络币之类的,不太常用。结构主要由三部分组成:Header(头部)、Payload(有效载荷)、Signature(签名),中间使用.隔

2021-05-31 16:32:18 127

原创 计算机操作系统听课笔记

不断更新…0、中断中断系统包括硬件子系统(完成中断响应)和软件子系统(完成中断处理)处理流程:先是硬件部分(发现中断源、置中断码以备分析、交换新旧PSW)、然后是操作系统部分、即软件部分(保护未被硬件保护的现场信息、分析中断源、分别处理各类中断事件、调整进程队列、进程调度、恢复处理器现场信息)、最后再回到硬件部分(恢复PSW)中断可以嵌套处理,所以引出了中断优先级和屏蔽中断的概念。可能同时接收到多个中断请求,则会通过中断优先级判断先响应哪些,同时在响应的过程中,若存在后被相应但是未被屏蔽的中断,则

2021-05-25 16:19:13 425

原创 什么是反向页表/反置页表?

为什么引入?话说已经有一个页表了, 为什么又整个反置页表?为了减少页表所占用的空间,因为每个进程都要分配一个页表,当同时存在多个进程时,页表在内存中的占用会很多,造成内存资源的浪费反置页表的实现反置页表不依据进程的逻辑页号来生成页表,而是依据进程在内存的物理页号来组织的,即一个系统中大多数情况下都只存在一个反向页表,通过逻辑页号+进程ID进行HASH,通过链接指针来得到对应的页架号(物理页号)。...

2021-05-25 15:01:02 7912

原创 Golang深入学习之GC回收机制

0、各个版本机制相关概念垃圾回收内存管理自动释放三色标记法STW(stop the world)GO v1.3及之前GC - 标记清除法STW:强制暂停当前程序的所有逻辑业务。标记清除(mark and sweep):执行STW,遍历对所有的可达对象做上标记,(可达对象:通过该程序创建、调用和依赖的对象,不包括依赖该程序中对象的对象),剩余不可达的对象(即未标记的对象)清除。缺点:会使用STW,让程序暂停,性能低,程序卡顿;标记需要扫描整个heap,复杂度高;会产生heap碎片,随

2021-04-30 20:20:33 167

原创 Golang深入学习之GPM模型

引言一些相关知识进程占用内存:虚拟内存4GB(32bit OS)线程占用内存:大约4MB演进过程并发执行各种线程,切换线程会造成较大的性能损耗,多线程的同步竞争(锁、竞争资源冲突等)问题,最后还有上面说到的占用内存较大。系统分为内核空间和用户空间,可以通过这个思想,将线程分割开来作为一个个协程co-routine,内核空间存放内核线程,用户空间存放切割后的协程,中间通过协程调度器来维持工作。所以说,M:N的调度工作就交给了协程调度器,线程层面(即内核空间)语言控制不了,所以说语言间的区别

2021-04-29 20:40:45 579

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除