- 硬盤的存儲(chǔ)結(jié)構(gòu)
- 硬盤的基本單位為扇區(qū)屹篓,每個(gè)扇區(qū)一般為512字節(jié)
- 一個(gè)硬盤有多個(gè)盤片抱虐,每個(gè)盤片有兩個(gè)盤面
- 每個(gè)盤面按照同心圓劃分為若干個(gè)磁道懦冰,每個(gè)磁道劃分為若干扇區(qū)
eg. 一個(gè)硬盤有2個(gè)盤片,每個(gè)盤片有65536個(gè)磁道内地,每個(gè)磁道有1024個(gè)扇區(qū)非凌,則硬盤的容量為:22655361024512 = 128GB
邏輯扇區(qū)
盤面上得同心圓周長(zhǎng)不一樣,若每個(gè)磁道劃分為相同數(shù)量扇區(qū),則外圍磁道密度比較稀疏,造成了浪費(fèi)勺像。但如果不同的磁道扇區(qū)數(shù)量不一樣,計(jì)算起來比較麻煩。為了屏蔽這些復(fù)雜的硬件細(xì)節(jié),現(xiàn)代硬盤采用一種叫做LBA(Logical Block Address)的方式,即整個(gè)硬盤所有扇區(qū)從0開始編號(hào)叫倍,一直到最后一個(gè)扇區(qū),這個(gè)扇區(qū)編號(hào)叫做邏輯扇區(qū)號(hào)豺瘤。邏輯扇區(qū)號(hào)去掉了復(fù)雜的磁道盤面的概念吆倦,當(dāng)給出一個(gè)邏輯扇區(qū)號(hào)時(shí),硬盤會(huì)將其轉(zhuǎn)換成實(shí)際的盤面坐求,磁道和扇區(qū)蚕泽。-
操作系統(tǒng)的存儲(chǔ)方式
例如Linux下有一個(gè)文件/home/user/test.dat長(zhǎng)度為8000字節(jié),那么在創(chuàng)建這個(gè)文件時(shí)桥嗤,Linux的ext3系統(tǒng)可能這樣保存這個(gè)文件: 文件的前4096個(gè)字節(jié)存儲(chǔ)在磁盤的10001007號(hào)扇區(qū)须妻,每個(gè)扇區(qū)512字節(jié)仔蝌,8個(gè)扇區(qū)4096個(gè)字節(jié);文件的第40978000字節(jié)總共3904個(gè)字節(jié)荒吏,存儲(chǔ)在2000~2007號(hào)扇區(qū)敛惊,這8個(gè)扇區(qū)也是4096字節(jié),只存儲(chǔ)了3094個(gè)字節(jié)的有效字節(jié)司倚,剩余192字節(jié)無效豆混。若把文件存儲(chǔ)看做一個(gè)鏈狀的結(jié)構(gòu)篓像,則如下圖所示:
文件系統(tǒng)保存了這些文件的存儲(chǔ)結(jié)構(gòu)动知,負(fù)責(zé)維護(hù)這些數(shù)據(jù)結(jié)構(gòu)并保證磁盤中的這些扇區(qū)能夠有效的組織和利用。 Example( 當(dāng)我們?cè)贚inux系統(tǒng)中要讀取文件中前4096字節(jié)時(shí):)
- Step1. 我們使用一個(gè)read的系統(tǒng)調(diào)用來實(shí)現(xiàn)
- Step2. 文件系統(tǒng)收到read請(qǐng)求之后员辩,判斷出文件的前4096個(gè)字節(jié)位于磁盤的1000~1007號(hào)邏輯扇區(qū)盒粮,然后向硬盤驅(qū)動(dòng)發(fā)出一個(gè)讀邏輯扇區(qū)1000號(hào)開始的8個(gè)扇區(qū)的請(qǐng)求
- Step3. 磁盤驅(qū)動(dòng)程序收到這個(gè)命令后向硬盤發(fā)出硬件命令(向硬件發(fā)送I/O命令的方式有很多種,常見的是通過讀寫I/O端口寄存器奠滑。在x86平臺(tái)上丹皱,公有65536個(gè)硬件端口寄存器,不同的硬件被分配到不同的I/O端口地址宋税,CPU提供兩條專門的指令
in
和out
來實(shí)現(xiàn)對(duì)硬件端口的讀寫) - Step4. 硬盤收到這個(gè)命令后摊崭,他就會(huì)執(zhí)行響應(yīng)的操作,并將數(shù)據(jù)讀取到事先設(shè)置好的內(nèi)存地址中(這里描述的只是最簡(jiǎn)單的情況杰赛,實(shí)際情況比這個(gè)復(fù)雜的多呢簸,驅(qū)動(dòng)程序必須考慮硬件的狀態(tài)如是否忙碌或出錯(cuò),調(diào)度和分配各個(gè)請(qǐng)求以達(dá)到最高的性能)
注:本文為作者閱讀《程序員的自我修養(yǎng)》
的讀書筆記