- 博客(14)
- 收藏
- 关注
原创 高并发下的内存模型与垃圾回收
协程栈记录了协程的执行现场。协程栈还负责记录局部变量,传递参数和返回值。Go使用参数拷贝传递。Go模仿TCmalloc,建立了自己的堆内存架构。使用heapArena向操作系统申请内存。使用heapArena时,以mspan为单位,防止碎片化。mcentral是mspan们的中心索引(存在锁竞争问题)。所以引入了mcache,mcache记录了分配给各个P的本地mspan。Go将对象按照大小分为3种。tiny对象和small对象使用mcache。
2024-02-13 20:39:56
1085
1
原创 高并发应用:TCP网络编程
Network Poller是runtime的强大工具抽象了多路复用器的操作Network Poller可以自动监测多个Socket状态在Socket状态可用时,快速返回成功。在Socket状态不可用时,休眠等待。net包抽象了TCP网络操作。使用net.Listen()得到TCPListener(LISTEN状态的Socket)使用TCPListener.Accept()得到TCPConn(ESTABLISHED)
2024-02-13 00:26:23
1068
1
原创 Go高并发下的锁
原子操作是一种硬件层面加锁的机制。数据类型和操作类型有限制。sema锁是runtime的常用工具sema经常被用作休眠队列。mutex正常模式:自旋加锁+sema休眠等待。mutex正常模式下,可能有锁饥饿的问题。锁竞争严重时,互斥锁进入饥饿模式。饥饿模式没有自旋等待,有利于公平。Mutex用来写协程之间互斥等待。读协程使用readerSem等待写锁的释放。写协程使用writerSem等待读锁的释放。readerCount记录读协程的个数。
2024-02-11 11:28:20
942
1
原创 高并发的核心工具:协程
如果协程顺序执行,会有饥饿问题。协程执行中间,将协程挂起,执行其他协程。完成系统调用时挂起,也可以主动挂起。防止全局队列饥饿,本地队列随机抽取全局队列。基于系统调用和主动挂起,协程可能无法调度。基于协作的抢占式调度:业务主动调用morestack()基于信号的抢占式调度:强制线程调用doSigPreempt()
2024-02-09 18:49:07
1067
1
原创 Go高并发下的数据结构
Go语言使用拉链实现了HashMap。每一个桶中存储键哈希的前8位。桶超出8个数据,就会存储到溢出桶中。装载系数或者溢出桶的增加,会触发map扩容“扩容”可能并不是增加桶数,而是整理map扩容采用渐进式,桶被操作时才会重新分配。map在扩容时会有并发问题sync.Map使用了两个map,分离了扩容问题不会引发扩容的操作(查、改)使用read map可能引发扩容的操作(新增)使用dirty map。
2024-02-08 21:37:42
925
原创 重新认识Go语言
Go综合了多种语言的优势Go是一种天生支持高性能并发的语言Go在工业界有广泛的应用。Go的Runtime负责内存管理、垃圾回收、协程调度Go的Runtime被编译为用户程序的一部分,一起运行。
2024-02-07 18:58:15
911
1
原创 Go语言基础知识一
new可以为任何类型的值开辟内存并返回此值的指针。new申请的值均为零值,对创建映射和切片没有意义。实际工作中通常使用字面量来创建数组而很少使用new。字符串字面量rune字面量//a,b,c的ASCII码值的十进制分别是97,98,99,对应的8进制为141,142,143//对于字符串abc我们可以通过//a,b,c的ASCII码值的十进制分别是97,98,99,对应的16进制为61,62,63//unicode也是通过16进制的码值表示的字符串字面量不支持单引号转义。
2024-01-22 17:30:46
1138
原创 算法训练营打卡记录
今天的内容比较基础,但是卡哥关于而非查找时区间的选择:左闭右闭区间、左闭右开区间,以及根据不同的区间确定是= 那里让我很有醍醐灌顶的感觉。
2023-04-19 22:40:02
1685
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