你好猜年,我是 shengjk1,多年大廠經(jīng)驗(yàn)恩敌,努力構(gòu)建 通俗易懂的恼策、好玩的編程語(yǔ)言教程。 歡迎關(guān)注潮剪!你會(huì)有如下收益:
- 了解大廠經(jīng)驗(yàn)
- 擁有和大廠相匹配的技術(shù)等
希望看什么涣楷,評(píng)論或者私信告訴我!
一抗碰、背景
其實(shí)也沒(méi)有啥背景狮斗。
最主要的原因就像 《30天自制操作系統(tǒng)》一書(shū)作者說(shuō)的那樣,寫(xiě)一個(gè)操作系統(tǒng)弧蝇,僅僅想想就是一件特別有趣的事情呢碳褒。一兩年前曾經(jīng)入手開(kāi)始寫(xiě)過(guò),但慢慢的就不了了之了】戳疲現(xiàn)在又有這個(gè)想法了沙峻,準(zhǔn)備一直干下去,最終寫(xiě)一個(gè)操作系統(tǒng)出來(lái)两芳,算是程序員生涯的一份禮物摔寨。
其次的原因,是因?yàn)槲乙舱J(rèn)為未來(lái)初級(jí)程序員的崗位會(huì)越來(lái)越少怖辆,借助 LLM 人人都是初級(jí)程序員可能會(huì)變成現(xiàn)實(shí)是复。這個(gè)時(shí)候?qū)I(yè)性和底層就會(huì)越來(lái)越重要
二、問(wèn)題起源
《30天自制操作系統(tǒng)》這本書(shū)的第一天有這樣的一段匯編代碼淑廊,其中有關(guān)系扇區(qū)大小的描述,完整的 code 如下:
; hello-os
; TAB=4
; 標(biāo)準(zhǔn)FAT12格式軟盤專用的代碼 Stand FAT12 format floppy code
DB 0xeb, 0x4e, 0x90; 引導(dǎo)扇區(qū)的一部分季惩,通常代表一種引導(dǎo)加載程序的開(kāi)頭。這三個(gè)字符通常出現(xiàn)在引導(dǎo)扇區(qū)開(kāi)頭画拾,作為引導(dǎo)程序的啟動(dòng)信號(hào)。整個(gè)引導(dǎo)扇區(qū)的結(jié)構(gòu)通常包含引導(dǎo)代碼碾阁、文件系統(tǒng)信息和卷信息。這些字節(jié)的組合是為了確保計(jì)算機(jī)在啟動(dòng)時(shí)能夠正確找到并執(zhí)行引導(dǎo)程序
DB "HELLOIPL" ; 啟動(dòng)扇區(qū)名稱(8字節(jié))
DW 512 ; 每個(gè)扇區(qū)(sector)大兄住(必須512字節(jié))
DB 1 ; 簇(cluster)大小(必須為1個(gè)扇區(qū))
DW 1 ; FAT起始位置(一般為第一個(gè)扇區(qū))
DB 2 ; FAT個(gè)數(shù)(必須為2)
DW 224 ; 根目錄大胁锨铡(一般為224項(xiàng))
DW 2880 ; 該磁盤大小(必須為2880扇區(qū)1440*1024/512)
DB 0xf0 ; 磁盤類型(必須為0xf0)
DW 9 ; FAT的長(zhǎng)度(必須是9扇區(qū))
DW 18 ; 一個(gè)磁道(track)有幾個(gè)扇區(qū)(必須為18)
DW 2 ; 磁頭數(shù)(必須是2)
DD 0 ; 不使用分區(qū)罪帖,必須是0
DD 2880 ; 重寫(xiě)一次磁盤大小
DB 0,0,0x29 ; 意義不明(固定)
DD 0xffffffff ; (可能是)卷標(biāo)號(hào)碼
DB "HELLO-OS " ; 磁盤的名稱(必須為11字節(jié),不足填空格)
DB "FAT12 " ; 磁盤格式名稱(必須是8字節(jié)邮屁,不足填空格)
RESB 18 ; 先空出18字節(jié)
; 程序主體
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 信息顯示部分
DB 0x0a, 0x0a ; 換行兩次
DB "hello, world"
DB 0x0a ; 換行
DB 0
RESB 0x1fe-$ ; 填寫(xiě)0x00直到0x001fe
DB 0x55, 0xaa
; 啟動(dòng)扇區(qū)以外部分輸出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
上述代碼要求整袁,每個(gè)扇區(qū)(sector)大小(必須512字節(jié))以及 簇(cluster)大杏恿摺(必須為1個(gè)扇區(qū))坐昙。所以對(duì)扇區(qū)有了很多好奇。
三芋忿、問(wèn)題答案
為什么之前的扇區(qū)大小為512字節(jié)呢炸客?這是1956年由industry trade organization, International Disk Drive Equipment和Materials Association三家機(jī)構(gòu)確定的行業(yè)標(biāo)準(zhǔn)【網(wǎng)上都是這么說(shuō)的,也沒(méi)有找到特別官方的依據(jù)戈钢,但可以肯定的是必然有行業(yè)標(biāo)準(zhǔn)】痹仙。
在早期的硬盤驅(qū)動(dòng)器中,扇區(qū)大小被設(shè)定為512字節(jié)殉了,這是因?yàn)楫?dāng)時(shí)計(jì)算機(jī)系統(tǒng)的內(nèi)存和處理能力有限开仰,因?yàn)榇疟P技術(shù)發(fā)展初期,存儲(chǔ)容量非常小。
四抖所、擴(kuò)展-關(guān)于機(jī)械硬盤需要知道的知識(shí)
機(jī)械硬盤HDD梨州,目前基本上已經(jīng)淘汰痕囱,都在用 SSD( 固態(tài)硬盤 )田轧,但因?yàn)闅v史原因,SSD 必然要兼容 HDD鞍恢,所以HDD有的概念傻粘,機(jī)械硬盤邏輯上都會(huì)有,比如扇區(qū)等
4.1 扇區(qū)的基本介紹
A:Track 磁盤磁道(粉紅色部分)
B:Geometrical sector 幾何學(xué)中的扇形(紫色部分)
C:Track sector 磁盤扇區(qū)(玫紅色部分)
D:Cluster 塊/簇(綠色部分)
在計(jì)算機(jī)磁盤存儲(chǔ)中帮掉,扇區(qū)是磁盤或光盤上磁道的細(xì)分弦悉。每個(gè)扇區(qū)存儲(chǔ)固定數(shù)量的用戶可訪問(wèn)數(shù)據(jù),傳統(tǒng)上蟆炊,硬盤(HDD)上的扇區(qū)大小為512字節(jié)稽莉,CD-ROM和DVD-ROM的扇區(qū)大小為2048字節(jié)。較新的硬盤(HDD)使用4096字節(jié)(4 KiB)扇區(qū)涩搓,這些扇區(qū)稱為高級(jí)格式(AF)污秆。
4.2 物理扇區(qū)和邏輯扇區(qū)
在探討物理扇區(qū)與邏輯扇區(qū)時(shí),必然要涉及扇區(qū)大小這一要素昧甘。近年來(lái)良拼,隨著硬盤容量需求的持續(xù)增長(zhǎng),為提高數(shù)據(jù)記錄密度庸推,硬盤制造商通常會(huì)采用增大扇區(qū)大小的方法浇冰,進(jìn)而出現(xiàn)了扇區(qū)大小為 4096 字節(jié)的硬盤肘习,此類扇區(qū)被定義為“物理扇區(qū)”。
然而蚓庭,應(yīng)當(dāng)注意的是器赞,這種大扇區(qū)存在兼容性問(wèn)題港柜,部分系統(tǒng)或軟件無(wú)法與之適配。為妥善解決這一問(wèn)題爽锥,硬盤內(nèi)部在邏輯層面將物理扇區(qū)劃分為多個(gè)扇區(qū)片段氯夷,并將這些片段作為普通扇區(qū)(通常大小為 512 字節(jié))呈現(xiàn)給操作系統(tǒng)及應(yīng)用軟件腮考,這些扇區(qū)片段即被稱為“邏輯扇區(qū)”踩蔚。在實(shí)際的讀寫(xiě)操作中馅闽,由硬盤內(nèi)的程序(固件)負(fù)責(zé)在邏輯扇區(qū)與物理扇區(qū)之間進(jìn)行轉(zhuǎn)換福也,上層程序無(wú)法感知物理扇區(qū)的存在柬姚。
邏輯扇區(qū)是硬盤接收讀寫(xiě)指令的最小操作單元量承,是操作系統(tǒng)及應(yīng)用程序可訪問(wèn)的扇區(qū),多數(shù)情況下其大小為 512 字節(jié)拿穴。通常而言默色,我們提及的扇區(qū)一般是指邏輯扇區(qū)腿宰。物理扇區(qū)是硬盤在底層硬件意義上的扇區(qū)吃度,是實(shí)際執(zhí)行讀寫(xiě)操作的最小單元贴硫,僅能由硬盤直接訪問(wèn),操作系統(tǒng)及應(yīng)用程序通常無(wú)法直接對(duì)其進(jìn)行訪問(wèn)间护。一個(gè)物理扇區(qū)可包含一個(gè)或多個(gè)邏輯扇區(qū)(例如汁尺,多數(shù)硬盤的物理扇區(qū)包含 8 個(gè)邏輯扇區(qū))均函。當(dāng)需要讀寫(xiě)某個(gè)邏輯扇區(qū)時(shí)菱涤,硬盤底層在實(shí)際操作中會(huì)對(duì)該邏輯扇區(qū)所在的整個(gè)物理扇區(qū)進(jìn)行讀寫(xiě)粘秆。
以上闡述的是 Windows 系統(tǒng)中的物理扇區(qū)和邏輯扇區(qū)相關(guān)內(nèi)容。此前在介紹機(jī)械硬盤時(shí)曾提到殷勘,由于歷史原因玲销,在操作系統(tǒng)等軟件中贤斜,512KB 扇區(qū)的概念已深入人心逛裤。新的機(jī)械硬盤雖已將物理扇區(qū)大小設(shè)為 4KB带族,但為實(shí)現(xiàn)與老系統(tǒng)的兼容蝙砌,必須引入邏輯扇區(qū)這一概念。在固態(tài)硬盤領(lǐng)域亦是如此恬总,盡管其每個(gè)物理頁(yè)大小在 2K 至 16K 之間不等越驻,但出于兼容性考慮缀旁,也必須設(shè)定邏輯扇區(qū)。
4.3 塊/簇
塊(Block)/簇(Cluster)是邏輯層面的概念目木,確切地說(shuō)刽射,是一種虛擬構(gòu)造的概念誓禁,二者分別與 Linux 和 Windows 操作系統(tǒng)中的相應(yīng)概念相對(duì)應(yīng)摹恰。值得注意的是怒见,部分文獻(xiàn)資料將其稱作磁盤塊/磁盤簇遣耍,在此處,我們統(tǒng)一以塊(Block)/簇來(lái)命名酣溃。
在 Unix 和 Linux 系統(tǒng)中救拉,塊(Block)是操作系統(tǒng)中邏輯存儲(chǔ)的最小單元亿絮。從操作系統(tǒng)與磁盤交互的角度來(lái)看麸拄,塊(Block)是其交互操作的最小單位拢切。
在 Windows 系統(tǒng)下的 NTFS 等文件系統(tǒng)中淮椰,相應(yīng)概念為簇纳寂。每個(gè)簇可包含 2毙芜、4腋粥、8架曹、16绑雄、32、64……2 的 n 次方個(gè)扇區(qū)纵竖。這種扇區(qū)數(shù)量的設(shè)定體現(xiàn)了文件系統(tǒng)在存儲(chǔ)管理上的靈活性和多樣性,是根據(jù)不同的設(shè)計(jì)需求和優(yōu)化目標(biāo)而確定的珊楼,對(duì)于理解文件系統(tǒng)的存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)組織方式具有重要意義度液。
如下所示堕担,Windows下C 盤的Cluster的大小為4Kb大小霹购,如下所示:
塊(Block)/簇(Cluster)的存在:
1. 讀取方便:由于扇區(qū)的Size比較小齐疙,數(shù)目眾多時(shí)尋址時(shí)比較困難贞奋,所以操作系統(tǒng)就將相鄰的扇區(qū)組合在一起,形成一個(gè)塊特愿,再對(duì)塊進(jìn)行整體的操作。
- 分離對(duì)底層的依賴:操作系統(tǒng)忽略對(duì)底層物理存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì)宗收。通過(guò)虛擬出來(lái)磁盤塊的概念混稽,在系統(tǒng)中認(rèn)為塊是最小的單位匈勋。
4.4 linux 和 window系統(tǒng)
4.4.1 linux 系統(tǒng)
在 Linux 系統(tǒng)的語(yǔ)境下膳叨,塊(Block)菲嘴,即邏輯塊,是文件系統(tǒng)層級(jí)的關(guān)鍵概念昭雌。文件系統(tǒng)在數(shù)據(jù)讀取過(guò)程中烛卧,不會(huì)以扇區(qū)為單位逐個(gè)進(jìn)行总放,原因在于這種方式效率極其低下。而且好爬,扇區(qū)尺寸較小存炮,當(dāng)扇區(qū)數(shù)量眾多時(shí)僵蛛,尋址操作會(huì)面臨相當(dāng)大的困難。
基于此飘言,文件系統(tǒng)是以塊為單位來(lái)讀取數(shù)據(jù)的姿鸿。確切地說(shuō),塊(Block)構(gòu)成了文件系統(tǒng)存取數(shù)據(jù)的最小單元句狼,其常規(guī)大小為 4KB(值得注意的是腻菇,此值在格式化分區(qū)階段可按需修改)昔馋。
從硬件操作層面來(lái)看秘遏,讀取一個(gè)塊,意味著從硬件設(shè)備讀取一個(gè)或多個(gè)扇區(qū)洋侨。在存儲(chǔ)規(guī)則上希坚,一個(gè)塊僅能容納一個(gè)文件的內(nèi)容吏够,無(wú)論該文件大小如何滩报。一個(gè)文件可能占用一個(gè)或多個(gè)塊脓钾,并且每讀取一個(gè)塊可训,就會(huì)產(chǎn)生一次磁盤 I/O 操作握截。若要對(duì)磁盤 I/O 性能進(jìn)行優(yōu)化烂叔,理想的策略是在一次 I/O 操作中盡可能讀取更多的數(shù)據(jù)蒜鸡。然而胯努,塊的大小并非越大越好,需要依據(jù)具體業(yè)務(wù)場(chǎng)景進(jìn)行合理設(shè)置蒲讯。
不妨設(shè)想這樣一種情況判帮,若塊的大小設(shè)定為 8KB溉箕,而系統(tǒng)中存在大量?jī)H為 1KB 大小的小文件约巷。由于一個(gè)塊只能存放一個(gè)文件的內(nèi)容,這種情況必然會(huì)導(dǎo)致嚴(yán)重的空間浪費(fèi)踩麦。在這種情形下氓癌,若大量小文件并存贪婉,不僅會(huì)造成存儲(chǔ)空間的低效利用,增加磁盤空間的消耗才顿,還可能對(duì)文件系統(tǒng)的整體性能產(chǎn)生負(fù)面影響尤蒿。例如腰池,在讀取小文件時(shí),由于需要加載整個(gè)較大的塊讳侨,響應(yīng)時(shí)間可能會(huì)延長(zhǎng)跨跨。因此拍皮,在確定塊大小的過(guò)程中跑杭,需要全面綜合考慮系統(tǒng)內(nèi)文件的大小分布德谅、訪問(wèn)模式以及存儲(chǔ)設(shè)備的特性等多方面因素窄做,從而實(shí)現(xiàn)性能和空間利用率的最優(yōu)平衡慰技。
4.4.2 window 系統(tǒng)
在 Windows 系統(tǒng)的范疇內(nèi)吻商,磁盤簇具有特殊意義。扇區(qū)作為磁盤最小的物理存儲(chǔ)單元乌叶,因其數(shù)量巨大准浴,操作系統(tǒng)無(wú)法對(duì)其進(jìn)行有效尋址捎稚。于是,操作系統(tǒng)通過(guò)將相鄰扇區(qū)組合的方式形成簇葡公,并以此為對(duì)象開(kāi)展管理工作匾南。每個(gè)簇可包含 2蛔外、4夹厌、8矛纹、16或南、32 或 64 個(gè)扇區(qū)。顯然采够,簇屬于操作系統(tǒng)運(yùn)用的邏輯概念蹬癌,與磁盤自身的物理屬性并無(wú)關(guān)聯(lián)。
從磁盤空間管理和數(shù)據(jù)讀取效率的角度來(lái)看隅要,為了實(shí)現(xiàn)更卓越的管理效能和更高效的數(shù)據(jù)讀取步清,操作系統(tǒng)制定了嚴(yán)格的規(guī)則:一個(gè)簇中僅能容納一個(gè)文件的內(nèi)容虏肾。這就導(dǎo)致文件所占用的空間必然是簇的整數(shù)倍。即便某個(gè)文件的實(shí)際大小小于一簇崖瞭,它仍然要占據(jù)一整簇的空間书聚。因此藻雌,在通常情形下胯杭,文件所占空間會(huì)稍大于其實(shí)際大小做个。只有在極為特殊的情況下,即文件實(shí)際大小恰好為簇的整數(shù)倍時(shí)顽频,文件實(shí)際大小才會(huì)與所占空間完全相符糯景。
這種以簇作為最小分配單位的機(jī)制,雖然在一定程度上簡(jiǎn)化了硬盤數(shù)據(jù)管理流程最住,但也不可避免地引發(fā)了磁盤空間的浪費(fèi)問(wèn)題涨缚。特別是當(dāng)小文件數(shù)量眾多時(shí)仗岖,在一個(gè)容量達(dá)上千兆的大型硬盤中轧拄,由此導(dǎo)致的磁盤空間浪費(fèi)量可達(dá)上百兆字節(jié)之巨檩电。這種空間浪費(fèi)現(xiàn)象對(duì)于磁盤空間的高效利用形成了顯著挑戰(zhàn)俐末,在存儲(chǔ)規(guī)劃與文件管理過(guò)程中必須予以充分考量奄侠。同時(shí)垄潮,在不同的應(yīng)用場(chǎng)景和存儲(chǔ)需求下,應(yīng)當(dāng)合理抉擇文件系統(tǒng)類型旅急,并對(duì)簇的大小進(jìn)行科學(xué)設(shè)置藐吮,以此在管理便利性與空間利用率之間達(dá)成平衡逃贝,保障系統(tǒng)存儲(chǔ)資源的優(yōu)化配置。
五潦闲、總結(jié)
本文是討論有關(guān)扇區(qū)的知識(shí)和了解關(guān)于操作系統(tǒng)的硬盤空間管理的簡(jiǎn)短討論。希望通過(guò)閱讀這篇文章和敬,大家能對(duì)扇區(qū)昼弟、簇等概念有更深入的了解奕筐,同時(shí)也能對(duì)操作系統(tǒng)如何管理硬盤空間有更清晰的認(rèn)識(shí)。