go
~AC~
这个作者很懒,什么都没留下…
展开
-
go gmp --- 场景驱动方式来入门gmp
本篇文章我将以场景驱动的方式以不同的case来看一下gmp到底是怎么工作的。场景1 新建G此时p的本地队列未满,由于局部性原理,G1新建G2后G2进入p的本地队列,因为G2很有可能与G1共享同一块内存。场景2 新建过多的G如果p的本地队列已经满了(有G3-G6),此时G2再去创建G7,由于本地队列已满,会将本地队列的一半G移到全局队列中,进行负载均衡。场景3 创建G唤醒空闲P和M在创建G时还会去尝试唤醒空闲P,然后看是否有空闲M,如果有则唤醒M,如果没有则新建M来绑定这个P,之后M进入自旋寻原创 2021-11-21 20:03:11 · 4559 阅读 · 0 评论 -
go gmp --- goroutine抢占调度源码分析
为什么需要goroutine抢占调度?通过本文我们已经知道,go会在每次调度goroutine的时候检查定时器是否就绪了,所以如果仅靠goroutine主动让出(系统调用阻塞、读写chan阻塞…)而不对运行时间过长的goroutine进行抢占的话,这些定时器的调度时间可能会与预期有很大的偏差。goroutine抢占调度怎么实现的呢?怎么发现某些goroutine需要被抢占?通过上面这篇文章我们知道在go程序启动时会调用runtime.main,而它会创建一个监控线程,这个监控线程很特殊,不会关联任何原创 2021-11-14 19:39:29 · 1028 阅读 · 3 评论 -
go获取指定月份最后一天
//获取指定月份最后一天func GetLastDayOfLastMonth(month int) string { now := time.Now() return now.AddDate(0, int(-now.Month()) + month + 1, -now.Day()).Format("200612")}//GetLastDayOfLastMonth(2) -> output: 2021228原创 2021-11-10 10:04:45 · 1814 阅读 · 0 评论 -
gdb查看go程序启动入口
本次测试环境为docker运行的centos创建main.gopackage mainfunc main() { go hello()}func hello() { println("hello world")}编译main.gogo build main.gogdb调试maingdb maininfo files //显示entry pointb *0x45bc8 //entry point处打断点上图可以看到程序入口为原创 2021-09-24 15:20:02 · 800 阅读 · 0 评论 -
01背包-go实现
func pack(weight, value []int, cap int) int { dp := make([][]int, 0)//dp[i][j]表示容量j下前i个物品最大的value for i := 0; i <= len(value); i++ { dp = append(dp, make([]int, cap + 1)) } for i := 1; i <= cap; i++ { for j := 1; j <= len(weight); j++ {原创 2021-09-29 18:17:39 · 138 阅读 · 0 评论 -
slice作为参数时append需要注意的地方
最近在开发过程中遇到这样一个问题:一个函数接收slice作为参数,然后会append数据,但是append的数据对调用者不可见,具体看下面代码func TestSlice(t *testing.T) { sli := make([]int, 0, 2) sli = append(sli, 1) sliceAppend(sli) fmt.Printf("%v\n", sli) //[0]}func sliceAppend(ans []int) { ans = append(ans, 2)//原创 2021-09-28 16:19:26 · 322 阅读 · 0 评论