操作系統原理學習筆記--進程管理

進程管理

  • 要點:
    • 基礎:進程描述及控制
    • 策略:進程調度
    • 實現:互斥與同步
    • 避免:死鎖與飢餓
    • 解決:幾個經典問題
  • 進程的引入
    • 程序的順序執行
      • 源代碼程序,目標程序和可執行程序
      • 程序執行:編輯,編譯,鏈接,執行
      • 程序的結構:順序,分支,循環結構
      • 程序執行的特徵:順序性,封閉性,可再現性
    • 程序併發執行
      • 多道程序設計技術:多個程序併發執行
      • 程序併發執行時的特徵:間斷性,非封閉性,不可再現性
      • 併發執行引發的問題:
        • 協調各程序的執行順序:輸入數據還未全部輸入內存時,計算必須等待
        • 多個執行程序共享系統資源,程序之間可能會相互影響,甚至影響輸出結果
        • 選擇那些,多少個程序進入內存執行
        • 內存中的執行程序誰先執行,誰後執行
        • 內存如何有效分配?
    • 進程的概念
      • 定義:可併發執行的程序,在一個數據集合上的運行過程
      • 申請、擁有資源~調度(線程)
      • 程序:靜態概念,是指令和數據的集合,可長期存儲
      • 進程與程序對應關係
        • 一個程序可以對應一個進程或者多個進程
        • 一個進程可以對應一個程序,或者一段程序
    • 進程的特徵
      • 動態性
      • 併發性
      • 獨立性
      • 異步性
    • 引入進程帶來的問題
      • 增加了空間開銷:爲進程建立數據結構
      • 額外的時間開銷:管理和協調,跟蹤,填寫和更新有關數據結構,切換進程,保護現場
      • 更難控制:協調多個進程競爭和共享資源如何預防;解決多個集成因爲競爭資源而出現的故障
      • 處理機的競爭尤爲突出
    • 進程的結構
      • 組成(進程映像):程序,數據集合,進程控制塊PCB(Process Control Block)
      • PCB是進程存在的唯一標誌。創建進程時,創建PCB;進程結束時,系統將撤銷其PCB
  • PCB
    • 進程標識信息:進程的內部(系統分配給它的標示)和外部標示符(name of a person)
    • 處理機狀態信息:通用寄存器值,指令計數器值,程序狀態字PSW值,用戶棧指針值
    • 進程調度信息:進程狀態,進程優先權,進程調度的其他信息
    • 其他信息:程序及數據指針,進程同步和通訊機制,資源清單,連接指針
  • PCB的組織方式
    • 單一隊列:所有進程的PCB通過鏈表組織成爲一個單一隊列。適用於進程數目不多的系統。如windows操作系統
    • 表格結構(查找效率較高)
      • PCB按進程狀態不同組織成不同的表格:就緒進程表,執行進程表(多機系統中)及阻塞進程表
      • 系統分別記載各PCB表的起始地址
    • PCB多級隊列

  • 進程的狀態
    • 進程的執行軌跡:進程執行的指令序列,用以觀察處理機的執行過程
    • 兩狀態模型:
      • 執行,未執行


      • 並非所有進程只要“未執行”就處於就緒狀態,有的需要阻塞,等待IO完成;“未執行”又可以分爲就緒和阻塞
    • 進程的五狀態
      • 執行Running:佔用處理機(單處理機環境中,某一時刻僅一個進程佔用處理機)
      • 就緒Ready:準備執行
      • 阻塞Blocked:等待某事件發生才能執行,如等待I/O完成等
      • 新New:進程已經創建,但未被OS接納爲可執行進程
      • 終止Terminated:因停止或取消,被OS從執行狀態釋放

      • 某些系統允許父進程在任何情況下終止其子進程。如果一個父進程被終止,其子進程都必須終止

  • 問題:多個進程競爭內存資源
    • 內存資源緊張
    • 無就緒進程,處理機空閒:I/O的速度比處理機的速度慢很多,可能出現全部進程阻塞等待I/O
  • 解決方法
    • 採用交換技術:換出一部分進程到外存,以騰出內存空間
    • 採用虛擬存儲技術:每個進程只能裝入一部分程序和數據(存儲管理部分)
  • 對換技術,交換技術
    • 將內存中暫時不能運行的進程,或暫時不用的數據和程序,換出到外存,以騰出足夠的內存空間,把已具備運行條件的進程,或進程所需要的程序和數據,換入內存
  • 進程掛起的原因
    • 進程全部阻塞,處理機空閒
    • 系統負荷過重,內存空間緊張
    • 操作系統的需要。操作系統可能需要掛起後臺進程或一些服務進程,或者某些導致系統故障的進程
    • 終端用戶的請求
    • 父進程的請求
  • 被掛起進程的特徵
    • 不能夠立即執行
    • 可能是等待某事件發生,若是,則阻塞條件獨立於掛起條件,即使阻塞事件發生,該進程也不能夠執行
    • 使之掛起的進程爲:自身,父進程,OS
    • 只有掛起他的進程才能使之由掛起狀態轉換爲其他狀態
  • 掛起與阻塞
    • 是否只能掛起阻塞進程
    • 如何激活一個掛起進程
    • 兩個概念:進程是否等待事件,阻塞與否;進程是否被換出內存,掛起與否
    • 4種狀態組合:
      • 就緒:進程在內存,準備執行
      • 阻塞:進程在內存,等待事件
      • 就緒/掛起:進程在外存,只要調入內存即可執行
      • 阻塞/掛起:進程在外存,等待事件
    • 處理機可調度執行的進程有兩種:
      • 新創建的進程
      • 或換入一個以前掛起的進程
      • 通常爲了避免增加系統負載,系統會換入一個以前掛起的進程執行

  • 進程的控制
    • 兩種執行模式:
      • 系統模式(又稱爲系統態)、控制模式或內核模式
        • 具有較高特權
        • 運行系統特定的指令,包括讀寫控制寄存器的指令,基本IO指令以及與存儲管理有關的指令及一些特定的內存區
        • 內核模式下的處理機及其指令、寄存器和內存都受到完全控制和保護
      • 用戶模式(或用戶態)
        • 較低的特權
        • 用戶一般運行在用戶模式
    • 模式切換
      • 用戶->系統:用戶執行到一條系統調用,進入操作系統內核執行
      • 系統->用戶:執行完系統調用的功能,返回到用戶程序
      • 特殊情況:程序執行到結束語句時,切換到系統模式,不再返回到用戶程序
    • 操作系統內核
      • 基於硬件的第一層軟件擴充,提供操作系統最基本的功能,是操作系統工作的基礎;
      • 現代操作系統中,爲減少系統本身的開銷,往往將一些與硬件緊密相關的(如中斷處理程序,設備驅動程序等),基本的,公共的,運行頻率較高的模塊(如時鐘管理,進程調度等),以及關鍵性數據結構獨立開來,使之常駐內存,並對他們進行數據保護。通常把這一部分稱爲操作系統的內核。
      • 用戶通過系統調用訪問操作系統的功能,這些功能最終都通過操作系統內核實現。
      • 一般滴,操作系統內核功能可以概括地劃分爲資源管理功能和支撐功能
        • 資源管理:
          • 進程管理:進程創建和終止,調度,狀態轉換,同步和通信,管理PCB
          • 存儲管理:爲進程分配地址空間,對換,段/頁管理
          • IO設備管理:緩存管理,爲進程分配IO通道和設備
        • 支撐功能:
          • 中斷處理
          • 統計
          • 監測
          • 時鐘管理
          • 原語(Primitive):原子操作
            • 進程的創建與終止
            • 進程的阻塞與喚醒
            • 進程的掛起與激活
            • 進程切換
              • 進程切換&模式切換
                • 進程切換:作用與進程之間的一種操作
                • 模式切換:進程內部所引用的一種操作,當用戶程序和轉入系統調用,或者相反時,該操作將被引用
                • 進程切換一定會引發模式切換,反之則不然
  • 進程調度
    • 調度是指,在一個隊列中,按照某種方法(算法),選擇一個合適的個體的過程。
    • 調度的關鍵是需要某種方法或者算法,好的調度算法有利於選擇到合適的個體
    • 調度目標
      • 公平性
      • 處理機利用率
      • 提高系統吞吐量
      • 儘量減少進程的響應事件
    • 調度原則:
      • 滿足用戶的要求:
        • 響應時間:(考慮儘可能使絕大多數用戶的請求能在響應時間內完成,常用於評價分時系統的性能)
        • 週轉時間:作業提交給系統開始到作業完成的這段時間間隔,評價批處理系統的性能
        • 截止時間:實時系統中,某任務必須開始執行的最遲時間,或必須完成的最遲時間,常用來評價實時系統的性能
      • 滿足系統的需求:
        • 系統吞吐量
        • 處理機利用率
        • 各類資源的平衡使用
        • 公平性及優先級
    • 調度方式:
      • 非剝奪方式
        • 執行完畢or申請IO阻塞自己
        • 不利於“及時性”要求較高的分時和實時系統,主要用於批處理系統
      • 剝奪方式
        • 操作系統可以在新進程到來時,或某個具有較高優先權的被阻塞進策劃那個插入就緒隊列時,或在基於時間片調度的的系統中,時間片用完而中斷當前進程的執行,調度新的進程執行
        • 這種方式會產生較多的中斷,主要用於實時性要求較高的實時系統及性能要求較高的批處理系統
    • 調度類型
      • 批處理調度,分時調度,實時調度和多處理機調度
      • 長程調度(外存到內存):
        • long-term scheduling
        • 又稱爲高級調度或者作業調度,它爲被調度作業或用戶程序創建進程,分配必要的系統資源,並將新創建的進策劃那個插入就緒隊列,等待短程調度
        • 某些採用交換技術的系統將新創建的進程插入到就緒/掛起隊列,等待中程調度
        • 在批處理系統中,作業進入系統後,先駐留在磁盤上,組織成批處理隊列,稱爲後備隊列。長程調度從該隊列中選擇一個或者多個作業,爲之創建進程

        • 考慮的問題:
          • 選擇多少個進入內存--取決於多道程序的度,即允許同時在內存中運行的進程數
          • 選擇那些作業:取決於長程調度算法
      • 中程調度(進程間的外存內存之間)
        • 又稱爲中級調度
        • 內存空間緊張時,或處理機找不到一個可執行的就緒進程時,需要選擇一個進程(阻塞或就緒狀態)換出到外存,釋放出內存空間給別的進程使用;當內存空間較充裕時,從外存選擇一個掛起狀態的進程調度到內存(換入);

        • 目的:爲了提供內存的利用率和系統的吞吐量
        • 只有支持進程掛起的操作系統才具有中程調度功能
      • 短程調度(內存裏):
        • 也成爲進程調度,或低級調度,決定就緒隊列中的那個進程將獲得處理機
        • 短程調度運行頻率最高
        • 現代操作系統幾乎都具有短程調度功能
      • IO調度(相近的磁道)
  • 進程調度算法
    • FCFS(先來先服務):同時適合於三種調度
      • 非剝奪調度方式,實現簡單,看似公平
      • 注意:後進入隊列的運行時間較短的進程或者IO型進程而言,可能需要較長時間的等待
      • 對段進程不公平
    • 短進程優先(對FCFS的改進)
      • 非剝奪。
      • 難以準確預測進程的執行時間
      • 可能導致長進程飢餓
      • 採用非剝奪調度方式,未考慮進程的緊迫程度,不適合於分時系統和事務處理系統
    • 時間片輪轉調度法

      • 用戶數多時進程急劇增加
      • 時間片大小會影響處理性能
        • 進程切換會增加系統額外開銷
        • 太長太短都不好
        • 綜合考慮系統最大用戶數,響應時間,系統效率等因素
      • 對於短的,計算型的進程較有利
      • 不適合IO型的進程
      • 改進方法之一:可以將IO阻塞時間完成的進程單獨組織成一個就緒隊列,該隊列進程的時間片可以設置的小一點,且優先調度
    • 基於優先級的調度算法
      • 設定進程的優先級
        • 進程完成功能的重要性
        • 進程完成功能的緊迫性
        • 爲均衡系統資源的使用,指定進程(作業)優先級
        • 進程對資源的佔用程度,例如,可以爲短進程(或作業)賦予較高的優先級
      • 靜態與動態優先級
        • 動態優先級:
          • 剩餘時間最短者優先(剝奪型)
        • 響應比高者優先
          • 進程的優先級與等待時間成正比
          • 難以準確的估計進程的語氣執行時間
          • 計算響應比增加系統開銷
    • 反饋調度法
      • 根據執行歷史而非未來進行調度,將解決這個問題
      • 根據進程的執行歷史調整調度方式的調度方法,它結合了優先級和時間片輪轉調度的方法

      • 有利於交互性短進程或批處理作業,他們一般只需要一個或者幾個時間片即可完成
      • 可能是長進程的週轉時間急劇增加
      • 如果不斷有新進程進來,還可能時長進程海長期飢餓現象
      • 可以爲各隊列設置不同的時間片,優先級愈低時間片愈長
  • 實時系統(Real-Time System)
    • 能及時響應外部事件愛你的請求,在規定時間內完成對該事件的處理,並控制所有的實時任務協調一致的運行的計算機系統
    • 分爲實時控制系統和實時信息處理系統
    • 實時控制系統:
      • 要求進行實時控制的系統
      • 主要用於生產過程的控制。(自動控溫,武器控制,導彈制導,自動駕駛)
    • 實時信息處理系統
      • 對信息進行實時處理的系統
      • 很短的時間爲用戶做出正確的回答(飛機訂票,情報檢索)
    • 實時任務(real-time task)
      • 具有即時性要求的,常常被重複執行的特定進程,在實時系統中常被稱爲任務
      • 週期性劃分
        • 週期性實時任務
          • 週期性的控制某個外部事件
        • 非週期性實時任務
          • 必須聯繫着一個截止時間(開始截止時間,完成截止時間)
      • 對截止時間的要求
        • 硬實時任務(錯過了出現難以預測的結果,可能是災難性的)
        • 軟實時任務(錯過了影響不會太大)
    • 目標:
      • 硬實時任務必須完成,軟實時任務儘量完成
      • 公平性和最短時間響應時間等要求已不再重要
    • 算法:
      • 實時性要求不太高的
        • 基於時間片輪轉調度算法
        • 基於 優先級的調度算法
        • 最早截止時間優先調度算法,即優先調度截止時間最近的實時任務
      • 速度單調調度算法(RMS)
        • 根據任務週期大小賦予優先級,最短優先任務具有最高優先級其中
          • 任務週期(period),之一個任務到達至下一個任務到達之間的時間範圍
          • 任務速度(rate),即週期(以秒記)的倒數
        • 任務週期的結束,表示任務的硬截止時間,任務的執行時間不應超過任務週期
        • 以任務速度爲參數,則優先級函數式一個單調遞增的函數
        • 廣泛用於工業實時系統的週期性任務調度
  • 線程
    • 引入線程是爲了減少程序併發執行時系統所付出的額外開銷,使系統具有更好的併發性
    • 兩個基本屬性
      • 進程是一個擁有資源的獨立單位
      • 同時又是一個可以獨立調度的基本單位
    • 由進程到線程
      • 目標:既能提高進程的併發度,又能降低系統的額外開銷
      • 實現:將進程的資源申請和調度屬性分開,即進程作爲資源的申請和擁有者,但是不作爲調度的基本單位,這樣就產生了線程的概念
      • 線程自身基本上不擁有系統資源,只擁有少許運行中必不可少的私有資源,線程可與同屬一個進程的其他線程共享進程的全部資源
      • 進程中的所有線程共享該進程的狀態
      • 三種基本狀態:就緒執行阻塞
      • 一般不具有掛起狀態
    • 一個進程可以創建和撤銷多個線程,同一進程的多個線程可以併發執行
    • 線程的操作包括:
      • 派生(SPawn)
      • 阻塞(Block)
      • 解除阻塞(Unblock)
      • 結束(Finish)
    • 線程阻塞不一定會引起進程的阻塞
    • 類型:
      • 用戶級線程(由應用程序完成)和內核級線程
      • 進程中的某個線程需要等待另一線程的輸入數據而阻塞時,整個進程並不會阻塞,即進程保持執行狀態,其內的某個線程也是執行狀態。
      • 當某線程因爲IO阻塞時,內核需要啓動系統IO,控制從用戶級轉到系統內核級,這時常會引起整個進程阻塞,隨即將發生進程切換,進程調度程序重新調度另一個就緒進程執行。
      • 混合模式

  • 進程的互斥與同步
    • 問題:如何協調多個進程對系統資源,如內存空間,外部設備等的競爭和共享?如何解決多個進程因爲競爭資源而出現的執行結果異常,設置系統不穩定,失效等問題。
    • 併發控制:
      • 競爭資源
        • 死鎖
        • 某些資源必須互斥的使用--臨界資源
        • 訪問臨界資源的那段代碼稱爲臨界區
        • 任何時刻,只允許一個進程進入臨界區,以此實現進程對臨界資源的互斥訪問

    • 互斥使用臨界區
      • 在進程需要使用臨界資源時,通過獲得臨界區的使用權實現的。
      • 首先,在進入區判斷是否可以進入臨界區,如果可以進入,則必須設置臨界區使用標誌,阻止其他後來的進程進入臨界區。後來的進程通過查看臨界區使用標誌,知道自己不能夠進入臨界區,就進入阻塞隊列,將自己阻塞
      • 當臨界區內的進程時候用完畢,推出臨界區時,即在退出區修改臨界區使用標誌,並負責喚醒阻塞隊列中的一個進程,讓其進入臨界區
      • 必須保證“臨界區使用標誌”是可以被系統中的所有進程共享的全局變量,而且諸進程對該標誌的修改操作必須互斥的進行
    • 臨界區使用原則
      • 每次只允許一個進程進入臨界區(忙則等待)
      • 進程只能在臨界區內逗留有限時間,不得使其他進程在臨界區外無限等待(有限等待)
      •  如果臨界區空閒,則只要有進程申請就立即讓其進入(空閒讓進)
      • 進入臨界區的進程,不能夠在臨界區內長時間阻塞等待某事件,必須在一定期限內退出臨界區(讓權等待)
      • 不能限制進程的執行進度及處理機的數量
    • 競爭資源可能引起死鎖

    • 競爭資源可能引起飢餓
    • 併發控制-共同協作
      • 多個進程常常需要共同修改某些共享變量,表格文件數據庫等,協作完成一些功能
      • 必須確保他們對共享變量的修改時正確的,保證數據的完整型
      • 共享協作同樣涉及到互斥死鎖和飢餓問題,當更強調對數據的寫操作必須互斥的進行
      • 必須保證數據的一致性(銀行存款取款餘額)
      • 一般通過事務處理來保證數據的一致性,進入臨界區的進程必須一次性完成對這一些列數據的修改操作
      • 只有該進程退出臨界區以後,才允許其他進程進入臨界區進行數據修改,以保證數據的一致性。
    • 併發控制-通信協作
      • 當進程進行通信合作時,各個進程之間需要建立連接,通信進程需要同步和協調。進程通信的方式很多,包括消息傳遞,管道,共享存儲區等。
      • 通過消息傳遞實現進程通信時,由於沒有共享資源,故無需互斥,但仍可能出現死鎖與飢餓
      • 通信死鎖與飢餓
    • 互斥與同步的解決策略
      • 軟件方法
        • 由進程自己,通過執行相應的程序指令,實現與別的進程的同步於互斥,無需專門的程序設計語言或操作系統的支持
        • 很難正確的控制進程間的同步與互斥,而且可能會大大增加系統的額外開銷
      • 硬件方法
        • 通過屏蔽中斷或採用專門的機器指令控制同步與互斥
        • 減少了系統額外開銷,需要太強的硬件約束條件,以及可能導致進程飢餓與死鎖現象,沒有成爲通用的解決方法
      • 信號量方法(重點)
        • 由操作系統,或專門的程序設計語言提供特別支持,包括信號量方法,管程方法和消息傳遞方法
        • 通用方法
      • 管程方法
      • 消息傳遞方法
    • 軟件方法
      • Dekker算法
      • Peterson算法
      • 初步設想:控制兩個互斥進入臨界區,可以讓兩個進程輪流進入臨界區
        • 保證了互斥
        • 出現忙等現象
        • a非要等b用完一次才能使用下一次
      • 第一次改進
        • 爲臨界區設置狀態標誌,表明臨界區是否可用,空閒時,任何一個進程都能進入
        • 進程在臨界區失敗問題
        • 不能保證互斥

      • 第二次改進
        • 預先表明希望進入臨界區
        • 會死鎖會忙等
      • 第三次改進
        • 使他們表明態度,懂得“謙讓”
      • Dekker互斥算法


      • Peterson方法
    • 硬件算法
      • 屏蔽中斷

        • 約束太強,代價太大
      • 專用機器指令
        • Test and set 指令
        • exchange指令


        • 優點:簡單,易於證明;同時適合與單處理機系統和共享內存的多處理機系統中多個進程的互斥;
        • 缺點:忙等現象依然存在,但屬於可接受的忙等;可能出現飢餓現象
        • 可能導致死鎖
      • 信號量方法
        • 實例:信號燈
        • 兩個或者兩個進程可以通過傳遞信號進行合作,可以迫使進程在某個位置暫時停止執行(阻塞等待),知道它受到一個可以向前推進的信號(被喚醒)
        • 相應的,實現信號燈作用的變量稱爲信號量,常定義爲記錄型變量s,其中一個域爲整型,另一個域爲隊列,其元素爲等待信號量的阻塞進程
        • 信號量定義

        • 定義對信號量的兩個原子操作:wait(s)和signal(s);早期這兩個原語被稱爲P(s)和V(s)


        • 信號量的類型:互斥信號量和資源信號量
        • 互斥信號量用於申請或者釋放資源的使用權,常初始化爲1
        • 資源信號量用於申請或歸還資源,可以初始化爲大於1的正整數,表示系統中某類資源的可用個數
        • wait操作用於申請資源(或使用權),進程執行wait原語時,可能會阻塞自己
        • signal操作用於釋放資源(或歸還資源使用權),進程執行signal原語時,有責任喚醒一個阻塞進程
        • 信號量的物理意義s.count表示可用資源數

  • 生產者/消費者問題




    • 必須使生產者和消費者互斥進入緩衝區。即,某時刻只允許一個實體(生產者或消費者)訪問緩衝區,生產者互斥消費者和其他任何生產者。
    • 生產者不能夠向滿緩衝區寫數據,消費者也不能在空緩衝區中取數據,即生產者與消費者必須同步




  • 讀者/寫者問題



    • 讀者優先


    • 讀者優先





  • 管程方式(面向對象的方法)(應用比較少)

    • 管程結構


    • 用管程實現互斥




  • 消息傳遞
    • 進程通信的方式

    • 常用進程通信方式
      • 基於共享存儲區方式



      • 消息傳遞方式
        • 進程之間通信的兩條原語
          • Send(destination,message)
          • Receive(sourse,message)
        • 消息傳遞的同步

        • 三種同步方式



        • 阻塞接收

        • 消息傳遞中的尋址

        • 間接尋址


        • 利用消息傳遞實現互斥


        • attention


        • 消息傳遞解決生產者消費者問題




      • 郵件方式

