0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分頁方式中可以每個進程分配一個頁表嗎

麥辣雞腿堡 ? 來源:程序猿阿星 ? 作者:程序猿阿星 ? 2023-10-09 17:06 ? 次閱讀

在分頁方式下,每個進程分配一個頁表會有什么問題?

不賣關子了,每個進程分配一個頁表會有空間上的缺陷,因為操作系統(tǒng)上可以運行非常多的進程,那不就意味著頁表數(shù)量非常多!

1B(Byte 字節(jié))=8bit, 1KB (Kilobyte 千字節(jié))=1024B, 1MB (Megabyte 兆字節(jié)簡稱“兆”)=1024KB, 1GB (Gigabyte 吉字節(jié) 又稱“千兆”)=1024MB

以32 位的環(huán)境為例,虛擬地址空間范圍共有 4GB,假設一個頁的大小是 4KB(2^12),那么就需要大約 100 萬 (2^20)個頁,每個「頁表項」需要 4 個字節(jié)大小來存儲,那么整個 4GB 空間范圍的映射就要有 4MB 的內存來存儲頁表。

4MB看起來不大,但是數(shù)量上來了就很恐怖了,假設 100 個進程的話,就需要 400MB 的內存來存儲頁表,這是非常大的內存了,更別說 64位的環(huán)境了。

為了解決空間上的問題,在對分頁方式的基礎上,進行優(yōu)化,出現(xiàn)了多級頁表方式

多級頁表

在前面我們知道了,分頁方式在32位環(huán)境下,以每頁4KB來計算,一共有100萬頁,「頁表項」需要 4
個字節(jié)大小來存儲,一個頁表包含100萬個「頁表項」,那么每個進程的頁表需要占用4MB大小,多級頁表要如何解決這種問題呢?

在頁表的基礎上做一次二級分頁,把100萬「頁表項」分為一級頁表「1024個頁表項」,「一級頁表項」下又關聯(lián)二級頁表「1024個頁表項」,這樣一級頁表的1024個頁表項就覆蓋到了4GB的空間范圍映射,并且二級頁表按需加載,這樣頁表占用的空間就大大降低。

做個簡單的計算,假設只有 20% 的一級頁表項被用到了,那么頁表占用的內存空間就只有 4KB(一級頁表) + 20% * 4MB(二級頁表)=0.804MB,這對比單級頁表的 4MB 是不是一個巨大的節(jié)約?

圖片

接著思考,在二級的基礎上是不是又可以繼續(xù)分級呢,能分二級,必然也能分三級、四級,在64位操作系統(tǒng)是做了四級分頁,分為了四個目錄,分別是

全局頁目錄項

上層頁目錄項

中間頁目錄項

頁表項

圖片

TBL

多級頁表雖然解決了空間上的問題,但是我們發(fā)現(xiàn)這種方式需要走多道轉換才能找到映射的物理內存地址,經(jīng)過的多道轉換造成了時間上的開銷。

程序是局部性的,即在一段時間內,整個程序的執(zhí)行僅限于程序的某一部分。相應的,執(zhí)行所訪問的存儲空間也局限于某個內存區(qū)域。

操作系統(tǒng)就利用這一特性,把最多使用的幾個頁表項放到TBL緩存, CPU 在尋址時,會先查 TLB,如果沒找到,才會繼續(xù)查常規(guī)的頁表,TLB的命中率其實很高的,因為程序最常訪問的頁就那么幾個。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    3025

    瀏覽量

    74060
  • 操作系統(tǒng)

    關注

    37

    文章

    6827

    瀏覽量

    123335
