1.進程間的通信與調度
1.1進程間的通信(Inter Process Communication)
生產者消費者問題
數據存到有界緩衝區bounded-buffer中,設置count記錄緩衝區的數據量,如果緩衝區滿count=size,讓生產者睡眠;如果緩衝區爲空count=0,讓消費者睡眠。
解決方法:
(1)用信號量(semaphore)
需要三個信號量:full記錄充滿緩衝區數目,empty記錄空的緩衝區數目。mutex用來保證任意時刻只有一個進程讀寫緩衝區變量。
(2)用互斥量(mutex)
是沒有信號量基數能力的簡化版,僅適用於管理共享資源或一小段代碼。互斥量處於兩態之一的變量:解鎖和加鎖
(3)用消息傳遞(message passing)
(4)用屏障(barrier)
1.2 程序/進程的調度
臨界資源:一次只能被一個進程訪問的共享資源。
衡量調度的標準:吞吐量(系統每小時完成的作業量)和週轉時間(批處理作業用時)
進程調度算法
(1)實時系統一般用非搶佔式——先來先服務
交互式系統用搶佔式:
(2)輪傳時間片:時間片設置太長會讓短交互的時間過長,時間片設置太短切換開銷大,降低CPU效率
(3)優先級調度
(4)多級隊列
(5)最短進程優先
(6)彩票調度
2. 操作系統的內存管理
2 .1 內存管理之內存分配方法
2.1.1 單一連續分配
單用戶單進程時把內存分爲系統區和用戶區兩部分。
2.1.2 固定分區分配法
給不同程序固定大小的內存空間
2.1.3 動態分區分配算法
動態分區空閒鏈:雙向鏈表,節點需記錄可
(1)首次適應(FF算法)
每次都從頭開始順序查找適合的內存區(容易造成表頭碎片化,後期優化成循環適應,每次分配都從上次檢索結束的位置開始查內存)
(2)最佳適應(BF算法)
把分區空閒鏈的節點按大小排序,每次選大小最相近的內存區
(3)快速適應(QF算法)
把整個內存分成多個空閒鏈表,每個空閒鏈表存儲一種容量的空閒區。每次都能快速找到空閒鏈表。
操作系統如何管理進程的內存空間?
2.2 內存管理之虛擬內存
虛擬內存爲何出現?程序/進程內存超過了物理內存的容量,且一臺機器往往要跑多個程序/進程。
虛擬內存技術實現前提——程序的局部性原理:CPU訪問存儲器時,無論是存取指令還是存取數據,所訪問的存儲單元都趨向於聚集在一個較小的連續區域中。
高速緩存的替換時機 VS 主存缺頁的替換時機:
虛擬內存的置換算法(和高速緩存的置換算法一樣)
2.2.1 FIFO
利用一個雙向鏈表保存數據,當來了新的數據之後便添加到鏈表末尾,如果Cache存滿數據,則把鏈表頭部數據刪除,然後把新的數據添加到鏈表末尾。
在訪問數據的時候,如果在Cache中存在該數據的話,則返回對應的value值;否則返回-1。如果想提高訪問效率,可以利用hashmap來保存每個key在鏈表中對應的位置。
2.2.2 LFU(least recently used)
2.2.3 LRU(least recently used)