在多道程序中,需要從磁盤中同時讀入多個進程到內存,我們需要對內存進行管理,使得能夠有條理地執行進程。
通常指令先要從內存中讀入,進行解碼,還要從內存中讀取操作數,再將結果返回給內存。內存看到的只是地址。
一個進程佔了一塊內存,跨度是一串連續的地址,我們用base register和limit register來限定進程訪問的範圍。
CPU只能訪問的存儲器是內存和CPU的寄存器,所以如果有指令要訪問數據,必須要提前導入到內存。下面會講到交換方法,和動態載入。
Cache:因爲訪問CPU寄存器必訪問內存速度快了很多,所以我們不能老是訪問內存,所以要有Cache。訪問內存可能會導致CPU暫停。
進程訪問的地址的限定通過硬件實現:即通過base和limit寄存器的比較實現。
OS可以改limit和base的值。
磁盤有一個輸入隊列,存放準備導入內存的進程。
代碼裏我們通常用一個變量代表地址,我們可以將變量綁定到可重定位地址,加載程序再將重定位地址綁定成絕對地址。
綁定的情況:
1.編譯時:如果在編譯時就知道內存的地址,那麼直接綁定絕對地址。
2.加載時:在編譯時生成可重定位代碼,在加載時才生成絕對代碼。
3.執行時:如果執行時還要將進程從一個內存塊移到另一個內存塊,則只有執行時才綁定。
CPU生成的邏輯地址,內存的地址是物理地址。
程序生成的地址空間稱爲邏輯地址空間。
運行時虛擬地址到物理地址通過MMU映射。通過CPU的邏輯地址+base register就得到物理地址。用戶是不知道物理地址的。

