<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 7.3 初始化 除去執行棧外,內存分配器是最先完成初始化的,我們先來看這個初始化的過程。 內存分配器的初始化除去一些例行的檢查之外,就是對堆的初始化了: ``` func mallocinit() { // 一些涉及內存分配器的常量的檢查,包括 // heapArenaBitmapBytes, physPageSize 等等 ... // 初始化堆 mheap_.init() _g_ := getg() _g_.m.mcache = allocmcache() // 創建初始的 arena 增長 hint if sys.PtrSize == 8 &amp;&amp; GOARCH != "wasm" { for i := 0x7f; i &gt;= 0; i-- { var p uintptr switch { case GOARCH == "arm64" &amp;&amp; GOOS == "darwin": p = uintptr(i)&lt;&lt;40 | uintptrMask&amp;(0x0013&lt;&lt;28) (...) default: p = uintptr(i)&lt;&lt;40 | uintptrMask&amp;(0x00c0&lt;&lt;32) } hint := (*arenaHint)(mheap_.arenaHintAlloc.alloc()) hint.addr = p hint.next, mheap_.arenaHints = mheap_.arenaHints, hint } } else { // 32 位機器,不關心 (...) } } ``` 堆的初始化: ``` // 堆初始化 func (h *mheap) init() { // 初始化堆中各個組件的分配器 h.treapalloc.init(unsafe.Sizeof(treapNode{}), nil, nil, &amp;memstats.other_sys) h.spanalloc.init(unsafe.Sizeof(mspan{}), recordspan, unsafe.Pointer(h), &amp;memstats.mspan_sys) h.cachealloc.init(unsafe.Sizeof(mcache{}), nil, nil, &amp;memstats.mcache_sys) h.specialfinalizeralloc.init(unsafe.Sizeof(specialfinalizer{}), nil, nil, &amp;memstats.other_sys) h.specialprofilealloc.init(unsafe.Sizeof(specialprofile{}), nil, nil, &amp;memstats.other_sys) h.arenaHintAlloc.init(unsafe.Sizeof(arenaHint{}), nil, nil, &amp;memstats.other_sys) // 不對 mspan 的分配清零,后臺掃描可以通過分配它來并發的檢查一個 span // 因此 span 的 sweepgen 在釋放和重新分配時候能存活,從而可以防止后臺掃描 // 不正確的將其從 0 進行 CAS。 // // 因為 mspan 不包含堆指針,因此它是安全的 h.spanalloc.zero = false // h-&gt;mapcache 不需要初始化 for i := range h.central { h.central[i].mcentral.init(spanClass(i)) } } ``` 在這個過程中還包含對 mcache 初始化`allocmcache()`,這個 mcache 會在`procresize`中將 mcache 轉移到 P 的門下,而并非屬于 M,這個我們在已經在[內存管理: 組件](https://golang.design/under-the-hood/zh-cn/part2runtime/ch07alloc/component)中討論過了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看