其实这个问题就是想了解
golang中time.Sleep是如何实现的
在这背后调度器对time.Sleep又是如何处理的?
其实这个问题就是想了解
golang中time.Sleep是如何实现的
在这背后调度器对time.Sleep又是如何处理的?
又查阅了相关资料
自己总结一下
golang优化了time.Sleep()方法,避免其进行系统调用从而带来一些系统级别的开销
当我们在goroutine中调用time.Sleep()方法时
底层会创建一个 timer, 并将当前goroutine与timer进行绑定,并提供一个唤醒该goroutine的方法goroutineReady
然后通过addtimerLocked
方法启动全局时间事件驱动器timerproc
并将timer加入到全局timer管理器中(timer 通过最小堆的数据结构存放每个定时器),且每一个加入到timer管理器中的timer都会被按唤醒时间进行排序,最早需要唤醒的timer排在最前面
再通过gopark()方法将当前goroutine状态标记为为_Gwaiting
解除G与M的绑定关系
调用schedule()函数,重新选择一个goroutine去执行
如何被唤醒呢?
timer管理器会寻找timer定时管理器的第一个timer并判断唤醒条件,满足条件后通过调用goroutineReady
方法进行唤醒,主要操作是将对应的goroutine标记为_Grunnable并将其添加到P队列中等待被M执行
7 回答5.4k 阅读
6 回答7k 阅读✓ 已解决
4 回答2.4k 阅读
1 回答3.4k 阅读
2 回答981 阅读✓ 已解决
1 回答2.2k 阅读
1 回答1.6k 阅读
从 https://draveness.me/golang/c... 第 2.1 章节开始阅读。