動態加載:如果一個程序必須全部加載入內存,那麼必須限制程序的大小,所以動態加載是將一個大程序分成多個子程序,每次將某個子程序調入內存,如果一個子程序需要調入另一個子程序,則再加載,加強內存空間的使用率。

動態鏈接:通過在程序內部存放一個存根引用語言庫,可以不必複製多個語言庫副本,並且如果版本號不同,可以在內存中存放多個不同版本的庫。
--------
如果CPU要執行的進程不再內存中,而在備份存儲器中,則需要換入和換出,即交換。
當就進程換出後再次換入時,需要考慮位置問題:
1.當在加載時就綁定到物理地址,則換入到同一個位置。
2.在運行時綁定,則可以換入到任意位置。
交換的時間分爲:轉移時間,磁盤磁頭尋址時間。
換出的進程選擇方面需要注意不能選在I/O等待隊列中的進程。
因此有一個修正的交換方式,可以在內存喫緊的情況下交換,但是在CPU使用率降低到一定時停止交換。

爲了管理內存,需要爲每個進程分配連續的內存。
內存映射需要將CPU的邏輯地址先與limit register比較,再加上base register。
當操作系統的一部分不常用時,可以先將它換出到備份存儲,這塊空間就可以騰給用戶進程使用。

內存分配最簡單的是將內存分成多個固定大小的分區,每個分區容納一個進程。
可變分區是OS保存一個表,記錄哪些內存可用,哪些內存已佔用。
空閒的內存區域稱爲孔。
當一個進程從輸入隊列進入內存,有幾種選取孔的方案:
1.最佳適應:遍歷一遍,找到合適的最小孔。
2.首次適應。
3.最差適應。(真不知道要這個幹嘛。。)
在第一第二中方法時,會存在外部碎片問題。
外部碎片問題:進程入孔後,還多出一點小空間,但不能放進程了。
內部碎片問題:分配內存時按塊分配,比如一個進程3K,一個孔4K,則直接將4K分給進程,4-3=1K就是內部碎片。
解決外部碎片的方法是緊縮,將進程都擠一塊。但是當綁定在加載時,則不能緊縮。
還有一種方法是重點,即可以將內存分配爲非連續。
50%規則:在可分配的內存中,有50%的空間是碎片。