收藏 人收藏

    評論

    相關推薦

    初學者Linux操作系統(tǒng)的基本結構

    的段后與偏移值進行求和.這個地址(在分頁機制開啟的前提下),會表示頁面,通過尋找到的
    發(fā)表于 10-01 19:16

    嵌入式Linux內存管理的些知識點總結

    到硬盤,從硬盤上加載被請求的內存, 然后再重新啟動您的進程。這樣,每個進程都獲得了自己可以使用的地址空間,
    發(fā)表于 11-20 14:46

    嵌入式Linux內存管理的些知識點總結

    轉存到硬盤,從硬盤上加載被請求的內存, 然后再重新啟動您的進程。這樣,每個進程都獲得了自己可以使用的地址空間,
    發(fā)表于 03-24 09:31

    頁面與地址變換結構

    進行標號,從0#開始。在為進程分配內存空間時,以為單位,每個內存的塊存放一頁用戶作業(yè)。只要內
    發(fā)表于 08-02 06:14

    Pads Logic 分頁符號圖編號顯示問題

    請教各位大師Pads Logic VX2.6的問題,分頁符號如果打開圖編號,有時候就疊在起了,如圖所示,很難看,這個能設置嗎? 謝謝
    發(fā)表于 07-08 11:08

    淺談對計算機系統(tǒng)內存尋址的理解

    轉換前地址的話,那么線性地址則對應了硬件式內存的轉換前地址。用分頁方法來分配和管理實存。即把整個主存分成大小相等的存儲塊,可裝入作業(yè)的任何一頁。這樣
    發(fā)表于 08-22 08:00

    Linux內存系統(tǒng): Linux 內存分配算法

    分配出去(不屬于任何進程),但由于太小了無法分配給申請內存空間的新進程的內存空閑區(qū)域3) 組織結構· 把所有的空閑分組為 11
    發(fā)表于 08-24 07:44

    Linux內存系統(tǒng)---走進Linux 內存

    每個進程都有完全屬于自己的,獨立的,不***擾的內存空間;用戶態(tài)的程序就不能隨意操作內核地址空間,具有定的安全保護作用;內核態(tài)線程共享內核地址空間; 3、內存地址——MMU 地址轉換· MMU
    發(fā)表于 08-26 08:05

    鴻蒙內核源碼分析(內存分配篇):內存的分配方式有哪些

    解決物理內存滿足不了多進程對內存的需要。虛擬內存可以遠大于物理內存。虛擬空間是進程層面的概念,每個進程都有
    發(fā)表于 11-20 10:07

    鴻蒙內核源碼分析(內存分配篇):內存的分配方式有哪些

    (); } else {return NULL; }}代碼可以看出初始化對物理內存做了幾個動作:1.對整個物理內存進行了分頁,每頁框4K,存放在大
    發(fā)表于 11-20 17:34

    WCDMA系統(tǒng)物理信道的功率分配方式

    WCDMA系統(tǒng)物理信道的功率分配方式 如下圖所述,每個信道在調制前都有系數(shù)對它進行功率大小控制。
    發(fā)表于 06-15 12:35 ?2127次閱讀

    操作系統(tǒng)的分頁存儲基本概念

    非連續(xù)分配允許程序分散地裝入到不相鄰的內存分區(qū),根據(jù)分區(qū)的大小是否固定分為分頁存儲管理方式
    的頭像 發(fā)表于 03-15 16:36 ?4779次閱讀

    由于MySQL分頁導致的線上事故

    其實對于我們的 MySQL 查詢語句來說,整體效率還是可以的,該有的聯(lián)查詢優(yōu)化都有,該簡略的查詢內容也有,關鍵條件字段和排序字段該有的索引也都在,問題在于他一頁一頁
    的頭像 發(fā)表于 05-10 15:31 ?794次閱讀

    MMU多級映射過程

    物理頁面大小級地址總線寬度不同,的級數(shù)也不同。以AArch64運行狀態(tài),4KB大小物理頁面,48位地址寬度為例,映射的查詢過程如圖
    的頭像 發(fā)表于 11-26 16:28 ?965次閱讀
    MMU多級<b class='flag-5'>頁</b><b class='flag-5'>表</b>映射過程

    mybatis邏輯分頁和物理分頁的區(qū)別

    MyBatis是開源的Java持久層框架,它與其他ORM(對象關系映射)框架相比,具有更加靈活和高性能的特點。MyBatis提供了兩種分頁方式,即邏輯
    的頭像 發(fā)表于 12-03 14:54 ?917次閱讀