<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之旅 廣告
                現代操作系統基本都采用虛擬內存管理的方式來管理每個進程對內存的訪問,對進程采用虛擬內存的方式進行管理可以避免不同的進程訪問相同的物理內存而造成程序的紊亂。每個進程都維護獨立的一份虛擬地址,例如在32位操作系統中進程A有4GB的虛擬地址可以使用,進程B也有4GB的虛擬地址可以使用,**因此不同進程彼此之間訪問是相互隔離的。** **注意,進程中的地址稱為“邏輯地址”,也稱“虛擬地址”,需要轉化為實際的內存設備的“物理地址”才能夠使用。** :-: ![](https://img.kancloud.cn/26/bf/26bfab47c01eb77fbe9b343d4100cef2_193x424.png) 對于內存的管理一般有分段和分頁兩種方式。 &nbsp; ## 內存分段 分段式管理將進程中的內存分為不同的段,例如可以分為代碼段、數據段、棧段、堆段等,這也是最早的內存管理方式。這種方式通過**段表**結構來將虛擬內存映射成物理內存。段表中的段表項由(段號,物理段號)組成。虛擬內存的地址由(段號,偏移地址)組成。 :-: ![](https://img.kancloud.cn/1e/90/1e90c4c51b98becd72ff1a4619cbfb83_945x665.png) 【參考:小林圖解系統】 采用內存分段的方式有如下的兩個問題: 1. 容易產生內存碎片:內存分段的方式是完整的將應用程序加載進內存中,而且內存的分配還是一大段連續的,這樣就很容易造成一小塊內存一小塊內存存在的問題,這就是內存碎片。 2. 內存交換效率低:Linux系統中有一塊swap的磁盤區域就是用于當內存不夠用的時候將內存換到磁盤中,由于分段式連續且一般都是比較大的一塊空間,所以交換的效率就比較低。 &nbsp; ## 內存分頁 這是現在操作系統用得比較多的內存管理方式,將內存分為以4KB大小為單位的內存頁,這樣在內存不夠用的時候進行交換時也比較快;同時由于每頁都是比較小的連續4KB的內存空間,也不容易造成內存碎片。 內存分頁使用頁表結構來保存虛擬內存到物理內存的映射關系,通過MMU(內存管理單元)來處理這種映射關系,內存分頁的映射過程如下: :-: ![](https://img.kancloud.cn/de/1e/de1e3cab140342dfb0e4dcd9543351e6_946x684.png) 虛擬地址組成:(頁號、頁內偏移量) 頁表組成:(虛擬頁號、物理頁號) **每個進程都有單獨的一份頁表結構來保存進程內虛擬內存到物理內存的映射關系。** 現在操作系統多采用多級頁表的結構,其結構如下: :-: ![](https://img.kancloud.cn/a6/02/a60298a93632924d79e4211a392747d1_918x630.png) 由于“程序局部性原理”,可以使得每次不用生成太多的二級頁表,只需要生成加載進內存的那部分內存空間的二級頁表就行了,**注意一級頁表的范圍是要覆蓋所有物理內存的大小的。** 為了避免地址映射的時候多次讀取內存,因此在CPU內存封裝了TLB(快表)緩存結構,用來緩存最近訪問過的頁表項。 &nbsp; ## Linux的內存管理方式 由于CPU現代CPU采用分段+分頁的方式來管理內存的,Linux系統也只能跟隨的CPU來實現。但是Linux將整個物理內存都當成一個段,這樣的話就屏蔽了分段,只用到分頁來管理內存。 Linux一般將一個進程的虛擬內存分為**用戶空間與內核空間。**例如32位操作系統將虛擬內存分為1GB的內核空間和3GB的用戶空間 :-: ![](https://img.kancloud.cn/54/c2/54c2e030b7c3fcdb8c7957d19bae798b_918x372.png) 對于每個進程其3GB的用戶空間是自定義的,但是1GB的內核空間是映射到同一塊物理內存的,即內核空間是共享的。 更具體的Linux系統中進程的內存布局如下: :-: ![](https://img.kancloud.cn/2a/2d/2a2d0e8e69ef89465fe0a6057967b2bf_512x689.png) 以Java進程為例,JVM的堆結構其實是在這里的“堆”分配的一塊空間,“堆外內存”也是在這里分配的,只是堆含義的主體對象不同罷了。 &nbsp; 【參考】 《小林圖解系統》
                  <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>

                              哎呀哎呀视频在线观看