分頁:將CPU的邏輯地址分成頁,而將物理內存地址分成幀。備份存儲也分成大小一樣的塊。先通過頁號找到頁表對應的幀,再加上頁偏移找到內存的位置。
將CPU邏輯地址分成頁號和頁偏移方法:先將CPU邏輯地址的大小變成2^m,m就是邏輯地址的位數,設2^n爲一頁的大小,那麼n則爲頁偏移。
m-n就爲頁號長度。
分頁會導致內部碎片。因爲幀大小固定,一次分配就是一幀的整數倍。
進程由幾頁組成,每個頁對應一個幀。因此進程的內容就不一定要連續,每個進程對應一個頁表。OS還持有每個進程頁表的副本。
幀表:包括全部的幀以及他們是空閒還是被佔用。
一開始頁表放在PCB的寄存器中,因爲速度快。但是隨着頁表的變大,必須把頁表放在內存,而PCB只需保留一個頁表基寄存器(PTBR),指向頁表的頭部。得到幀號再加上頁偏移後再次訪問內存。因此要2次訪問。
由於上述方案需要2次內存訪問,延遲大,所以產生了(TLB)快表(感覺就像cache),保留頁表的一小部分,可以同時訪問TLB的每個元素,速度快。如果TLB中沒有,則按常規訪問,並且將這個頁表添加入TLB(局部性原理)。TLB的結構是鍵爲頁號,值爲幀號。
有時TLB中還會有ASID,地址空間標識符(ASID):唯一標識一個進程,一定要ASID匹配並且頁號匹配纔算匹配。
如果沒有提供ASID時,則TLB保存一個進程的頁表,每次進程切換,則TLB被flush。

