參考:
pcb(progress control block),程序控制塊。
對於乙個程序,它在被執行前其實是乙個可執行程式。這個程式是被放在磁碟上的,當它要被執行的時候,它先被載入到記憶體當中,然後再放入到暫存器中,最後再讓cpu執行該程式,這個時候乙個靜態的程式就變成了程序。
作業系統通過乙個雙向鍊錶把程序連起來。但是,對於程序其實它是乙個抽象的概念,系統肯定要通過乙個東西來描述程序,然後才能管理程序。於是pcb就出來了,作業系統通過pcb來描述程序,於是這個雙向鍊錶連線的其實是pcb,這個pcb是個什麼玩意?它就是乙個結構體,用來描述程序,在linux下,就是task_struct結構體。
每個程序執行的時候,都會拿到4g的虛擬記憶體,在32位linux下,其中3g是交給使用者的,1g是交給核心的,而task_struct就是儲存在這1g的核心系統空間中。
pcb中有什麼:
標識相關:pid,ppid等等
檔案相關:程序需要記錄開啟的檔案資訊,於是需要檔案描述符表
優先順序相關:程序相對於其他程序的排程優先順序
上下文資訊相關:cpu的所有暫存器中的值、程序的狀態以及堆疊上的內容,當核心需要切換到另乙個程序時,需要儲存當前程序的所有狀態,即儲存當前程序的程序上下文,以便再次執行該程序時,能夠恢復切換時的狀態,繼續執行。
狀態相關:程序當前的狀態,說明該程序處於什麼狀態
訊號相關:程序的訊號處理函式,以及記錄當前程序是否還有待處理的訊號
i/o相關:記錄程序與各種i/o裝置之間的互動
概念:1.每個程序都有自己獨立的4g(32位系統下)記憶體空間,各個程序的記憶體空間具有類似的結構(64位是16eb,理論上。。。)
2.乙個新程序建立的時候,將會建立起自己的記憶體空間,此程序的資料,**等從磁碟拷貝到自己的程序空間,哪些資料在**,都由程序控制表中的task_struct記錄,task_struct中記錄中一條鍊錶,記錄中記憶體空間的分配情況,哪些位址有資料,哪些位址無資料,哪些可讀,哪些可寫,都可以通過這個鍊錶記錄
3.每個程序已經分配的記憶體空間,都與對應的磁碟空間對映
程序得到的這4g虛擬記憶體是乙個連續的位址空間(這也只是程序認為),而實際上,它通常是被分隔成多個物理記憶體碎片,還有一部分儲存在外部磁碟儲存器上,在需要時進行資料交換。
程序開始要訪問乙個位址,它可能會經歷下面的過程
每次我要訪問位址空間上的某乙個位址,都需要把位址翻譯為實際物理記憶體位址
所有程序共享這整一塊物理記憶體,每個程序只把自己目前需要的虛擬位址空間對映到物理記憶體上
程序需要知道哪些位址空間上的資料在物理記憶體上,哪些不在(可能這部分儲存在磁碟上),還有在物理記憶體上的**,這就需要通過頁表來記錄
頁表的每乙個表項分兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的位址(如果在的話)
當程序訪問某個虛擬位址的時候,就會先去看頁表,如果發現對應的資料不在物理記憶體上,就會發生缺頁異常
缺頁異常的處理過程,作業系統立即阻塞該程序,並將硬碟裡對應的頁換入記憶體,然後使該程序就緒,如果記憶體已經滿了,沒有空地方了,那就找乙個頁覆蓋,至於具體覆蓋的哪個頁,就需要看作業系統的頁面置換演算法是怎麼設計的了。
頁表的工作原理:
windows的虛擬記憶體是windows目錄下的乙個"win386.swp"檔案,這個檔案會不斷地擴大和自動縮小,拿出一部分硬碟空間來充當記憶體使用。
物理記憶體和虛擬記憶體
1.物理記憶體和虛擬記憶體 直接從物理記憶體讀取資料比從硬碟讀寫資料要快得多,因此,我們希望所有的資料的讀寫在記憶體中完成,但是記憶體是有限的,這樣就引出了物理記憶體與虛擬記憶體的概念。物理記憶體是系統硬體提供的記憶體大小,是真正的記憶體。虛擬記憶體是為了滿足物理記憶體不足而提出的策略,利用磁碟空間...
虛擬記憶體和物理記憶體
虛擬記憶體 物理記憶體 物理記憶體,在應用中,物理上,真實的插在板子上的記憶體是多大就是多大了。而在cpu中的概念,物理記憶體就是cpu的位址線可以直接進行定址的記憶體空間大小。比如8086只有20根位址線,那麼它的定址空間就是1mb,我們就說8086能支援1mb的物理記憶體,及時我們安裝了128m...
物理記憶體和虛擬記憶體
1 概念 物理記憶體 真實的硬體裝置 記憶體條 虛擬記憶體 利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間 swap space 為了滿足物理記憶體的不足而提出的策略 2.使用的順序 linux會在物理記憶體不足時,使用交換分割槽的虛擬記憶體。核心會將暫時不用的記憶體塊資...