文章編號:10528時間:2024-09-28人氣:
首先,“映射”這個詞,就和數學課上說的“一一映射”是一個意思,就是建立一種一一對應關系,在這里主要是只硬盤上文件的位置與進程邏輯地址空間中一塊大小相同的區域之間的一一對應,如圖1中過程1所示。 這種對應關系純屬是邏輯上的概念,物理上是不存在的,原因是進程的邏輯地址空間本身就是不存在的。 在內存映射的過程中,并沒有實際的數據拷貝,文件沒有被載入內存,只是邏輯上被放入了內存,具體到代碼,就是建立并初始化了相關的數據結構(struct address_space),這個過程有系統調用mmap()實現,所以建立內存映射的效率很高。 既然建立內存映射沒有進行實際的數據拷貝,那么進程又怎么能最終直接通過內存操作訪問到硬盤上的文件呢?那就要看內存映射之后的幾個相關的過程了。 mmap()會返回一個指針ptr,它指向進程邏輯地址空間中的一個地址,這樣以后,進程無需再調用read或write對文件進行讀寫,而只需要通過ptr就能夠操作文件。 但是ptr所指向的是一個邏輯地址,要操作其中的數據,必須通過MMU將邏輯地址轉換成物理地址,如圖1中過程2所示。 這個過程與內存映射無關。 前面講過,建立內存映射并沒有實際拷貝數據,這時,MMU在地址映射表中是無法找到與ptr相對應的物理地址的,也就是MMU失敗,將產生一個缺頁中斷,缺頁中斷的中斷響應函數會在swap中尋找相對應的頁面,如果找不到(也就是該文件從來沒有被讀入內存的情況),則會通過mmap()建立的映射關系,從硬盤上將文件讀取到物理內存中,如圖1中過程3所示。 這個過程與內存映射無關。 如果在拷貝數據時,發現物理內存不夠用,則會通過虛擬內存機制(swap)將暫時不用的物理頁面交換到硬盤上,如圖1中過程4所示。 這個過程也與內存映射無關。 mmap的強大之處在于,它可以根據參數配置,用于創建共享內存,從而提高文件映射區域的IO效率,實現IO零拷貝,后面講下零拷貝的技術,對比下,決定這些功能的主要就是三個參數,下面一一解釋prot四種情況如下:flags比較有代表性的如下:fd當參數fd不等于0時,內存映射將與文件進行關聯,如果等于0,就會變成匿名映射,此時flags必為MAP_ANONYMOUS一個mmap竟有如此豐富的功能,從申請分配內存到加載動態庫,再到進程間通信,真的是無所不能,強大到讓人五體投地。 下面就著四種情況,拿一個我最關心的父子進程通信來舉例看下,實現一個簡單的父子進程通信邏輯,畢竟我們學習的目的就是為了應用,光有理論怎么能稱之為合格的博客呢?父子進程共享內存運行后打印如下用mmap創建了一塊匿名共享內存區域,fd傳入-1和MAP_ANONYMOUS配置實現匿名映射,使用MAP_SHARED創建共享區域,使用fork函數創建子進程,這樣來實現子進程通信,通過sprintf將格式化后的數據寫入到共享內存中。 通過簡單的幾行代碼就實現了跨進程通信,如此簡單,這么強大的東西,背后有什么支撐么?帶著問題我們接著一探究竟。 MMAP背后的保護神說到MMAP的保護神,首頁了解下內存頁:在頁式虛擬存儲器中,會在虛擬存儲空間和物理主存空間都分割為一個個固定大小的頁,為線程分配內存也是以頁為單位。 比如:頁的大小為4K,那么4GB存儲空間就需要4GB/4KB=1M條記錄,即有100多萬個4KB的頁,內存頁中,當用戶發生文件讀寫時,內核會申請一個內存頁與文件進行讀寫操作,如圖:這時如果內存頁中沒有數據,就會發生一種中斷機制,它就叫缺頁中斷,此中斷就是MMAP的保護神,為什么這么說呢?我們知道mmap函數調用后,在分配時只是建立了進程虛擬地址空間,并沒有分配虛擬內存對應的物理內存,當訪問這些沒有建立映射關系的虛擬內存時,CPU加載指令發現代碼段是缺失的,就觸發了缺頁中斷,中斷后,內核通過檢查虛擬地址的所在區域,發現存在內存映射,就可以通過虛擬內存地址計算文件偏移,定位到內存所缺的頁對應的文件的頁,由內核啟動磁盤IO,將對應的頁從磁盤加載到內存中。 最終保護mmap能順利進行,無私奉獻。 了解完缺頁中斷,我們再來細聊下mmap四種場景下的內存分配原理四種場景分配原理上面是一個簡單的原理總結,并沒有詳細的展開,感興趣可以自己查查資料哈。 以上就是Android開發中技術,非常重要的mmap原理解析,更多Android高級進階技術;可以參考《Android核心技術手冊》里面內容包含30幾個模塊。 本次分享,主要介紹了mmap的四種應用場景,通過一個實例驗證了父子進程間的通信,并深入mmap找到它的保護神,且深入了解到mmap在四種場景下,操作系統是如何組織分配,通過對這些的了解,在你之后的mmap實戰應用有了更好的理論基礎,可以根據不同的需求,不同的性能要求等,選擇最合適的實現。
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://www.hudongshop.com/article/bfe99fb0683a85d39673.html,復制請保留版權鏈接!
getline函數在C,中用于從輸入流中讀取一行文本,雖然看似簡單,但如果不加注意,它可能會帶來意想不到的錯誤和效率問題,本文將深入探討getline函數的常見陷阱,并提供解決這些陷阱的有效策略,從而幫助您避免錯誤并確保高效,陷阱1,未初始化變量在使用getline之前,必須確保用于存儲輸入行的變量已被初始化,未初始化的變量可能包含...。
技術教程 2024-09-29 00:56:57
在數據管理中,去重是至關重要的,它可以幫助我們消除重復的數據,確保數據一致性和準確性,SQLDISTINCT運算符是一個強大的工具,它允許我們從查詢結果中提取唯一值,通過巧妙運用SQLDISTINCT,我們可以優化數據管理,提高效率和可靠性,理解SQLDISTINCTSQLDISTINCT運算符用于從查詢結果中刪除重復的行,只返回唯一...。
技術教程 2024-09-23 18:28:20
前言在數據科學領域,數據處理效率和靈活性至關重要,Shiftdim是一個功能強大的NumPy工具,可以大大提高這些方面的表現,本文將深入探討Shiftdim在數據科學中的各種應用,重點介紹其如何增強數據處理效率和靈活性,什么是Shiftdim,Shiftdim是一個用于更改NumPy數組維度形狀的函數,它通過沿著指定軸移動維度來操作數...。
互聯網資訊 2024-09-23 18:04:24
HTML,網頁設計的骨架HTML,超文本標記語言,是網頁設計的骨架,它提供結構、語義和內容,HTML元素定義網頁的不同部分,如標題、段落、列表和鏈接,它允許開發者創建網頁的基本布局和組織信息,例如,以下HTML代碼定義了一個擁有標題和段落的簡單網頁,<,html>,<,head>,<,title>,我的第一個網...。
最新資訊 2024-09-15 00:31:55
u003cp>,周期函數在生物學中用于描述生物節律,即生物體中規律性重復的生理和行為模式,例如,晝夜節律描述了生物體對晝夜循環的適應性反應,周期函數可用于研究睡眠,覺醒周期、激素分泌和生理功能的其他方面,種群生態學周期函數在種群生態學中用于描述種群數量隨時間的變化,例如,種群增長方程描述了種群數量如何因出生、死亡和遷移而變化,周期...。
最新資訊 2024-09-13 12:19:19
Java程序無法運行,答,請檢查你的Java代碼是否有語法錯誤,或者確認你已導入必要的包,問,微信版Java軟件支持哪些Java版本,答,目前支持Java8和Java11,問,微信版Java軟件是否可以訪問本地文件,答,不可以,微信版Java軟件只能訪問微信小程序中提供的文件,結語微信版Java軟件為微信用戶提供了在微信中運行Java...。
互聯網資訊 2024-09-13 10:59:30
隨機數在計算機科學中無處不在,從模擬到游戲再到加密,在Java中,有兩種主要的方法來生成隨機數,偽隨機數生成器,PRNG,和真隨機數生成器,TRNG,偽隨機數生成器,PRNG,偽隨機數生成器使用確定性算法生成一個看起來隨機的數序列,盡管這些數字實際上并不隨機,但它們足夠好,可以在大多數情況下使用,Java中的標準PRNG類是java...。
技術教程 2024-09-12 22:48:09
引言天氣預報在我們的日常生活中扮演著至關重要的角色,它可以幫助我們規劃出行、做出明智的決策,并從環境變化中獲得洞察力,隨著天氣預報技術的不斷進步,我們現在可以準確地獲取天氣信息,并利用這些信息來優化決策,利用天氣預報代碼購買航班延誤險判決結果例如,利用天氣預報代碼購買航班延誤險就是一種將天氣信息應用于決策的典型案例,根據一項判決結果,...。
本站公告 2024-09-10 09:33:16
引言隨著海量數據的激增和分析需求的不斷增長,企業需要在數據管理中融入先進技術以保持競爭力,Oracle數據庫管理系統,DBMS,已通過集成人工智能,AI,和機器學習,ML,技術來滿足這一需求,為數據管理創新開辟了新的可能性,AI和ML在OracleDBMS中的優勢將AI和ML集成到OracleDBMS帶來了以下優勢,自動化任務,AI和...。
最新資訊 2024-09-09 15:09:36
歡迎來到編程網站的權威指南,在這個指南中,我們將探索編程世界中一些最重要的門戶,以及它們如何幫助您開始或提升您的編程之旅,StackOverflowStackOverflow是一個著名的問答網站,專注于編程和軟件開發,它擁有一個由經驗豐富的程序員組成的龐大社區,他們樂于提供幫助和分享知識,優點,龐大的用戶社區高質量的答案活躍的討論缺點...。
技術教程 2024-09-07 09:56:38
前言scanf函數是C語言中一個強大的輸入函數,它允許程序員從用戶那里讀取數據,掌握scanf函數的進階技巧對于提高代碼效率和準確性至關重要,指定格式字符串scanf函數的第一個參數是格式字符串,它指定要讀取數據的類型和格式,可以使用以下格式說明符,%c,字符%d,十進制整數%f,浮點數%s,字符串例如,要讀取一個字符和一個整數,可以...。
最新資訊 2024-09-07 02:23:23
您是否在尋找一種能讓您的網站訪客捧腹大笑的方法,有了我們的笑聲引擎,您現在就可以做到!我們的笑話網站源碼包含了數千個笑話,涵蓋各種主題,從經典的一句到腦筋急轉彎,應有盡有,安裝和使用笑聲引擎非常簡單,只需下載源碼并將其上傳到您的網站,您可以使用簡單易用的代碼片段將笑話添加到您的頁面,您可以選擇隨機顯示笑話,也可以創建一個自定義笑話庫,...。
互聯網資訊 2024-09-05 19:18:50