TLB的命中率:訪問TLB能找到的概率。

 

我們可以爲每個幀授予權限,只讀,可讀寫,可執行等。
頁表的保護方式是通過在頁表中提供一位稱爲“有效無效位”,即v或i。代表該頁號是否合法。因爲可能一個程序只有1-5的頁號,所以頁號爲6以後的都被置爲i。當然還可以通過PTLR(頁表長度寄存器)來限制頁表大小。
分頁可以共享公共代碼,但是這些公共代碼是不能修改的。想象一下爲什麼能共享,因爲進程只需要存放獨有的頁表,頁表對應的幀在內存中,所以只需要一個程序即可,但是需要獨立的數據,因此數據不能共享。
組織頁表有幾種方法:
1.多級頁表。向前映射頁表:從外級頁表逐步映射到地址。想到了多級索引。【頁表劃分出題】

由來:因爲我們的地址空間越來越大,所以頁表也越來越大,因此到了我們都不能連續存放頁表的地步,所以出現了多級頁表。
2.hash頁表。邏輯地址的頁號通過hash後找到hash表對應位置,hash表每個元素對應一個鏈表,一個元素由虛擬頁碼、幀號、next組成。
羣集頁表適用於64位地址空間,hash頁表的每個條目存儲多個物理頁幀的映射。
3.反向頁表。通常一個進程有一個頁表,但是佔用內存大,因此整個系統只有一個反向頁表,一個反向頁表條目爲<pid,page_number>,虛擬地址空間的一個條目爲<pid,page_number,offset>,但是缺點爲遍歷時間長,但是可以結合前面提到的技術,如先TLB,再hash,再反向頁表。但是反向頁表不能共享內存。

