初级会员
  • 第 30659 位会员
  • ZeroOcyc
  • chenyucheng
  • 2019-02-20 18:05:07
  • Offline
  • 20 5

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了博文 一道经常考的面试题
    #5 @Yanwenjiepy 从执行角度看的确可以看作是放在了 runq 的头部
  • 评论了博文 一道经常考的面试题
    runtime2.go 中关于 p 的定义: 其中 runnext 指针决定了下一个要运行的 g,根据英文的注释大致意思是说: - 1 . 如果 runnext 不为空且是就绪的,那么应该优先运行该 runnext 指向的 g 而不是运行队列中到达运行时间的 g。 - 2 . 此时要被运行的 g 将继承当前 g 剩余的时间片继续执行。 - 3 . 之所以这样做是为了消除将最后的 g 添加到队列末尾导致的潜在的调度延迟。 所以当设置 runtime.GOMAXPROCS(1) 时,此时只有一个 P,创建的 g 依次加入 P, 当最后一个即 i==9 时,加入的最后 一个 g 将会继承当前主 goroutinue 的剩余时间片继续执行,所以会先输出 9, 之后再依次执行 P 队列中其它的 g。 个人看源码找到的答案,如有错误请立刻指出。 ``` type p struct { lock mutex id int32 status uint32 // one of pidle/prunning/... link puintptr schedtick uint32 // incremented on every scheduler call syscalltick uint32 // incremented on every system call sysmontick sysmontick // last tick observed by sysmon m muintptr // back-link to associated m (nil if idle) mcache *mcache racectx uintptr deferpool [5][]*_defer // pool of available defer structs of different sizes (see panic.go) deferpoolbuf [5][32]*_defer // Cache of goroutine ids, amortizes accesses to runtime·sched.goidgen. goidcache uint64 goidcacheend uint64 // Queue of runnable goroutines. Accessed without lock. runqhead uint32 runqtail uint32 runq [256]guintptr // runnext, if non-nil, is a runnable G that was ready'd by // the current G and should be run next instead of what's in // runq if there's time remaining in the running G's time // slice. It will inherit the time left in the current time // slice. If a set of goroutines is locked in a // communicate-and-wait pattern, this schedules that set as a // unit and eliminates the (potentially large) scheduling // latency that otherwise arises from adding the ready'd // goroutines to the end of the run queue. runnext guintptr ... } ```
  • 是map[*http.Request]interface{}
  • 评论了博文 Go net/http包
    感谢分享,赞
  • 评论了博文 go 方法的继承和重写
    go的oop思想比较颠覆,但是对阅读继承和重写的代码路线似乎不太合理