1、邏輯分段與內存分段
- 段是用戶編制的程序可以由一個主程序、若干個子程序、符號表、棧以及數據等若干段組成,每一段都有獨立、完整的邏輯意義,每一個段的長度可以不同
- 邏輯分段
- 程序通過分段(segmentation)划分為多個模塊,每個段定義一組邏輯信息。如代碼段(主程序段main,子程序段X)、數據段D、棧段S等。
- 每段有自己的名字(一般用段號做名),都從0編址,可分別編寫和編譯。
- 裝入內存時,每段賦予各段一個段號。
- 段是用戶編制的程序可以由一個主程序、若干個子程序、符號表、棧以及數據等若干段組成,每一段都有獨立、完整的邏輯意義,每一個段的長度可以不同
- 地址結構:段號 + 段內地址。 段表:記錄每段實際存放的物理地址。
- 內存划分
- 內存空間按需划分為若干個長度不相同的物理段
- 每個物理段由起始地址和長度確定
- 每段在內存中占據連續空間,段間可以不連續存放
2、分段存儲的管理表格
- 段表
- 概念:分段存儲管理系統為每個段分配一個連續的分區,進程的各個段可離散地裝入內存的不同位置,用一張段映射表(段表)記錄每段在內存的起始地址(基址)和段的長度。在配置了段表后,執行中的進程可通過邏輯地址中的段號來查詢段表,找到段的對應內存區。
- 特點:每個進程一張段表,給出邏輯段和物理段對應關系;段表放在內存,屬於進程的現場信息;段表在進程裝入內存時,根據內存分配情況建立
-
- 表項包括:段號、段長、基地址
- 根據段表段的分配方式以段為單位進行主存分配,每段在主存中占有一個連續空間;如果在裝入某段信息時找不到滿足該段地址空間大小的空閑區則采用移動技術合並分散的空閑區,有利於大作業的裝入
- 段表和頁表一樣存在主存中,訪問數據或指令至少需要訪問兩次,為了提高對段表的存取速度,增設了一個相聯寄存器(CPU內部),利用高速緩沖寄存器保存最近常用的段表項。
- 硬件支持
- 段表始址寄存器:用於保存正在運行進程的段表的始址
- 段表長度寄存器:用於保存正在運行進程的段表的長度
3、分段存儲的地址轉換
- 步驟:
- 段表送入段表控制寄存器中
- 執行指令:找到相應段表
- 判斷:段號>段表長度?大於則地址越界,小於等於
- 由邏輯地址中的段號得到段表中的基址(起始地址)判斷:邏輯地址中段內地址>段表中段長
- 大於則地址越界,反之,物理地址=起始地址+段內地址(做加法)
- 例設某程序中有5個段,段號分別為0-4,段表如下,求:1)段2字節53的物理地址,2)段3字節852的物理地址,3)段0字節1222的物理地址
-
- 4300+53=4353
- 200+852=4052
- 1222>1000,越界中斷!
- 注意的是,物理地址=起始地址+段內地址(做加法)
4、分頁和分段存儲比較
- 兩者主要區別:
- 段是信息的邏輯單位,它是根據用戶的需要划分的,因此段對用戶是可見的;頁是信息的物理單位,是為了管理主存的方便而划分的,對用戶是透明的。
- 頁的大小固定不變,由系統決定。段的大小是不固定的,它由其完成的功能決定。
- 段式向用戶提供的是二維地址空間,頁式向用戶提供的是一~維地址空間,其頁號和頁內偏移是機器硬件的功能。
- 由於段是信息的邏輯單位,因此便於存貯保護和信息的共享,頁的保護和共享受到限制。
- 分頁存儲特點
- 優點:解決了碎片問題;便於管理;
- 缺點:不易實現共享;不便於動態鏈接。
- 分段存儲特點
- 優點:便於動態申請內存;段表長度較短;便於共享;便於動態鏈接;
- 缺點:產生碎片;不易擴展。
5、段頁式存儲管理方案
- 結合頁式段式優點,克服二者的缺點
- 按邏輯關系划分用戶程序為若干邏輯段
- 按分頁存儲管理機制划分和分配內
- 由段號、段內頁號和頁內地址三項共同構成地址
- 基本實現思路:段頁式存儲管理為每一個裝入內存的作業建立一張段表,對每一段建立一張頁表; 段表的長度由作業分段的個數決定,段表中的每一個表目指出本段頁表的始址和長度; 頁表的長度則由對應段所划分的頁面數所決定,頁表中的每一個表目指出本段的邏輯頁號與內存物理塊號之間的對應關系。
- 邏輯地址中的段號S首先和段表長度比較,若未越界則根據S和段表基址找到相應段表項中紀錄的該段所在頁表基址,接着使用段內頁號P獲得對應頁面的頁表項位置,從中找到頁號對應的塊號,最后拼接上頁內地址W得到數據的物理地址。
- 例:在一個采用段頁式存儲管理的系統中,頁的大小為1KB。某個正在執行的作業情況如下:(1)請給出將邏輯地址(2,3500)轉換成物理地址的過程;(2)計算出上述邏輯地址對應的物理地址的值。
-
- 邏輯地址中的段號 2 跟段表控制寄存器中的段表長 3 進行比較,由於 2<3 ,故段號沒有越界;
- 根據段表控制寄存器中的段表起始地址加上段號 2 ,找到段表中對應於第 2 段的段表項,從而得到第 2 段的頁表長度和頁表起始地址;
- 根據段內偏移 3500 得到段內頁號為 3 ,3500/1kb。頁內偏移為 428 ,3500mod1kb。
- 把段內頁號 3 和段表項中的頁表長度 5 進行比較,得知頁號沒越界;
- 由頁表起始地址和頁號得到對應的頁表項,從而得到第 2 段的第 3 頁對應的物理塊號 是30 ;
- 物理塊號 30 和塊內偏移 428 拼接成物理地址 31148 。
- 顯然地址轉換過程中需要三次訪問內存
- 第一次:訪問段表,獲得頁表始址
- 第二次:訪問頁表,獲取塊號,獲得指令或數據的物理地址
- 第三次:按物理地址存取信息
- 分段需要大家注意的是,分段有助於實現將段與對其對應的保護機制相關聯。現代OS中,指令不可自我修改,故指令段只能定義為只讀或只執行,內存映射硬件會檢查段表項中的保護位,以防止對內存的非法訪問(對只讀段的寫將代碼段視為數據等)。數據則放在特定數組中,當需要訪問數據時會對數組下標進行檢測,超界時會產生越界中斷。
6、信息共享(了解)
- 在每個進程的段表中對多進程共享的可重入代碼設置一個段表項,當需要使用這部分代碼時,應保證在執行時不會修改它,每個進程的私有數據和局部變量必須使用獨立的段保存且不提供共享。
- 可重入代碼(純代碼) :允許多個進程同時訪問的代碼,且為保證每個進程所執行的代碼完全相同,決不允許執行過程中修改代碼。
- 分頁系統信息共享:使用可重入代碼時,各進程的部分邏輯頁面將被映射到可重入代碼使用的各幀中,但其私有數據和局部變量所使用的幀則各不相同,且所有這些頁面和幀的對照關系需要存入頁表(長度可能會極大)。
- 分段系統信息共享:使用可重入代碼時,只需在段表中為其設置一個段表項,並將執行時用到的部分數據copy到局部數據區,用來支持對執行時不可避免的代碼修改的支持即可。