分段是考慮到了用戶對於內存的視角來構造的。將程序看成是一個段,沒有順序,用戶通過<段號,段偏移>確定地址。
類似於頁表,分段通過段表來實現地址映射,段表一個元素對應base register和limit register。


 

存儲管理的基本原理

內存管理方法

內存管理主要包括內存分配和回收、地址變換、內存擴充、內存共享和保護等功能。

下面主要介紹連續分配存儲管理、覆蓋與交換技術以及頁式段式存儲管理等基本概念和原理。

1. 連續分配存儲管理方式

連續分配是指爲一個用戶程序分配連續的內存空間。連續分配有單一連續存儲管理和分區式儲管理兩種方式。

(1)單一連續存儲管理

在這種管理方式中,內存被分爲兩個區域:系統區和用戶區。應用程序裝入到用戶區,可使用用戶區全部空間。其特點是,最簡單,適用於單用戶、單任務的操作系統。CP/M和DOS 2.0以下就是採用此種方式。這種方式的最大優點就是易於管理。但也存在着一些問題和不足之處,例如對要求內存空間少的程序,造成內存浪費;程序全部裝入,使得很少使用的程序部分也佔用—定數量的內存。

(2)分區式存儲管理

爲了支持多道程序系統和分時系統,支持多個程序併發執行,引入了分區式存儲管理。分區式存儲管理是把內存分爲一些大小相等或不等的分區,操作系統佔用其中一個分區,其餘的分區由應用程序使用,每個應用程序佔用一個或幾個分區。分區式存儲管理雖然可以支持併發,但難以進行內存分區的共享。

分區式存儲管理引人了兩個新的問題:內碎片和外碎片。前者是佔用分區內未被利用的空間,後者是佔用分區之間難以利用的空閒分區(通常是小空閒分區)。爲實現分區式存儲管理,操作系統應維護的數據結構爲分區表或分區鏈表。表中各表項一般包括每個分區的起始地址、大小及狀態(是否已分配)。

分區式存儲管理常採用的一項技術就是內存緊縮(compaction):將各個佔用分區向內存一端移動,然後將各個空閒分區合併成爲一個空閒分區。這種技術在提供了某種程度上的靈活性的同時,也存在着一些弊端,例如:對佔用分區進行內存數據搬移佔用CPU~t寸間;如果對佔用分區中的程序進行“浮動”,則其重定位需要硬件支持。

1)固定分區(nxedpartitioning)。

固定式分區的特點是把內存劃分爲若干個固定大小的連續分區。分區大小可以相等:這種作法只適合於多個相同程序的併發執行(處理多個類型相同的對象)。分區大小也可以不等:有多個小分區、適量的中等分區以及少量的大分區。根據程序的大小,分配當前空閒的、適當大小的分區。這種技術的優點在於,易於實現,開銷小。缺點主要有兩個:內碎片造成浪費;分區總數固定,限制了併發執行的程序數目。

2)動態分區(dynamic partitioning)。

動態分區的特點是動態創建分區:在裝入程序時按其初始要求分配,或在其執行過程中通過系統調用進行分配或改變分區大小。與固定分區相比較其優點是:沒有內碎片。但它卻引入了另一種碎片——外碎片。動態分區的分區分配就是尋找某個空閒分區,其大小需大於或等於程序的要求。若是大於要求,則將該分區分割成兩個分區,其中一個分區爲要求的大小並標記爲“佔用”,而另一個分區爲餘下部分並標記爲“空閒”。分區分配的先後次序通常是從內存低端到高端。動態分區的分區釋放過程中有一個要注意的問題是,將相鄰的空閒分區合併成一個大的空閒分區。

下面列出了幾種常用的分區分配算法:

首先適配法(nrst-fit):按分區在內存的先後次序從頭查找,找到符合要求的第一個分區進行分配。該算法的分配和釋放的時間性能較好,較大的空閒分區可以被保留在內存高端。但隨着低端分區不斷劃分會產生較多小分區,每次分配時查找時間開銷便會增大。

