磁碟的訪問時間由以下三部分組成:s=
m∗n+
s,
mt_s = m * n + s, m
ts=m∗
n+s,
m 移動一條磁軌所花費的時間r=
1/(2
∗r
)t_r = 1 / (2*r)
tr=1/
(2∗r
) t=
b/(r
∗n
)t_t = b / (r*n)
tt=b/
(r∗n
)而一般來說磁碟訪問耗時最多的部分就是尋道時間,所以磁碟排程演算法都是基於改進尋道時間的。
fcfs 先來先服務演算法
最原始的排程演算法,簡單公平,但是效率不高。
sstf 最短尋道時間(shortest seek time first)
優先選擇距當前磁頭最近的訪問請求進行服務,主要考慮尋道優先。這樣一定程度上提高了效率,但是容易使得磁頭總在磁碟的一段區域內來回尋道(即有點像陷入區域性最優解了),致使某些訪問請求長時間得不到服務。
scan 演算法(電梯排程)
當有訪問請求時,磁頭按乙個方向移動,在移動過程中對遇到的訪問請求進行服務,然後判斷該方向上是否還有訪問請求,如果有則繼續掃瞄;否則改變移動方向,並為經過的訪問請求服務,如此反覆。就像電梯先按乙個方向接(送)完人,再調轉方向。
優點:克服了最短尋道優先的缺點,既考慮了距離,同時又考慮了方向。
缺點:仍然是擺動式的掃瞄演算法,兩側磁軌被訪問的頻率低於中間。
c-scan 迴圈掃瞄演算法
在 scan 演算法上進行改變,磁頭到達最裡層時或者已經處理完最裡面的請求的時候,不再是簡單調轉方向往回掃瞄,而是直接快速回到最外層柱面,重新向里掃瞄。這樣就使得兩側磁軌被訪問的頻率就於中間的一致了。
相比於使用單獨一塊大容量磁碟,使用一組小磁碟組成的磁碟陣列(總容量上相等)進行儲存有以下優點:
但是磁碟陣列也有其缺點,試想一下:乙個磁碟使用 100000 小時後有很大概率就損壞了,但是如果是由 100 個磁碟組成的磁碟組,那麼同樣的概率出現乙個磁碟損壞的時間就變成了 100000/100 = 1000 小時。所以,使用磁碟陣列就無法迴避磁碟損壞帶來的資料不可靠的問題。不過通過引入映象冗餘與校驗碼的概念,可以較好地解決這個問題。映象冗餘比較好理解,最簡單的做法就是將磁碟的資料原封不動地拷貝到另乙個冗餘磁碟上。
校驗碼這裡只簡單介紹一下校驗碼的原理,以奇偶校驗(除了 raid2 以外都使用奇偶校驗)為例。
奇偶校驗分為偶校驗、奇校驗兩種。
可以看出,奇偶校驗都是基於資料位之間的異或運算。而異或運算所有具有的特性將會幫助我們實現資料恢復。
所以若將 a、b、c、d 看作磁碟陣列中四個不同磁碟上的資料,前三個為儲存的資料,後乙個為他們的校驗,那麼碰到乙個資料出錯的時候,我們就可以使用剩下三個資料的異或來恢復另乙個的資料。
小結由於 raid 的種類太多,這裡只簡單介紹一下它的核心思想:條帶化(並行讀寫)、映象(冗餘)、校驗,以及使用 raid 的好處有哪些,相信了解了這些之後,再去看具體的 raid 就要好理解的多了。
OS 磁碟排程演算法
c 實現的 fcfs sstf scan 和 cscan 四種磁碟排程演算法。磁碟排程演算法 by darius include include include define max 1000 using namespace std 求平均尋道長度 double erage int length,i...
檔案使用磁碟的實現 OS
通過檔案使用磁碟,如下 在fs read write.c中 int sys write int fd,const char buf,int count fd為檔案索引,buf為緩衝區,count表示要處理的字串長度 我們理一下file write的工作過程 file write inode,file...
OS 記憶體管理(1)
本作品採用知識共享署名 相同方式共享 4.0 國際許可協議進行許可。1.記憶體管理概要,功能,記憶體保護 2.程式的裝入 載入 和鏈結 3.問題 能夠裝入記憶體任何位置的 程式必須是可動態繫結 重定位的?4.練習 重點討論第三點問題,關於重定位,動態繫結的問題。簡要介紹記憶體管理和程式執行前經過的步...