初级会员
  • 第 18528 位会员
  • colinrs
  • 2018-05-10 14:34:41
  • 19
  • Offline
  • 23 66

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 了解了,多谢两位。 找到了一篇写关于这个的文章: [Go netpoll I/O 多路复用构建原生网络模型之源码深度解析][1] [1]: https://taohuawu.club/go-netpoll-io-multiplexing-reactor
  • ``` package main import ( "fmt" "time" "sync" ) var wg sync.WaitGroup var c chan int func f() { defer wg.Done() c = make(chan int, 1) time.Sleep(2 * time.Second) c <- 1 } func main() { wg.Add(1) go f() select { case m := <-c: // 这个c的地址和函数f() 中c的地址已经不一样了,现在监听的一直是nil fmt.Println(m) case <-time.After(10 * time.Second): fmt.Println("timed out") } wg.Wait() } ```
  • * 这篇文章也许回答了你的问题: https://studygolang.com/articles/29166
  • 评论了主题 go内存的一些问题
    * 内存块span的sizeclass指的是什么,和page的个数有关系吗 * span通过splanclass标识属于哪种规格的span,golang的span规格一共有67种,具体查看. `src/runtime/sizeclasses.go` 另外,最低位标示是否是一个noscan的span,高7位标示属于哪一种类型,创建一个SpanClass函数如下。每一个span 是跟page数量有关系的。从源码mspan `src/runtime/mheap.go`中也可以看出来 ```golang func makeSpanClass(sizeclass uint8, noscan bool) spanClass { return spanClass(sizeclass<<1) | spanClass(bool2int(noscan)) } ``` * 从内存分配的角度来说, 一个大对象是至少32K,而一个page默认的是4k 一个大对象就是至少8个page 这样对吗 * golang一个page的大小是:8KB * 一个大对象至少是page的整数倍,从`go/src/runtime/malloc.go` 中`largeAlloc` 可以看出 ```golang func largeAlloc(size uintptr, needzero bool, noscan bool) *mspan { // print("largeAlloc size=", size, "\n") if size+_PageSize < size { throw("out of memory") } //页的整数倍, size >> _PageShift 相当于除8192 npages := size >> _PageShift if size&_PageMask != 0 { npages++ } // Deduct credit for this span allocation and sweep if // necessary. mHeap_Alloc will also sweep npages, so this only // pays the debt down to npage pages. deductSweepCredit(npages*_PageSize, npages) s := mheap_.alloc(npages, makeSpanClass(0, noscan), needzero) if s == nil { throw("out of memory") } s.limit = s.base() + size heapBitsForAddr(s.base()).initSpan(s) return s } ```
  • 也许这篇文章可以给你点思路: [为什么 Go 语言没有泛型][1] [1]: https://draveness.me/whys-the-design-go-generics/