下次適配法(next-fit):按分區在內存的先後次序,從上次分配的分區起查找(到最後{區時再從頭開始},找到符合要求的第一個分區進行分配。該算法的分配和釋放的時間性能較好,使空閒分區分佈得更均勻,但較大空閒分區不易保留。

最佳適配法(best-fit):按分區在內存的先後次序從頭查找,找到其大小與要求相差最小的空閒分區進行分配。從個別來看,外碎片較小;但從整體來看,會形成較多外碎片優點是較大的空閒分區可以被保留。

最壞適配法(worst- fit):按分區在內存的先後次序從頭查找,找到最大的空閒分區進行分配。基本不留下小空閒分區,不易形成外碎片。但由於較大的空閒分區不被保留,當對內存需求較大的進程需要運行時,其要求不易被滿足。

2.覆蓋和交換技術

引入覆蓋(overlay)技術的目標是在較小的可用內存中運行較大的程序。這種技術常用於多道程序系統之中,與分區式存儲管理配合使用。覆蓋技術的原理很簡單,一個程序的幾個代碼段或數據段,按照時間先後來佔用公共的內存空間。將程序必要部分(常用功能)的代碼和數據常駐內存;可選部分(不常用功能)平時存放在外存(覆蓋文件)中,在需要時才裝入內存。不存在調用關係的模塊不必同時裝入到內存,從而可以相互覆蓋。覆蓋技術的缺點是編程時必須劃分程序模塊和確定程序模塊之間的覆蓋關係,增加編程複雜度;從外存裝入覆蓋文件,以時間延長換取空間節省。覆蓋的實現方式有兩種:以函數庫方式實現或操作系統支持。

交換(swapping)技術在多個程序併發執行時,可以將暫時不能執行的程序送到外存中,從而獲得空閒內存空間來裝入新程序,或讀人保存在外存中而處於就緒狀態的程序。交換單位爲整個進程的地址空間。交換技術常用於多道程序系統或小型分時系統中,與分區式存儲管理配合使用又稱作“對換”或“滾進/滾出”(roll-in/roll-out)。其優點之一是增加併發運行的程序數目,並給用戶提供適當的響應時間;與覆蓋技術相比交換技術另一個顯著的優點是不影響程序結構。交換技術本身也存在着不足,例如:對換人和換出的控制增加處理器開銷;程序整個地址空間都進行對換,沒有考慮執行過程中地址訪問的統計特性。

3.頁式段式存儲管理

在前面的幾種存儲管理方法中,爲進程分配的空間是連續的,使用的地址都是物理地址。如果允許將一個進程分散到許多不連續的空間,就可以避免內存緊縮,減少碎片。基於這一思想,通過引入進程的邏輯地址,把進程地址空間與實際存儲空間分離,增加存儲管理的靈活性。地址空間和存儲空間兩個基本概念的定義如下:

地址空間:將源程序經過編譯後得到的目標程序,存在於它所限定的地址範圍內,這個範圍稱爲地址空間。地址空間是邏輯地址的集合。

存儲空間:指主存中一系列存儲信息的物理單元的集合,這些單元的編號稱爲物理地址存儲空間是物理地址的集合。

根據分配時所採用的基本單位不同,可將離散分配的管理方式分爲以下三種
段式存儲管理和段頁式存儲管理。其中段頁式存儲管理是前兩種結合的產物。

(1)頁式存儲管理

1)基本原理。將程序的邏輯地址空間劃分爲固定大小的頁(page),而物理內存劃分爲同樣大小的頁框(pageframe)。程序加載時,可將任意一頁放人內存中任意一個頁框,這些頁框不必連續,從而實現了離散分配。該方法需要CPU的硬件支持,來實現邏輯地址和物理地址之間的映射。在頁式存儲管理方式中地址結構由兩部構成,前一部分是頁號,後一部分爲頁內地址,如圖4-2所示。

這種管理方式的優點是,沒有外碎片,每個內碎片不超過頁大比前面所討論的幾種管理方式的最大進步是,一個程序不必連續存放。這樣就便於改變程序佔用空間的大小(主要指隨着程序運行,動態生成的數據增多,所要求的地址空間相應增長)。缺點是仍舊要求程序全部裝入內存,沒有足夠的內存,程序就不能執行。

2)頁式管理的數據結構。在頁式系統中進程建立時,操作系統爲進程中所有的頁分配頁框。當進程撤銷時收回所有分配給它的頁框。在程序的運行期間,如果允許進程動態地申請空間,操作系統還要爲進程申請的空間分配物理頁框。操作系統爲了完成這些功能,必須記錄系統內存中
實際的頁框使用情況。操作系統還要在進程切換時,正確地切換兩個不同的進程地址空間到物理內存空間的映射。這就要求操作系統要記錄每個進程頁表的相關信息。爲了完成上述的功能,—個頁式系統中,一般要採用如下的數據結構。

進程頁表:完成邏輯頁號(本進程的地址空間)到物理頁面號(實際內存空間)的映射。
每個進程有一個頁表,描述該進程佔用的物理頁面及邏輯排列順序。

物理頁面表:整個系統有一個物理頁面表,描述物理內存空間的分配使用狀況,其數據結構可採用位示圖和空閒頁鏈表。

請求表:整個系統有一個請求表,描述系統內各個進程頁表的位置和大小,用於地址轉換也可以結合到各進程的PCB(進程控制塊)裏。

3)頁式管理地址變換

頁式系統中,指令所給出的地址分爲兩部分:邏輯頁號和頁內地址。CPU中的內存管理單元(MMU)按邏輯頁號通過查進程頁表得到物理頁框號,將物理頁框號與頁內地址相加形成物理地址(見圖4-3)。上述過程通常由處理器的硬件直接完成,不需要軟件參與。通常,操作系統只需在進程切換時,把進程頁表的首地址裝入處理器特定的寄存器中即可。一般來說,頁表存儲在主存之中。這樣處理器每訪問一個在內存中的操作數,就要訪問兩次內存。第一次用來查找頁表將操作數的邏輯地址變換爲物理地址;第二次完成真正的讀寫操作。這樣做時間上耗費嚴重。爲縮短查找時間,可以將頁表從內存裝入CPU內部的關聯存儲器(例如,快表)中,實現按內容查找。此時的地址變換過程是:在CPU給出有效地址後,由地址變換機構自動將頁號送人快表,並將此頁號與快表中的所有頁號進行比較,而且這種比較是同時進行的。若其中有與此相匹配的頁號,表示要訪問的頁的頁表項在快表中。於是可直接讀出該頁所對應的物理頁號,這樣就無需訪問內存中的頁表。由於關聯存儲器的訪問速度比內存的訪問速度快得多。

(2)段式存儲管理

1)基本原理。

段式存儲管理中,將程序的地址空間劃分爲若干個段(segment),這樣每個進程有一個二維的地址空間。在前面所介紹的動態分區分配方式中,系統爲整個進程分配一個連續的內存空間。而在段式存儲管理系統中,則爲每個段分配一個連續的分區,而進程中的各個段可以不連續地存放在內存的不同分區中。程序加載時,操作系統爲所有段分配其所需內存,這些段不必連續,物理內存的管理採用動態分區的管理方法。在爲某個段分配物理內存時,可以採用首先適配法、下次適配法、最佳適配法等方法。在回收某個段所佔用的空間時,要注意將收回的空間與其相鄰的空間合併。段式存儲管理也需要硬件支持,實現邏輯地址到物理地址的映射。程序通過分段劃分爲多個模塊,如代碼段、數據段、共享段。這樣做的優點是:可以分別編寫和編譯源程序的一個文件,並且可以針對不同類型的段採取不同的保護,也可以按段爲單位來進行共享。總的來說,段式存儲管理的優點是:沒有內碎片,外碎片可以通過內存緊縮來消除;便於實現內存共享。缺點與頁式存儲管理的缺點相同,進程必須全部裝入內存。

