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