- 博客(4)
- 收藏
- 关注
原创 GMP模型
当M上的G运行耗时活着阻塞的时候,M与释放P转给其他M执行,当M执行完的系统调用阻塞的G后,M会尝试获取新的空闲P,同时将G放入P的本地队列执行。新创建的G会首先存在P(本地队列里面),如果P满了,会存到全局队列中,同时把P中的一半的G也放在全局队列里面,之后有新的G还会先存到P里面。P,Processor,处理器,主要用于协调G和M之间的关系,存储需要执行的G队列,与特定的M绑定后,执行Go程序,也就是G。P与M建立联系,在P中执行G(P并不与一个固定的M简历联系如果M阻塞,P会与新的M联系)
2024-04-12 14:17:04 249
原创 Channel的实现原理
它允许 Goroutine 在等待 channel 上的发送或接收操作时,以一种高效的方式挂起和恢复,同时支持与 select 语句的集成。3. 判断申请内存空间大小是否越界,mem 大小为 element 类型大小与 element 个数相乘后得到,仅当无缓冲型 channel 时,因个数为 0 导致大小为 0;6. 如若有缓冲的 struct 型,则一次性分配好 96 + mem 大小的空间,并且调整 chan 的 buf 指向 mem 的起始位置;:用于竞争获取锁时的票据,类似于一个简单的等待队列。
2024-04-07 14:24:05 900 1
原创 Channel有缓冲和无缓冲区别(fatal error: all goroutines are asleep - deadlock!问题)
因为是无缓冲通道,他需要有协程去接收它,而在上面的代码中,先执行了发送的代码,接收的代码还没有执行导,也就是没有接收消息的协程,所以会卡死。概念这里我们不多赘述,直接看实际开发中它的区别。可以看出运行是没有问题的。首先我们看无缓冲通道。
2024-03-25 17:20:21 141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人