2)段式管理的數據結構。

爲了實現段式管理,操作系統需要如下的數據結構來實現進程的地址空間到物理內存空間的映射,並跟蹤物理內存的使用情況,以便在裝入新的段的時候,合理地分配內存空間。

·進程段表:描述組成進程地址空間的各段,可以是指向系統段表中表項的索引。每段有段基址(baseaddress)。

·系統段表:系統所有佔用段。

·空閒段表:內存中所有空閒段,可以結合到系統段表中。

3)段式管理的地址變換。

段式管理系統中,整個進程的地址空間是二維的,即其邏輯地址由段號和段內地址兩部分組成。爲了完成進程邏輯地址到物理地址的映射,處理器會查找內存中的段表,由段號得到段的首地址,加上段內地址,得到實際的物理地址(見圖4—4)。這個過程也是由處理器的硬件直接完成的,操作系統只需在進程切換時,將進程段表的首地址裝入處理器的特定寄存器當中。這個寄存器一般被稱作段表地址寄存器。

4.頁式段式系統的區別

頁式段式系統有許多相似之處。比如,兩者都採用離散分配方式,且都通過地址映射機構來實現地址變換。但概念上兩者也有很多區別,主要表現在:

·頁是信息的物理單位,分頁是爲了實現離散分配方式,以減少內存的外零頭,提高內存的利用率。或者說,分頁僅僅是由於系統管理的需要,而不是用戶的需要。段是信息的邏輯單位,它含有一組其意義相對完整的信息。分段的目的是爲了更好地滿足用戶的需要。

·頁的大小固定且由系統決定,把邏輯地址劃分爲頁號和頁內地址兩部分,是由機器硬件實現的。段的長度不固定,且決定於用戶所編寫的程序,通常由編譯系統在對源程序進行編譯時根據信息的性質來劃分。

·頁式系統地址空間是一維的,即單一的線性地址空間,程序員只需利用一個標識符,即可表示一個地址。分段的作業地址空間是二維的,程序員在標識一個地址時,既需給出段名,又需給出段內地址。

 

 

 

 

      原理作業10. 頁式存儲管理和段式存儲管理的工作原理特點、特點
                  及優劣。

         答:頁式管理的基本思想是:爲了更好地利用分區存儲管理中
     所產生的"零頭"問題,允許把一個作業存放在不連續的內存塊中,
     又可以連續運行,它允許只調入用戶作業中常用部分,不常用部分
     不長期駐留內存,有效提高了內存的利用率。

   頁式存儲管理的工作原理:
   A、劃分實頁:將物理內存劃分成位置固定、大小相同的"塊"(實頁
        面)。
   B、劃分虛頁:將用戶邏輯地址空間也分成同樣大小的頁面,成爲虛
        擬空間的虛頁面。
   C、建立頁表:有時稱爲頁面表或頁面映射表(PMT)。每個作業一
        張,按虛頁號進行登記,其基本的內容有特徵位(表示該頁是否
        在內存、實頁號以及對應外存的地址。  
   D、地址變換:將虛頁面的邏輯地址轉化爲實頁面的物理地址,在程
        序執行時改變爲物理地址,屬於作業的動態重定位,一般由地址
        轉換機構(硬件)完成。

   特點:
   允許一個作業存放在不連續的內存塊中而又能保證作業連續得以運行
      ,既不需要移動內存中的信息,又可較好地解決零頭。

   優點:
   a、不要求作業存放在連續的內存塊中,有效地解決零頭。
   b、允許用戶作業不是一次集中裝入內存而是根據需要調入,作業中
        不常用部分不長期駐留內存,而本次運行的不用部分根本就不裝
        入內存。
   c、提供了虛存,使用戶作業地址空間不再受內存可用空間大小的限
        制。

     缺點:
     a、頁式管理在內存的共享和保護方面還欠完善。
     b、頁面大小相同,位置不能動態增加。
     c、往往需要多次缺頁中斷才能把所需的信息完整地調入內存。

         段式存儲管理的基本思想是:把程序按內容或過程(函數)關係
     分成段,每段有自己的名字。一個用戶作業或進程所包含的段對應於
     一個二維線性虛擬空間,也就是一個二維虛擬存儲器。段式管理程序
     以段爲單位分配內存,然後通過地址映射機構把段式虛擬存儲地址轉
     化爲內存中的實際地址。和頁式管理一樣,段式管理也採用只把那些
     經常訪問的段駐留內存,而把那些在將來一段時間內不被訪問的段放
     在外存,待需要時自動調入內存的方法實現二維虛擬存儲器。按照作
     業的邏輯單位--段,來分配內存,適合程序的邏輯結構,方便用戶設
     計程序。

     段式存儲管理的工作原理:
     A、採用二維地址空間,如段號(S)、頁號(P)和頁內單元號(D); 
     B、系統建兩張表格每一作業一張段表,每一段建立一張頁表,段表
        指出該段的頁表在內存中的位置;
     C、地址變換機構類似頁式機制,只是前面增加一項段號。

     特點:
     a、每一段分成若干頁,再按頁式管理,頁間不要求連續;
     b、用分段方法分配管理作業,用分頁方法分配管理內存;

     優點:
     便於段的共享和保護、段的動態增長以及動態連接。

     缺點:
     爲了消除零頭和允許段的動態增長,需要花費CPU的大量時間在內存
     中移動作業的分段,而且段的大小也給外存管理帶來困難。

內存的存儲管理--段式頁式管理的區別由華彩軟件站爲您最新收集整理,版權歸原作者或公司所有。如有侵權,請與我們聯繫刪除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章