接著回到c語言程式,寫了乙個main.cpp 經過編譯後生成乙個obj檔案,鏈結形成exe檔案,最後執行exe檔案,把程式裝入記憶體中。那麼編譯、鏈結和裝入是啥?
由編譯程式將使用者源**編譯成若干個目標模組。
由鏈結程式將編譯後形成的目標檔案,以及所需的庫函式鏈結在一起,形成乙個完整的裝入模組。
鏈結有三種方式:
由裝入程式將裝入模組裝入記憶體中執行。
裝入有三種方式:
絕對裝入:絕對裝入只適合單道程式環境。在編譯時,如果知道程式將駐留在記憶體的某個位置,編譯程式將產生絕對位址的目標**。絕對裝入程式按照裝入模組中的位址,將程式和資料裝入記憶體。由於邏輯位址和實際位址完全相同,不需要進行位址轉換。
靜態重定位:先將邏輯位址轉換成實體地址,這種位址變換是在裝入是一次完成,所以叫靜態重定位。特點是在乙個作業裝入記憶體時,必須分配要求的全部記憶體空間,如果記憶體不夠用,就裝入失敗。作業一旦進入記憶體,整個執行期間不能在記憶體中移動,也不能在申請記憶體空間。
動態重定位:程式如果要在記憶體中移動,就採用動態重定位的方式。裝入程式把裝入模組裝入記憶體後,不立即把邏輯位址轉換成實體地址,等到程式執行的時候才轉換。這種方式需要重定位暫存器這種硬體的幫助。特點是可以將程式分配到不連續的儲存區域中;在程式執行之前可以只裝入部分**執行,然後程式執行期間,動態申請分配記憶體。
實體地址都懂,記憶體條是乙個線性結構,4g的,8g的,16g的,乙個位元組乙個位元組存,有n個連續的儲存單元,這些儲存單元的編號就是實體地址,也就是c語言中指標的意義,int a = 20;a在記憶體中實際佔據了四個位元組,首位址是100000,那麼int *p = &a,則p的值就是100000,當然p也在記憶體中,位址都是作業系統分配的。
邏輯位址又是啥?你寫了一串**,寫了50行,也就是從0-49行,作業系統分配記憶體的時候也是從第0行開始存,這個0就是邏輯位址。邏輯位址是對程式設計師來說的,這個0對應到記憶體條的哪個實體地址,是作業系統決定的,程式設計師不知道。
當前程式裝入到記憶體,執行發現記憶體不夠怎麼辦?如果拋開虛擬記憶體的話,有如下兩種假裝擴充記憶體的方式。
必要的**和資料常駐記憶體,不常用的模組放外村,需要時放記憶體,不存在呼叫關係的模組不必同時載入記憶體,可以相互覆蓋,共用乙個分割槽。
例子:a,b,c,d,e這5個函式占用空間及呼叫關係如左圖,如b,c之間不會相互呼叫因此可以共用乙個分割槽。
還可以a佔乙個分割槽20 k,b,e,f共用乙個分割槽50k,c,d用乙個:30k,總共只用100k。
可將暫時不能執行的程式(處於等待狀態下的程式或者被cpu剝奪執行權利的程式)送到外存以獲得空閒記憶體空間,作業系統在記憶體管理單元mmu幫助下把乙個程序的整個位址空間的內容儲存到外存中(換出swap out),而將外存中的某個程序的位址空間讀入到記憶體中(換入swap in)。
覆蓋和對換的比較:交換主要用在不同程序或作業之間進行;覆蓋用於同一程序或程式中 ;覆蓋是發生在乙個執行中的程式內部沒有呼叫關係的模組之間,代價是程式設計師手動指定和劃分邏輯覆蓋結構;交換是記憶體中程式與管理程式或os之間發生的,以程序作為交換的單位,需要把程序的整個位址空間都換進換出,對程式設計師是透明的,開銷相對較大。
既然分配記憶體是作業系統分配的,那它是咋分配的?連續分配一段空間還是隨機分的?按照是否連續分配有如下兩種方式
連續分配方式,就是給乙個程式分配乙個連續的記憶體空間,主要包括單一連續分配、固定分割槽分配和動態分割槽分配。
在單使用者單任務作業系統中,把記憶體分為使用者區和系統區,系統區僅給作業系統使用,剩下的都給使用者使用,由於是單使用者單任務,剩下的只能存放乙個程式,比如記憶體總共20m,作業系統佔了8m,剩下12m,只能分配給乙個程式,如果這個程式需要10m,小於12m,那麼還剩下2m,這2m空間就交內部碎片,已經分配給其他程序/程式了,但是這空間不能被利用。
多道程式中,還是將記憶體分成使用者區和系統區,只是吧使用者區分成以乙個乙個區域(區域可以相等,也可以不相等),比如20m的記憶體,作業系統佔了8m,還剩12m,我把這12m平均分成兩個區域,乙個區域6m,我有兩個程式,乙個需要5m,乙個需要6m,6m的程式恰好能放進去,5m的放進去之後還會有1m空餘,也是內部碎片。
在這種分配方式下,需要用分割槽說明表來記錄哪個分割槽空間多大,是否已經分配了。
這種分割槽方法不事先劃分區域大小,而是程序裝入記憶體中,根據程序大小動態建立分割槽,程序執行完了再釋放。如下圖所示:
系統有64m記憶體,其中低8m是作業系統,其餘可以分配給使用者。開始裝入三個程序,在他們分別分配到所需空間後,記憶體只剩下4m,程序四無法裝入。在某個時刻,記憶體中沒有乙個就緒程序,cpu出現空閒,作業系統就換出程序2,換入程序4。由於程序4比程序2小,這樣記憶體就產生了乙個6m的記憶體空間,之後cpu又出現了空閒,但記憶體無法容納記憶體2,作業系統就換出程序1,換入程序2。
動態分割槽一開始是好的,但是後來會出現很多小的記憶體塊,這些小記憶體塊沒有分配給其他程序,這些都是外部碎片。可以通過緊湊的方式來解決,就是作業系統對程序進行移動和整理,使這些外部碎片放到一塊,供使用者使用,但這需要動態重定位暫存器支援。
上面說到,在程序被換入或換出時,如果記憶體中有多個足夠大的空閒塊,作業系統必須分配乙個記憶體塊給程序使用,這種分配策略有如下四種:
最佳適應演算法:按照空閒分割槽容量遞增的順序,找到第乙個能滿足的分割槽。
最壞適應演算法:按照空閒分割槽容量遞減的順序,找到第乙個能滿足的分割槽,也就是找到最大的分割槽。
作業道數
內部碎片
外部碎片
硬體支援
單一連續分配1有
無界位址暫存器、越界檢查機構
固定連續分配
<=n有無
上下界位址暫存器,越界檢查機構;基位址暫存器、長度暫存器、動態位址轉換機構
可變連續分配無有
上面三種不管怎樣,這個程序或程式都是連續分配空間的。非連續分配允許乙個程式分散的裝入到不相鄰的記憶體分割槽中,根據分割槽的大小是否固定分為分頁儲存管理方式和分段儲存管理方式。
分頁,很抽象。舉個例子,一本書,有200頁,一頁只能寫30行。那麼表達一句話或者乙個短語在這本書的哪個位置,就得知道第幾頁,也要知道在當前頁的第幾行(當然了,如果更具體,就得知道在這行的第幾個字開始)。
分頁儲存管理就是根據這個來的,把記憶體平均分成很多很多塊,每一塊足夠小,而且程序或程式也要按照這樣進行劃分,程序執行時按塊申請記憶體並執行。這樣程序只會在為最後乙個不完整的塊申請乙個主存空間時,才會產生內部碎片,而且這個內部碎片很小,平均只有半個塊大小。
那麼對於程式來說,一塊也是好幾行**,分頁是按照塊來進行了,乙個塊對應記憶體中的一頁,那麼這塊中第幾行**在這個頁中的什麼位置呢?這就是頁內偏移量(這個短語在當前頁的第幾行)。
如果位址長度為32bit,一頁是4kb,即2的12次方位元組,所以0-11位為頁內偏移量,12-31位為頁號,位址空間允許2的20次方頁。
因為乙個塊對應記憶體中的乙個頁,那麼必然需要儲存塊和頁的關係,這個表叫頁表,頁表在記憶體中。
所以要訪問記憶體時,訪問乙個資料或一條指令要訪問兩次記憶體:第一次是訪問頁表,確定所訪問的資料或指令的實體地址;第二次才根據該位址訪問資料或指令。
為此,可以在cache中增加乙個快表,快表用來幹嘛?快表存的東西就是頁表的子集,那麼哪些項要放到快表中呢?當然是頁表中經常訪問的那些項了。
引入快表之後,訪問資料就先從cache中看,有沒有(有的話表明快表命中了),有的話根據快表找到實體地址,根據實體地址找;如果沒找到,那麼去記憶體訪問頁表,因為頁表中肯定有,再從頁表中找到實體地址,根據實體地址找。
分頁管理方式是從計算機的角度考慮的,提高記憶體的利用率,提公升計算機效能,且分頁是通過硬體實現,對使用者完全透明;分段方式是考慮了使用者和程式設計師,方便程式設計、資訊保護和共享等需要。
只是段表和頁表不太一樣了,因為每一頁都是一樣大小的,而段長不相同,因此,段表有三列:段號、段長、本段在記憶體初始位址。
同理,段表也在記憶體中,所以分段儲存管理,訪問資料仍然要訪問兩次記憶體,一次是訪問段表,另一次根據實體地址訪問記憶體訪問資料。
如果把分頁和分段結合起來,就形成了段頁式管理方式。
段頁式管理方式,就是先把程式分段,然後每一段進行分頁,所以為了實現邏輯位址轉換到實體地址,需要乙個段表,每個段有乙個頁表。段表表項中至少包含段號、段長、頁表起始位址;頁表表項至少包含頁號和塊號。
作業系統 儲存器管理(1)
1.快取記憶體和磁碟快取 快取記憶體是現代計算機結構中的乙個重要部件,它是介於暫存器和儲存器之間的儲存器。主要用於備份主存中較常用的資料,以減少處理機對主儲存器的訪問次數,可以大幅度提高程式執行速度。磁碟快取本身是利用主存中的部分儲存空間,暫時存放從磁碟中讀出 或寫入 的資訊。由於磁碟的i 0速度遠...
作業系統筆記 儲存管理(1)
絕對裝入方式 可重定位裝入方式 動態執行時裝入方式 程式的鏈結 記憶體連續分配 分割槽 演算法 碎片 問題 可重定位分割槽分配 邏輯位址 相對位址,虛位址 使用者程式經過彙編或編譯後形成目標 目標 採用相對位址形式 首位址為0 其餘指令中位址以相對於首位址的偏移為位址 實體地址 絕對位址,實位址 記...
作業系統儲存管理
分段單元 分頁單元 邏輯位址 段基址 32位偏移量 線性位址 虛擬位址,0 4gb 實體地址 6個段暫存器 cs code段 ss stack段 ds data段 es fs gs 通用段暫存器 16位的段選擇符就存放在以上段暫存器中 線性位址 4gb 被分成以固定長度為單位的組,即頁。頁內部連續的...