<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之旅 廣告
                [TOC] ## 程序對內存的管理 ![](https://img.kancloud.cn/49/63/49636b463e0b73fcd13b2615eb67e728_111x400.png) - 程序(進程)將內存分成一個個分隔的片段,我們叫做段( segment) - 段和段之間應該有一定的空閑內存,這樣方便各個段繼續分配內存 - 進程表中需要存放到各個段的指針,方便進程獲取各個段的數據 段和段內存隨著增長會不會碰撞?如何解決這個問題 答案:虛擬化 Why:資源稀缺的時候,就應該想到虛擬化,讓資源可以被無限抽象例如貨幣) ### 段的一種虛擬化 ![](https://img.kancloud.cn/57/54/575433b0afb9e79430dc301fb4216892_400x321.png) - Stack 段被抽象成幾個字段 - 每個段有一個段描述符然后指向 page table中的條目 ## 堆和棧 ![](https://img.kancloud.cn/36/fc/36fce87c2d7c8f392f76196f7aca910a_400x270.png) - 棧中的數據總是差不多大小 - 堆用來存放不規則的數據 堆作為一個段也是虛擬化的 ![](https://img.kancloud.cn/c7/53/c753f319ee3ec24f04fa764123acb56e_400x308.png) ## 堆中如何管理內存 - 將堆中的內存組織成一個每個node一樣大的雙向鏈表 - 每次分配從Free指針開始分配 ![](https://img.kancloud.cn/be/85/be85d707afd075dcdd93ff31cf1b71bb_400x106.png) 實際效果 ![](https://img.kancloud.cn/f7/a9/f7a941325a2f78331d9abf333a04247c_157x250.png) - 一個Bock node挨著一個 block - 每個bock取出兩個字(一個字32位4字節), 一個代表鏈表的next,一個代表鏈表的prev ## 堆的分配與回收 ### 方式一:相同大小的Block 分配1 ![](https://img.kancloud.cn/6c/b8/6cb88f6b00a8840c92289ed29410f93f_400x110.png) 分配2 ![](https://img.kancloud.cn/1d/20/1d20b821e6dd5963837c35446ce1a475_400x107.png) 分配3 ![](https://img.kancloud.cn/f9/6c/f96c882046e33b345141117cca6ac905_400x106.png) 回收1:對回收Block 進行標記 ![](https://img.kancloud.cn/16/3f/163f3ac496f12143b0857f4e672fce71_400x110.png) 回收2 ![](https://img.kancloud.cn/1d/0d/1d0ddbb310201be1ebfd7fcd309a4f6e_400x107.png) 回收3:把回收內存清空,并合并使用的Block ![](https://img.kancloud.cn/d3/10/d3108dbe58559ee7e7269aa6543821ff_400x137.png) ### 方式二:不同大小的塊 ![](https://img.kancloud.cn/f0/95/f0953963f049970d439344ad355c0642_400x356.png) 缺點: 1. 這個基于鏈表的抽象,需要提前分配很多內存 2. 如果產生跨頁,則可能會有缺頁中斷 有沒有性能更高、占用內存更少的做法? ### 方式三:類Unix 主流做法(Slot) - 當你需要1.5kb的對象,會在緩存表中記錄條目,并指向頁中提取準備好的槽 - 相同的緩存大多在一個頁表中 ![](https://img.kancloud.cn/3e/a4/3ea4878516f5e0813efdc73916100e96_400x333.png) 程序語言也用so法管理內存嗎? - 部分沒有虛擬機的語言,刨建對象是創建在 cache-slot上的。比如c的malloc就是直接分配一個合適大小的 cache - 還有一些有虛擬機的語言,有自己的內存管理 - 另一方面,程序語言不需要像操作系統一樣預留大量類型的slot等待分配(因為程序大小不一,功能不一樣
                  <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>

                              哎呀哎呀视频在线观看