每個程序都有自己的虛擬位址空間。當程序中的各執行緒執行時,它們只能訪問屬於該程序的記憶體。
1、空指標賦值分割槽
這一分割槽是程序位址空間中從0x00000000到0x0000ffff的閉區間,保留該分割槽的目的是為了幫助程式設計師捕獲空指標的值。如果程序中的執行緒試圖讀取或寫入位於這一分區內的記憶體位址,就會引發訪問違規。
2、使用者模式分割槽
這一分割槽是程序位址空間的駐地。可用的位址區間和使用者模式分割槽的大小取決於cpu體系結構。從0x00010000開始。程序無法通過指標來讀取、寫入或以任何方式,訪問駐留在這一分割槽中其他程序的資料。
3、核心模式分割槽
這一分割槽是作業系統**的駐地。與執行緒排程、記憶體管理、檔案系統支援、網路支援以及裝置驅動程式相關的**都載入到該分割槽。駐留在這乙個分區內的任何東西為所有程序共有。雖然這一分割槽就在每個程序中使用者模式分割槽的上方,但該分割槽中所有**和資料都被完全保護起來。如果乙個應用程式試圖讀取或寫入位於這一分割槽中的記憶體位址、會引發違規。
當系統建立乙個程序並賦予它位址空間時,可用位址空間中的大部分都是閒置(free)或尚未分配的(unallocated)。為了呼叫這部分位址空間,我們必須呼叫virutalalloc來分配其中的區域(region)。分配區域的操作成為預訂(reserving)。
當應用程式預定位址空間中的一塊區域時,系統會確保區域的大小正好是系統頁面大小的整數倍。
當程式不再需要訪問所預訂的位址空間區域時,應該釋放該區域。這個過程被稱為釋放位址空間區域,通過呼叫virtualfree函式來完成。
為了使用所預訂的位址空間區域,我們還必須分配物理儲存器,並將儲存器對映到所預訂的區域。這個過程被稱為調撥物理儲存器。
當我們調撥物理儲存器給區域時,並不需要給整個區域都調撥物理儲存器。
磁碟上的檔案被稱為頁交換檔案,其中包含虛擬記憶體,可供任何程序使用。
當乙個執行緒試圖訪問所屬程序的位址空間中的一塊資料,有兩種情況:
1.執行緒要訪問的資料就在記憶體中
2.執行緒要訪問的資料不在記憶體中,而是位於頁交換檔案中的某處。
當使用者要求執行乙個應用程式時,系統會開啟該應用程式對應的.exe檔案並計算出應用程式的**和資料的大小。然後系統會預訂一塊位址空間,並註明該區域相關聯的物理儲存器時.exe檔案本身。也就是將.exe檔案的實際內容(或檔案映像,即file image)用作程式預訂的位址空間區域。
當把乙個程式位於硬碟上的檔案映像(即乙個.exe或dll檔案)用作位址空間區域對應的物理儲存器時,我們稱這個檔案映像為記憶體對映檔案。
我們可以給每個已分配的物理儲存頁指定不同的頁面保護屬性。
第13章 Posix共享記憶體區
原始碼目錄 include include for mode constants include for o constants intshm open const char name,int oflag,mode t mode int shm unlink const char name link...
第13章 演算法
一 字串反轉 void char reverse char cha 呼叫 如下 char ch hello,world char reverse ch 二 鍊錶反轉 返回反轉後的煉表頭結點 return newh 三 有序陣列合併 將有序陣列a和b的值合併到乙個陣列result當中,且仍然保持有序 ...
第13章 物件導向程式設計 13
13.13.3 迭代器 randseq和anyiter 1.randseq from random import choice class randseq object def init self,seq self.data seq def iter self return self def nex...