计算机基础- -认识磁盘
計算機(jī)基礎(chǔ)- -認(rèn)識磁盤
文章目錄
- 計算機(jī)基礎(chǔ)- -認(rèn)識磁盤
- 一、認(rèn)識磁盤
- 程序不讀入內(nèi)存就無法運(yùn)行
- 二、磁盤構(gòu)件
- 1.磁盤緩存
- 2.虛擬內(nèi)存
- 虛擬內(nèi)存與內(nèi)存的交換方式
- 三、節(jié)約內(nèi)存
- 1.通過DLL文件實現(xiàn)函數(shù)共有
- 2.通過調(diào)用_stdcall來減少程序文件的大小
- 3.磁盤的物理結(jié)構(gòu)
一、認(rèn)識磁盤
- 首先,磁盤和內(nèi)存都具有存儲功能,它們都是存儲設(shè)備。
- 區(qū)別在于:
- 內(nèi)存是通過電流來實現(xiàn)存儲;磁盤則是通過磁記錄技術(shù)來實現(xiàn)存儲。
- 內(nèi)存是一種高速,造假昂貴的存儲設(shè)備;而磁盤則是速度較慢、造假低廉的存儲設(shè)備
- 電腦斷電后,內(nèi)存中的數(shù)據(jù)會丟失,而磁盤中的數(shù)據(jù)可以長久保留。
- 內(nèi)存是屬于內(nèi)部存儲設(shè)備,硬盤是屬于外部存儲設(shè)備。
- 一般在我們的計算機(jī)中,磁盤和內(nèi)存是相互配合共同作業(yè)的。一般內(nèi)存指的就是主存(負(fù)責(zé)存儲CPU中運(yùn)行的程序和數(shù)據(jù)) ;
早期的磁盤指的是軟磁盤(softdisk,簡稱軟盤)就是下面這個:
如今常用的磁盤是硬磁盤(harddisk, 簡稱硬盤) , 就是下面這個
程序不讀入內(nèi)存就無法運(yùn)行
- 在了解磁盤前,還需要了解一下內(nèi)存的運(yùn)行機(jī)制是怎樣的,我們的程序被保存在存儲設(shè)備中,通過使用CPU讀入來實現(xiàn)程序指令的執(zhí)行。
- 這種機(jī)制稱為存儲程序方式, 現(xiàn)在看來這種方式是理所當(dāng)然的, 但在以前程序的運(yùn)行都是通過改變計算機(jī)的布線來讀寫指令的。
- 計算機(jī)最主要的存儲部件是內(nèi)存和磁盤。磁盤中存儲的程序必須加載到內(nèi)存中才能運(yùn)行,在磁盤中保存的程序是無法直接運(yùn)行的, 這是因為負(fù)責(zé)解析和運(yùn)行程序內(nèi)容的CPU是需要通過程序計數(shù)器來指定內(nèi)存地址從而讀出程序指令的。
二、磁盤構(gòu)件
1.磁盤緩存
- 我們上面提到,磁盤往往和內(nèi)存是互利共生的關(guān)系,相互協(xié)作,彼此持有良好的合作關(guān)系。
- 每次內(nèi)存都需要從磁盤中讀取數(shù)據(jù),必然會讀到相同的內(nèi)容,所以一定會有一個角色負(fù)責(zé)存儲我們經(jīng)常需要讀到的內(nèi)容。
- 我們大家做軟件的時候經(jīng)常會用到緩存技術(shù),那么硬件層面也不例外,磁盤也有緩存,磁盤的緩存叫做磁盤緩存。
- 磁盤緩存指的是把從磁盤中讀出的數(shù)據(jù)存儲到內(nèi)存的方式,這樣一來,當(dāng)接下來需要讀取相同的內(nèi)容時,就不會再通過實際的磁盤,而是通過磁盤緩存來讀取。
某一種技術(shù)或者框架的出現(xiàn)勢必要解決某種問題的,那么磁盤緩存就大大改善了磁盤訪問的速度。
- Windows操作系統(tǒng)提供了磁盤緩存技術(shù), 不過, 對于大部分用戶來說是感受不到磁盤緩存的, 并且隨著計算機(jī)的演進(jìn), 對硬盤的訪問速度也在不斷演進(jìn), 實際上磁盤緩存到Windows 95/98就已經(jīng)不怎么使用了。
- 把低速設(shè)備的數(shù)據(jù)保存在高速設(shè)備中, 需要時可以直接將其從高速設(shè)備中讀出, 這種緩存方式在web中應(yīng)用比較廣泛, web瀏覽器是通過網(wǎng)絡(luò)來獲取遠(yuǎn)程web服務(wù)器的數(shù)據(jù)并將其顯示出來。
- 因此, 在讀取較大的圖片的時候, 會耗費(fèi)不少時間, 這時web瀏覽器可以把獲取的數(shù)據(jù)保存在磁盤緩存中, 然后根據(jù)需要顯示數(shù)據(jù),再次讀取的時候就不用重新加載了。
2.虛擬內(nèi)存
- 虛擬內(nèi)存是內(nèi)存和磁盤交互的第二個媒介。
- 虛擬內(nèi)存是指把磁盤的一部分作為假想內(nèi)存來使用。這與磁盤緩存是假想的磁盤(實際上是內(nèi)存)相對,虛擬內(nèi)存是假想的內(nèi)存(實際上是磁盤)。
- 虛擬內(nèi)存是計算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)可用的內(nèi)存(一個完整的地址空間),但是實際上,它通常被分割成多個物理碎片,還有部分存儲在外部磁盤管理器上,必要時進(jìn)行數(shù)據(jù)交換。
- 計算機(jī)中的程序都要通過內(nèi)存來運(yùn)行,如果程序占用內(nèi)存很大,就會將內(nèi)存空間消耗殆盡。
- 為了解決這個問題, WINDOWS操作系統(tǒng)運(yùn)用了虛擬內(nèi)存技術(shù), 通過拿出一部分硬盤來當(dāng)作內(nèi)存使用, 來保證程序耗盡內(nèi)存仍然有可以存儲的空間。
- 虛擬內(nèi)存在硬盤上的存在形式就是PAGE FILE.SYS這個頁面文件。
- 通過借助虛擬內(nèi)存,在內(nèi)存不足時仍然可以運(yùn)行程序。例如,在只剩5MB內(nèi)存空間的情況下仍然可以運(yùn)行10MB的程序。
- 由于CPU只能執(zhí)行加載到內(nèi)存中的程序, 因此, 虛擬內(nèi)存的空間就需要和內(nèi)存中的空間進(jìn)行置換(swap),然后運(yùn)行程序。
虛擬內(nèi)存與內(nèi)存的交換方式
- 剛才我們提到虛擬內(nèi)存需要和內(nèi)存中的部分內(nèi)容做置換才可讓CPU繼續(xù)執(zhí)行程序, 那么做置換的方式是怎樣的呢?又分為哪幾種方式呢?
- 虛擬內(nèi)存和內(nèi)存中的部分內(nèi)容做置換的方法有分頁式和分段式兩種。
- Windows采用的是分頁式。該方式是指在不考慮程序構(gòu)造的情況下,把運(yùn)行的程序按照一定大小的頁進(jìn)行分割,并以頁為單位進(jìn)行置換。
- 在分頁式中,我們把磁盤的內(nèi)容讀到內(nèi)存中稱為Page In, 把內(nèi)存的內(nèi)容寫入磁盤稱為Page Out
- Windows計算機(jī)的頁大小為4KB, 也就是說, 需要把應(yīng)用程序按照4KB的頁來進(jìn)行切分, 以頁(page) 為單位放到磁盤中,然后進(jìn)行置換。
- 為了實現(xiàn)內(nèi)存功能, Windows在磁盤上提供了虛擬內(nèi)存使用的文件(page fle, 頁文件) 。該文件由Windows生成和管理, 文件的大小和虛擬內(nèi)存大小相同, 通常大小是內(nèi)存的1-2倍。
三、節(jié)約內(nèi)存
- Windows是以圖形界面為基礎(chǔ)的操作系統(tǒng)。它的前身是MS-DOC, 最初的版本可以在128kb的內(nèi)存上運(yùn)行程序, 但是現(xiàn)在想要Windows運(yùn)行流暢的花至少要需要512MB的內(nèi)存, 但通常往往是不夠的。
- 也許許多人認(rèn)為可以使用虛擬內(nèi)存來解決內(nèi)存不足的情況,而虛擬內(nèi)存確實能夠在內(nèi)存不足的時候提供補(bǔ)充, 但是使用虛擬內(nèi)存的Page In和Page Out通常伴隨著低速的磁盤訪問, 這是一種得不償失的表現(xiàn)。
- 所以虛擬內(nèi)存無法從根本上解決內(nèi)存不足的情況。為了從根本上解決內(nèi)存不足的情況,要么是增加內(nèi)存的容量,加內(nèi)存條;要么是優(yōu)化應(yīng)用程序,使其盡可能變小。
- 第一種建議往往需要衡量口袋的銀子,所以我們只關(guān)注第二種情況。
1.通過DLL文件實現(xiàn)函數(shù)共有
-
DLL(Dynamic Link Library)文件,是一種動態(tài)鏈接庫文件,顧名思義,是在程序運(yùn)行時可以的文件。
-
此外, 多個應(yīng)用可以共有同一個DLL文件。而通過動態(tài)加載Library(函數(shù)和數(shù)據(jù)的集合)共有一個DLL文件則可以達(dá)到節(jié)約內(nèi)存的效果。
-
例如, 假設(shè)我們編寫了一個具有某些處理功能的函數(shù)MyFunc() 。應(yīng)用A和應(yīng)用B都需要用到這個函數(shù), 然后在各自的應(yīng)用程序中內(nèi)置MyFunc((這個稱為Static Link, 靜態(tài)鏈接)
-
然后同時運(yùn)行兩個應(yīng)用,內(nèi)存中就存在了同一個函數(shù)的兩個程序,這會造成資源浪費(fèi)
-
為了改變這一點(diǎn), 使用DLL文件而不是應(yīng)用程序的執(zhí)行文件(EXE文件) 。因為同一個DLL文件內(nèi)容在運(yùn)行時可以被多個應(yīng)用共有, 因此內(nèi)存中存在函數(shù)MyFunc() 的程序就只有一個
-
Windows操作系統(tǒng)其實就是無數(shù)個DLL文件的集合體。有些應(yīng)用在安裝時, DLL文件也會被追加。應(yīng)用程序通過這些DLL文件來運(yùn)行, 既可以節(jié)約內(nèi)存, 也可以在不升級EXE文件的情況下, 通過升級DLL文件就可以完成更新。
2.通過調(diào)用_stdcall來減少程序文件的大小
- 通過調(diào)用_stdcall來減小程序文件的方法,是用C語言編寫應(yīng)用時可以利用的高級技巧。
我們來認(rèn)識一下什么是_stdcall:
- _stdcall是 standard call(標(biāo)準(zhǔn)調(diào)用) 的縮寫。Windows提供的DLL文件內(nèi)的函數(shù), 基本上都是通過_stdcall調(diào)用方式來完成的, 這主要是為了節(jié)約內(nèi)存。
- 另一方面, 用C語言編寫的程序默認(rèn)都不是_stdcall。C語言特有的調(diào)用方式稱為C調(diào)用。
- C語言默認(rèn)不使用_stdcall的原因是因為C語言所對應(yīng)的函數(shù)傳入?yún)?shù)是可變的,只有函數(shù)調(diào)用方才能知道到底有多少個參數(shù),在這種情況下,棧的清理作業(yè)便無法進(jìn)行。
- 不過, 在C語言中, 如果函數(shù)的參數(shù)和數(shù)量固定的話, 指定_stdcall是沒有任何問題的。
C語言和Java最主要的區(qū)別之一在于C語言需要人為控制釋放內(nèi)存空間
- C語言中,在調(diào)用函數(shù)后,需要人為執(zhí)行棧清理指令。把不需要的數(shù)據(jù)從接收和傳遞函數(shù)的參數(shù)時使用的內(nèi)存上的棧區(qū)域中清理出去的操作叫做棧清理處理。
例如如下代碼:
- 代碼中, 從main主函數(shù)調(diào)用到MyFunc() 方法, 按照默認(rèn)的設(shè)定, 棧的清理處理會附加在main主函數(shù)這一方。
- 在同一個程序中, 有可能會多次調(diào)用, 導(dǎo)致MyFunc(會進(jìn)行多次清理, 這就會造成內(nèi)存的浪費(fèi)。
匯編之后的代碼如下:
- C語言通過棧來傳遞函數(shù)的參數(shù),使用push是往棧中存入數(shù)據(jù)的指令,pop是從棧中取出數(shù)據(jù)的指令。
- 32位CPU中, 1次push指令可以存儲4個字節(jié)(32位) 的數(shù)據(jù)。上述代碼由于進(jìn)行了兩次push操作, 所以存儲了8字節(jié)的數(shù)據(jù)。
- 通過call指令來調(diào)用函數(shù),調(diào)用完成后,棧中存儲的數(shù)據(jù)就不再需要了。
- 于是就通過add esp, 8這個指令, 使存儲著棧數(shù)據(jù)的esp寄存器前進(jìn)8位(設(shè)定為指向高8位字節(jié)的地址),來進(jìn)行數(shù)據(jù)清理。由于棧是在各種情況下都可以利用的內(nèi)存領(lǐng)域,因此使用完畢后有必要將其恢復(fù)到原始狀態(tài)。
- 上述操作就是執(zhí)行棧的清理工作。
- 另外,在C語言中,函數(shù)的返回值,是通過寄存器而非棧來返回的。
- 棧執(zhí)行清理工作,在調(diào)用方法處執(zhí)行清理工作和在反復(fù)調(diào)用方法處執(zhí)行清理工作不同,使用_stdcall標(biāo)準(zhǔn)調(diào)用的方式稱為反復(fù)調(diào)用方法,在這種情況下執(zhí)行棧清理開銷比較小。
3.磁盤的物理結(jié)構(gòu)
- 之前我們介紹了CPU、內(nèi)存的物理結(jié)構(gòu), 現(xiàn)在我們來介紹一下磁盤的物理結(jié)構(gòu)。磁盤的物理結(jié)構(gòu)指的是 磁盤存儲數(shù)據(jù)的形式。
- 磁盤是通過其物理表面劃分成多個空間來使用的。劃分的方式有兩種:可變長方式和扇區(qū)方式。前者是將物理結(jié)構(gòu)劃分成長度可變的空間, 后者是將磁盤結(jié)構(gòu)劃分為固定長度的空間。
- 一般Windows所使用的硬盤和軟盤都是使用扇區(qū)這種方式。扇區(qū)中,把磁盤表面分成若干個同心圓的空間就是磁道,把磁道按照固定大小的存儲空間劃分而成的就是扇區(qū)
- 扇區(qū)是對磁盤進(jìn)行物理讀寫的最小單位。Windows中使用的磁盤, 一般是一個扇區(qū)512個字節(jié)。
- 不過, Windows在邏輯方面對磁盤進(jìn)行讀寫的單位是扇區(qū)整數(shù)倍簇。根據(jù)磁盤容量不同功能, 1簇可以是512字節(jié)(1簇=1扇區(qū))、1KB(1簇=2扇區(qū))、2KB、4KB、8KB、16KB、32KB(1簇=64扇區(qū))。簇和扇區(qū)的大小是相等的。
- 不管是硬盤還是軟盤,不同的文件是不能存儲在同一簇中的,否則就會導(dǎo)致只有一方的文件不能刪除。
- 所以,不管多小的文件,都會占用1簇的空間。這樣一來,所有的文件都會占用1簇的整數(shù)倍的空間。
總結(jié)
以上是生活随笔為你收集整理的计算机基础- -认识磁盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绝不重新定义继承而来的缺省值参数
- 下一篇: 计算机基础- -认识汇编