有了孩子之後,精力確實有限。珍惜現在的所有的所謂的悠閒時光吧。
之前在婦幼醫院看過電梯,上面寫著:
層層都停,
單層停靠,
雙層停靠,
1-8層停靠,
醫院人多滿載後就不開門了。
還有我們經常見的高層電梯,低層電梯。
我就想閒下來的時候寫個電梯控制的小程式。彌補一下空虛的心靈。
夜深人靜的晚上我就在想,如果讓我寫我會怎麼寫?
客戶端(也就是各個樓梯層上的上下按鈕)傳送指令?
總控中心入隊指令?控制電梯執行?
如果是4部電梯,採用什麼演算法來控制電梯?
如果睡眠時,電梯停在哪裡?
我想:
- 設計頂層一部,一樓一部,其他的都停靠在中間層?
- 還是說,都全部停靠在同一樓層?
- 還是說,執行到那個樓層就在哪裡停靠?
- 為什麼我按下了5樓,從16層下來比較快的電梯不拉我?從14層下來比較慢的電梯才拉我?
思考過了這個問題,果斷搜尋一下電梯執行演算法,看到是電梯執行類似於都寫演算法。繼續搜尋硬碟讀寫演算法:
一、硬碟排程演算法
硬碟的讀寫演算法,主要是分為4類演進:
1、先來先服務演算法(FCFS):
這個也是最容易想到最簡單的演算法,一個佇列接收命令,先進先出原則進行讀寫處理。
我們也知道硬碟讀寫需要尋道,這種簡單暴力的演算法,對尋道沒有優化,致使響應時間過長。
2、最短尋道時間優先演算法(SSTF):
為了解決尋道演算法,那我每次都處理離我最近的指令就行了,這樣尋道最短,時間也就最短,我可以很快滴給出相應。
如果請求併發較大,我可能對離我較遠的指令處理不及時甚至很長時間才能給出相應。
因為我們需要很長時間在一個地方將請求處理完才能移動到下個位置。
3、掃描演算法(SCAN):
那我既要兼顧尋道最短,還要儘量避免磁頭方向的轉換,造成的飢餓現象的出現。
那我就按照磁頭方向尋找離我最近的並且是同一方向的請求。這樣一點一點向邊緣移動。
這個演算法和電梯排程演算法類似,所以可以稱之為電梯演算法。
如果我從中間的請求開始處理,磁頭一次一次向外邊緣推進來處理請求。當我到達最外邊緣時,磁頭調轉方向向內邊緣進攻。
這裡的問題是,裡我身後越近請求越少,因為我剛剛處理過。極有可能是理我較遠的磁軌有請求指令的概率比較大數量比較多。
根據正態分佈規律,落在中間的概率大於落在兩端的概率。這樣還是會出現兩邊請求處理不及時的問題。
4、迴圈掃描演算法(CSCAN):
根據以上問題,我們進行優化,磁頭的處理方向只能是一個方向,比如從裡到外執行。
當我到達最外邊緣的磁軌,我掉頭返回到最裡面的磁軌,然後還是向外處理請求。
請求命令一直是從小到大排序讓最小的磁軌緊挨著最大磁軌,這樣就會磁頭從裡到外迴圈處理。既保證了尋道最短,也確保了請求處理的及時。
看到硬碟的讀寫演算法,之前對硬碟的讀寫原理比較模糊,也是比較好奇硬碟怎麼就能將資料寫到磁碟上,並進行讀取的?那就再看看硬碟是怎麼讀寫的。
二、硬碟組成
說到硬碟,硬體了嘛,先看看硬碟的組成,看圖:
碟片、磁頭、碟片主軸、控制電機、磁頭控制器、資料轉換器、介面、快取
看到這,我帶著一些疑問打算再深入瞭解一下這些構造:
總的來說,磁碟上有很多的磁柱,磁柱上有很多的磁軌,磁軌上劃分了很多的扇區。
碟片:每個碟片都有一個讀寫磁頭,因為N個碟片兩面都可以讀寫資料,所以就有2N個盤面,2N個磁頭。
磁頭由上到下從0開始編號,當然也對應著對應的盤面編號。現在我們有盤面編號了。
磁柱:所有盤面的同一磁軌形成的圓柱。
磁軌:以主軸馬達為中心,碟片上的同心圓環。最外側磁軌是0,最裡側的是磁頭歸位不儲存資料。
Q:磁軌為什麼最外側是0號而不是最內側為0?
A:因為當時老式磁碟設計每個磁軌上的磁區是一樣的,也就是說裡側的資料分佈密度大,
外側的資料分佈密度小,密度小資料相對來說安全。
定位0磁軌:就是磁頭夢開始和夢結束的地方,讀取資料讀取完畢磁頭休息的地方。
物理0磁軌:0柱面,0磁軌,1扇區。這個厲害了,物理0磁軌只是一個扇區,它是磁碟的第一個物理扇區,也就是第一個實體地址。
那麼它來幹什麼呢?MBR載入程式和分割槽表資訊都儲存在這。硬碟低階格式化從這開始。
邏輯0磁軌:硬碟的第一個邏輯扇區,一般在0柱面,1磁頭,1磁軌,系統讀寫時的第一個扇區。硬碟高階格式化從這開始。
Q:什麼是低階格式化?什麼是高階格式化?
A:低階格式化就是硬碟廠商將空白的磁碟劃分出柱面和磁軌,再將磁軌劃分為若干個扇區,每個扇區又劃分出標識部分ID、間隔區GAP和資料區 DATA等。
高階格式化就是清除硬碟上的資料、生成引導區資訊、初始化FAT表、標註邏輯壞道等。比如重灌系統分割槽,比如手動格式化分割槽。
扇區:一小段磁軌弧線,每個磁區一般會攜帶0.5KB資料。扇區是磁碟中最小的物理儲存單位。
Q:為什麼每個扇區是0.5KB?
A:現在硬碟廠商會提供4k大小扇區
老式是512bit,新式為了擴大容量是4096bit(4KB),但是為了相容系統,將4KB模擬成8個512bit.
磁碟塊: 作業系統中最小的邏輯儲存單位。windows上叫簇,linux叫塊。將幾個相鄰的扇區合併一起組成邏輯磁碟塊,便於作業系統管理扇區和硬碟定址。
磁碟塊是檔案系統操作檔案的基本單位。扇區是硬碟基本單位。
因為存在邏輯儲存單位和物理儲存單位的對映,所以磁頭控制器另一個功能是負責兩者的對映關係。
4K對齊:之前是512,需要物理扇區和邏輯塊進行對映關係。
對於現在的4KB硬碟,以windows為例,NTFS檔案系統的預設邏輯分割槽是4KB(比武我們格式化硬碟,會有檔案系統和預設分配單元大小)
這樣物理扇區和邏輯塊一一對應,可以加快硬碟的讀取速度。
作業系統經常與記憶體和硬碟這兩種儲存裝置進行通訊,類似於“塊”的一種虛擬的基本單位。記憶體操作--頁;硬碟--塊。
三、硬碟讀寫原理
寫資料:
系統將檔案儲存到磁碟上時,按柱面、磁頭、扇區的方式進行,即最先是第0磁軌的第一磁頭下的所有扇區。
然後,是同一柱面的下一磁頭,……,一個柱面儲存滿後就推進到下一個柱面,直到把檔案內容全部寫入磁碟。
按照柱面來寫資料,電子控制磁頭,寫到下一柱面才會有機械控制磁頭。減少了頻繁尋道時間。
讀取資料:
根據檔案儲存的 三維座標:柱面、磁頭和扇區確認資料的起始位置。
磁頭控制器選擇對應的磁頭步進到相應的柱面上,然後等待旋轉過來的對應的磁區。
校驗座標,根據讀寫標識轉換電極,進行相應的讀取操作。
區域性性原理和資料預讀取:
這裡主要指的是空間區域性性原理,思想是與資料相鄰的資料用到的概率比較大。
所以讀取資料時會將此資料的一定的相鄰資料一併都取出來,也就是資料預讀取。