電梯引發的思考
有了孩子之後,精力確實有限。珍惜現在的所有的所謂的悠閑時光吧。
之前在婦幼醫院看過電梯,上面寫著:
層層都停,
單層停靠,
雙層停靠,
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磁道的第一磁頭下的所有扇區。
然後,是同一柱面的下一磁頭,……,一個柱面存儲滿後就推進到下一個柱面,直到把文件內容全部寫入磁盤。
按照柱面來寫數據,電子控制磁頭,寫到下一柱面才會有機械控制磁頭。減少了頻繁尋道時間。
讀取數據:
根據文件存儲的 三維坐標:柱面、磁頭和扇區確認數據的起始位置。磁頭控制器選擇對應的磁頭步進到相應的柱面上,然後等待旋轉過來的對應的磁區。
校驗坐標,根據讀寫標識轉換電極,進行相應的讀取操作。
局部性原理和數據預讀取:
這裏主要指的是空間局部性原理,思想是與數據相鄰的數據用到的概率比較大,所以讀取數據時會將此數據的一定的相鄰數據一並都取出來,也就是數據預讀取。
電梯引發的思考