常用的文件儲存設備管理方法主要是指對文件的儲存設備的空閑區進行管理.可分為三個數據組織策略:空閑文件目錄(空閑區索引法、空閑表法)、空閑鏈鏈表法(自由鏈法)及成組空閑區鏈鏈表法、位示圖或點陣圖向量法.
空閑文件目錄(空閑區索引法、空閑表法):
為連續的空閑分區建立指針,該指針和空閑塊號、空閑塊個數、第一個空閑塊號等作為一個表項存放在一個叫空閑文件目錄的物理塊中.可採用空閑連續區的內存管理演算法的變形進行分配和回收.空閑文件目錄適用於連續文件結構的文件儲存區的分配和回收.
空閑鏈鏈表法(自由鏈法)及成組空閑區鏈鏈表法:
空閑鏈鏈表法(自由鏈法),將所有空閑盤區拉成一條空閑鏈,根據空閑鏈所有的基本元素不同,可以把鏈表分成兩種形式:空閑盤塊鏈和空閑盤區鏈。
空閑盤塊鏈是將磁碟上的所有空閑分區,以盤塊為單位拉成一條鏈,當用戶創建文件請求分配存儲空間時,系統從鏈首開始,依次摘下適當數目的空閑盤塊分配給用戶;當用戶刪除文件時,系統將回收的盤塊依次加入到空閑盤塊鏈的末尾。
空閑盤區鏈是將磁碟上的所有空閑盤區(每個空閑盤區可包含若干個盤塊)拉成一條鏈。在管理的線性表中,每一個表項對應一個空閑區,增加一項存放指向空閑塊的指針,將磁碟上的所有空閑區(可包含若干個空閑塊)拉成一條鏈。每個空閑區上除含有用於指示下一個空閑區的指針外,還有本盤區大小(盤塊數)的信息。
成組空閑區鏈鏈表法,空閑表法和空閑鏈表由於空閑表太長而不適合大型文件系統的使用。成組鏈接法是兩種方法相結合的一種管理方法,兼備了兩種方法的優點而克服了兩種方法的缺點。其大致的思想是:把空閑的n個順序(可以是地址,也可以說是其他)空閑扇區的地址保存在其第一個空閑扇區內,其後一個空閑扇區內則保存另一組順序空閑扇區的地址,以此類推,直至所有空閑扇區都予以鏈接。
位示圖或點陣圖向量法:
本方法利用二進制的一位來表示磁碟中一個盤塊的使用情況,磁碟上所有的盤塊都有與之對應的一個二進制位。當其值為0時,表示對應的盤塊空閑,當其值為1時,表示對應的盤塊已經分配。
大晚上的,求幾個贊!!
這個題難點在於怎麼理解 常用文件存儲設備管理方法 屬於哪一個管理層次.文件有邏輯結構(大約4個)->存取方法(大約3個)->文件物理結構(大約3個)->存儲空間管理(由於文件儲存設備是分成若干個大小相等的物理塊,並以塊為單位交換信息,所以文件儲存空間的管理實質上是一個空間塊的組織和管理問題,包括空閑塊的組織、分配、回收等.)(大約4個) ->文件目錄管理 ->... ->... ->
上述 (大約xx個) 主要是怕被人懟,望不要介意!!
⑵ System Idle Process是什麼
System Idle Process是系統閑置進程的意思。
System Idle Process是核心虛擬出來的,多任務操作系統都會存在,在沒有可用的進程時,系統處於空運行狀態,此時就是System Idle Process SYSTEM在運行,故它佔用百分之九十以上CPU時間,說明你的機器負荷很輕。
(2)操作系統中什麼是空閑文件擴展閱讀:
System Idle Process是一個系統進程,通常表示的就是CPU的空閑率,所以說大家可以理解為,System Idle Process的佔用越高,說明CPU越空閑。
這個進程對電腦運行速度是沒有任何影響的,它是一個系統進程,而且只會後台運行,並且不會使用網路,也不會對任何硬體產生聯動。
例如:當你關閉了IE,IE停止向遠程發送數據,但仍然收到了遠程的數據包,而沒有進程接收它,就歸到了System Idle Process裡面。
這種情況下,可以用內存整理軟體整理一下內存,網路訪問便會消失。但當你再次退出需要聯網的程序(例如:IE)時,此進程的網路訪問會再次出現,一般可以不做理會。
⑶ 系統臨時文件、IE緩存文件和windows預讀文件都是什麼
你好朋友;
系統臨時文件;就是你在運行程序或操作系統在運行過程中產生的一種文件;
擴展名為.tmp有一些還是.temp的;臨時文件屬於垃圾文件的一種;
ie緩存文件;
ie緩存文件實際上就是internet臨時文件;這種文件是你用瀏覽器上網時候產生的;
瀏覽器在訪問網站的過程中;是先把網站伺服器硬碟中的內容【包括視頻;音樂;圖片;vbs腳本;js腳本】這些東西先以緩存的方式儲存到你電腦中的internet臨時文件夾內;然後再在屏幕上顯示和播放出來的;
windows的預讀文件; Win XP用來放預讀文件的文件夾預讀是微軟採用的一種加速程序進程啟動速度的技術;主要原理是在開機載入操作系統的時候讀取常用程序的主要內容以備該程序啟動時耗費大量時間來讀取本身的數據。
目錄
數據預讀機制
常見問題
解決辦法
局部碎片整理
開啟預存取
defrag的參數
經驗談
MS網站上對prefetch的解釋
數據預讀機制
微軟採用的一種全新系統後台數據預讀機制;它可以提高系統性能;加快Windows XP/2003的啟動速度;經過預讀的程序全部存放在系統所在文件夾下的prefetcher目錄中(圖1);文件名格式類似於下面這個樣子;FOXMAIL.EXE-2B721FDE.pf(這是Foxmail的預讀文件);Windows XP/2003雖然採用了預讀取機制;但是默認設置下比較保守;我們可以自己來定義程序的預讀取方式;大幅度提高系統的性能;
常見問題;
在使用Windows XP較長時間後;我們會發現系統運行速度明顯慢了下來;用多優化軟體;卸載已經安裝的軟體都解決不了問題;究竟為什麼呢?原來罪魁禍首就是預讀設置;在「Windows\Prefetch」文件夾面有很多個以PF為擴展名的文件;這就是預讀文件;如果將裡面的文件清空以後;你就會發現系統運行速度又恢復正常了;看來;預讀設置可以提高系統速度;但是使用一段時間後;預讀文件夾里的文件又會變得很多了;導致系統搜索花費的時間變得很長;而且有些應用程序會產生死鏈接文件;進而加重了系統搜索的負擔;
解決辦法;
因此;我們應該定期刪除這些預讀文件;用以提高開機速度;當然;Windows XP重新設置預讀對象是允許的;具體方法是;打開注冊表編輯器;依次展開HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters分支;在右側窗口中雙擊「EnablePrefetcher」;在打開的「Dword」值編輯窗口中;可以對Windows XP進行預讀設置;將該值設置為「0」;即為取消預讀功能;設置為「1」;系統將只預讀應用程序;設置為「2」;系統將只預讀Windows系統文件;設置為 「3」;系統將預讀Windows系統文件和應用程序;一般我們將該值設置為「2」即可;當然;如果你的計算機配置很高;如使用PIII 800MHz CPU以上的建議將數值數據更改為4或5;也可以保留數值數據為默認值即3;這樣可以加快系統運行速度;prefetch;預存取;這在vista用戶可能知道的多些;其實xp下就有這一技術了;只是官方少有這方面介紹;更別提技術文檔了;這是xp一個隱藏的特性;用處是在xp登錄進度條出現時;就把c:\windows\prefetch目錄下的*.pf文件信息預先裝載到內存中;以便於提高系統性能;這些*.pf文件是系統和應用程序啟動時留下的預存取文件;描述了系統和應用程序每次啟動時裝載模塊的信息和順序;並且其命名方式中包含一個描述其完整路徑的十六進制值;另外;prefetch目錄中還有一個重要文件;就是layout.ini這個磁碟布局初始化文件;它記錄了所有預存取程序及文件的載入信息和順序(按優先順序排列);這也為這些程序文件的磁碟分配提供了最優化方案的依據;
局部碎片整理;
說到這;不得不提一下「局部碎片整理」;按照官方所說;xp每隔3天就會自動進行一次局部碎片整理;我發現這個整理動作是分步實施的;而且是在系統空閑時才會運行;這多虧了剛裝上的SSM截獲了defrag的這個動作信息;連命令行參數都一並截獲;這個重點留待稍後再說;(其實系統在啟動時也可以進行局部碎片整理;使得啟動時需要的文件能夠被整理到相鄰位置;這個功能可以在注冊表中開啟;HKLM\SOFTWARE\Microsoft\Dfrg\BootOptimizeFunetion下enable鍵由默認的N改為Y即可)用Filemon跟蹤發現;系統進行局部碎片整理時;先讀取layout.ini文件;然後調用defrag針對layout.ini中涉及的文件進行整理;然後把轉移信息再寫入到layout.ini中;這個自動整理不同於server2003系統的自動碎片整理功能(Auto Defragmenter);
開啟預存取;
至於是否開啟預存取;有不少爭論;但是我堅決認為應該開啟;否則系統速度會變得更慢;HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters目錄下;EnablePrefeteher子鍵的值決定以何種方式開啟prefetch;0取消;1隻預存取應用程序;2隻預存取windows系統文件;3同時存取系統和應用程序文件;xp默認情況下是3;以上這些prefetch相關功能依賴於task schele計劃任務這項服務;defrag的參數;
現在該說那個重點了;系統自動調用的defrag的參數是什麼?是-p -s和-b。-p後面跟著一個常量;例如5E4;-s後也跟一個常量;比如000018A4;-b後跟著盤符C:;那麼這個命令行的例子就是;defrag.exe -p 5E4 -s 000018A4 -b C: 了;-b這個參數網上一直有傳言;說是defrag的隱藏參數;但是官方不給出澄清;我也不知道是否真的存在;這回算是證實了;-b C:就是對預存取的文件進行局部整理;並且每次僅針對一個pf文件相關程序文件進行整理;-p和-s應該就是用來選擇哪一個pf的;但具體那兩個常量和被選pf文件有什麼聯系;還有待進一步分析;平時如果想對系統和應用程序文件進行一次優化碎片整理;可以在命令行中敲入defrag.exe C: -b;這樣會對所有prefetch文件進行整理;完成後你會覺得系統的速度有一定提升;
段經驗談
經驗之談;如果不小心刪除了prefetch目錄下的文件;尤其是layout.ini文件;如何重建?敲入rundll32.exe advapi32.dll,ProcessIdleTasks命令;然後重啟三次系統;就可以重建layout.ini文件;為什麼是三次;我也不知道;大概和每隔三天整理一次有關系吧;windows xp開機有一個進度條;會一遍一遍的跑;不少人認為只跑兩圈就進去的就是開機速度快;網上出現過一種優化方式;修改注冊表將所謂的「開機預讀取」設置為「不預讀」;則可以大大減少進度條「跑」的次數;但是這種「優化方法」出來不久;便有更多的文章指出這是「謬誤」;還舉出相當多的事例;或是試驗;說明不預讀並不能減少開機時間;大多的理由是進度條消失後的「黑屏時間」增加;因為一直用的休眠;所以我一直也沒怎麼在意;前兩天和別人談到這個問題;我便好好研究一番;結論是;其實關於這個問題;所謂設置為「不預讀」的優化方法也並非謬誤;而這個所謂的預讀也並非沒有用處;否則MS怎麼也不會花人力物力弄這么個浪費開機時間的東西;先說說什麼是所謂的「預讀取」;預讀取分兩種;一種是「系統文件預讀」;一種是「應用程序預讀」;具體的不去討論;現在只討論預讀取對速度的影響;我們都有經驗;當第一次打開word的時候會等待比較長的時間;硬碟燈不停的在亮;但是關閉再次打開;word啟動速度就快得多了;這個其實就是windows的預讀取做的優化;windows預讀取發現你帶開了一個他的預讀取資料庫沒有的應用程序時;他就會將這個應用程序中某些信息在內存中留下一個映象;下次打開這個程序就不用再去硬碟上找文件;能大大加塊程序啟動速度;問題來了;內存中的映象重新啟動之後就會消失;下次開機啟動程序依然很慢;怎麼辦呢?這就需要「開機預讀取」功能;Windows會把使用頻率較高的一些應用程序的信息記錄下來;每次開機時;就完成一次對程序的預讀取;從而大大加快應用程序的啟動速度;你大概已經猜到;那個「進度條」一遍一遍的跑的時候,windows就在進行開機預讀取的工作;因此;如果直接取消掉注冊表中的「預讀取功能」是一定會大大降低應用程序的啟動速度的;當然開機速度會有一定的增加;不過這是得不償失;因為沒有了那一段必要的「系統文件預讀取」;在進度條消失之後系統會從硬碟上去尋找大量的系統文件;反而影響啟動速度;而且應用程序的啟動速度也是一定會大大減慢的;其實比較好的優化辦法是這樣;找到「開機預讀取」的信息;手動把不是很常用;不需要預讀取的應用程序刪除;盡量減少開機預讀取的應用程序的數量;由此來加快啟動速度!;位置在x:\windows\prefetch下面;命名是 exe文件名-16進制hash.exe;有一些實測數據;一台裝了許多應用軟體的電腦;不作處理;開機29s,取消預讀取;開機32s;刪除prefetch文件夾下面大部分文件後;開機23s,有比較明顯的開機速度提升;不過第一次運行應用程序的時候速度的確有所下降;並且prefetch文件夾下文件會自動生成;越來越多;其中最「有效」的一個文件是NTOSBOOT-B00DFAAD.pf;它可以大大提高Windows的啟動速度;如果只求啟動速度的話;可以只保留這個文件和Layout.ini;然後將Task Scheler服務設為手動;當然;要想真正看到預讀效果;必須保證開機後內存佔用小於物理內存量;(比如:開機後從任務管理器看出內存佔用是480MB;而你的物理內存是256MB的;那麼就幾乎看不到預讀的效果;
MS網站上對prefetch的解釋;
Prefetch;All versions of Windows except real-mode Windows 3x are demand-paged operating systems, where file data and code is faulted into memory from disk as an application attempts to access it. Data and code is faulted in page-granular chunks where a page's size is dictated by the CPU's memory management hardware. A page is 4KB on the x86. Prefetching is the process of bringing data and code pages into memory from disk before it's demanded. In order to know what it should prefetch, the Windows XP Cache Manager monitors the page faults, both those that require that data be read from disk (hard faults) and those that simply require that data already in memory be added to a process's working set (soft faults), that occur ring the boot process and application startup. By default it traces through the first two minutes of the boot process, 60 seconds following the time when all Win32 services have finished initializing, or 30 seconds following the start of the user's shell (typically Microsoft Internet Explorer), whichever of these three events occurs first. The Cache Manager also monitors the first 10 seconds of application startup. After collecting a trace that's organized into faults taken on the NTFS Master File Table (MFT) metadata file (if the application accesses files or directories on NTFS volumes), the files referenced, and the directories referenced, it notifies the prefetch component of the Task Scheler by signaling a named event object. The Task Scheler then performs a call to the internal NtQuerySystemInformation system call requesting the trace data. After performing post-processing on the trace data, the Task Scheler writes it out to a file in the \Windows\Prefetch folder. The file's name is the name of the application to which the trace applies followed by a dash and the hexadecimal representation of a hash of the file's path. The file has a .pf extension, so an example would be NOTEPAD.EXE-AF43252301.PF. An exception to the file name rule is the file that stores the boot's trace, which is always named NTOSBOOT-B00DFAAD.PF (a convolution of the hexadecimal-compatible word BAADF00D, which programmers often use to represent uninitialized data). Only after the Cache Manager has finished the boot trace (the time of which was defined earlier) does it collect page fault information for specific applications. 這個似乎是最影響啟動速度的文件,也就是所謂的「系統文件預讀取」吧 When the system boots or an application starts, the Cache Manager is called to give it an opportunity to perform prefetching. The Cache Manager looks in the prefetch directory to see if a trace file exists for the prefetch scenario in question. If it does, the Cache Manager calls NTFS to prefetch any MFT metadata file references, reads in the contents of each of the directories referenced, and finally opens each file referenced. It then calls the Memory Manager to read in any data and code specified in the trace that's not already in memory. The Memory Manager initiates all of the reads asynchronously and then waits for them to complete before letting an application's startup continue. How does this scheme provide a performance benefit? The answer lies in the fact that ring typical system boot or application startup, the order of faults is such that some pages are brought in from one part of a file, then from another part of the same file, then pages are read from a different file, then perhaps from a directory, and so on. This jumping around results in moving the heads around on the disk. Microsoft has learned through analysis that this slows boot and application startup times. By prefetching data from a file or directory all at once before accessing another one, this scattered seeking for data on the disk is greatly reced or eliminated, thus improving the overall time for system and application startup. Figure 1 Prefetch Directory To minimize seeking even further, every three days or so, ring system idle periods, the Task Scheler organizes a list of files and directories in the order that they are referenced ring a boot or application start, and stores the list in a file named \Windows\Prefech\Layout.ini. Figure 1 shows the contents of a prefetch directory, highlighting the layout file. Then it launches the system defragmenter with a command-line option that tells the defragmenter to defragment based on the contents of the file instead of performing a full defrag. The defragmenter finds a contiguous area on each volume large enough to hold all the listed files and directories that reside on that volume and then moves them in their entirety into that area so that they are stored one after the other. Thus, future prefetch operations will even be more efficient because all the data to be read in is now stored physically on the disk in the order it will be read. Since the number of files defragmented for prefetching is usually only in the hundreds, this defragmentation is much faster than full defragmentations.
⑷ 程序員必備知識(操作系統5-文件系統)
本篇與之前的第三篇的內存管理知識點有相似的地方
對於運行的進程來說,內存就像一個紙箱子, 僅僅是一個暫存數據的地方, 而且空間有限。如果我們想要進程結束之後,數據依然能夠保存下來,就不能只保存在內存里,而是應該保存在 外部存儲 中。就像圖書館這種地方,不僅空間大,而且能夠永久保存。
我們最常用的外部存儲就是 硬碟 ,數據是以文件的形式保存在硬碟上的。為了管理這些文件,我們在規劃文件系統的時候,需要考慮到以下幾點。
第一點,文件系統要有嚴格的組織形式,使得文件能夠 以塊為單位進行存儲 。這就像圖書館里,我們會給設置一排排書架,然後再把書架分成一個個小格子,有的項目存放的資料非常多,一個格子放不下,就需要多個格子來進行存放。我們把這個區域稱為存放原始資料的 倉庫區 。
第二點,文件系統中也要有 索引區 ,用來方便查找一個文件分成的多個塊都存放在了什麼位置。這就好比,圖書館的書太多了,為了方便查找,我們需要專門設置一排書架,這裡面會寫清楚整個檔案庫有哪些資料,資料在哪個架子的哪個格子上。這樣找資料的時候就不用跑遍整個檔案庫,在這個書架上找到後,直奔目標書架就可以了。
第三點,如果文件系統中有的文件是熱點文件,近期經常被讀取和寫入,文件系統應該有 緩存層 。這就相當於圖書館裡面的熱門圖書區,這裡面的書都是暢銷書或者是常常被借還的圖書。因為借還的次數比較多,那就沒必要每次有人還了之後,還放回遙遠的貨架,我們可以專門開辟一個區域, 放置這些借還頻次高的圖書。這樣借還的效率就會提高。
第四點,文件應該用 文件夾 的形式組織起來,方便管理和查詢。這就像在圖書館裡面,你可以給這些資料分門別類,比如分成計算機類.文學類.歷史類等等。這樣你也容易管理,項目組借閱的時候只要在某個類別中去找就可以了。
在文件系統中,每個文件都有一個名字,這樣我們訪問一個文件,希望通過它的名字就可以找到。文件名就是一個普通的文本。 當然文件名會經常沖突,不同用戶取相同的名字的情況還是會經常出現的。
要想把很多的文件有序地組織起來,我們就需要把它們成為 目錄 或者文件夾。這樣,一個文件夾里可以包含文件夾,也可以包含文件,這樣就形成了一種 樹形結構 。而我們可以將不同的用戶放在不同的用戶目錄下,就可以一定程度上避免了命名的沖突問題。
第五點,Linux 內核要在自己的內存裡面維護一套數據結構,來保存哪些文件被哪些進程打開和使用 。這就好比,圖書館里會有個圖書管理系統,記錄哪些書被借閱了,被誰借閱了,借閱了多久,什麼時候歸還。
文件系統是操作系統中負責管理持久數據的子系統,說簡單點,就是負責把用戶的文件存到磁碟硬體中,因為即使計算機斷電了,磁碟里的數據並不會丟失,所以可以持久化的保存文件。
文件系統的基本數據單位是 文件 ,它的目的是對磁碟上的文件進行組織管理,那組織的方式不同,就會形成不同的文件系統。
Linux最經典的一句話是:「一切皆文件」,不僅普通的文件和目錄,就連塊設備、管道、socket 等,也都是統一交給文件系統管理的。
Linux文件系統會為每個文件分配兩個數據結構: 索引節點(index node) 和 目錄項(directory entry) ,它們主要用來記錄文件的元信息和目錄層次結構。
●索引節點,也就是inode, 用來記錄文件的元信息,比如inode編號、文件大小訪問許可權、創建時間、修改時間、 數據在磁碟的位置 等等。 索引節點是文件的唯一標識 ,它們之間一一對應, 也同樣都會被 存儲在硬碟 中,所以索引節點同樣佔用磁碟空間。
●目錄項,也就是dentry, 用來記錄文件的名字、索引節點指針以及與其他目錄項的層級關聯關系。多個目錄項關聯起來,就會形成 目錄結構 ,但它與索引節點不同的是,目錄項是由內核維護的一個數據結構,不存放於磁碟,而是 緩存在內存 。
由於索引節點唯一標識一個文件,而目錄項記錄著文件的名,所以目錄項和索引節點的關系是多對一,也就是說,一個文件可以有多個別字。比如,硬鏈接的實現就是多個目錄項中的索引節點指向同一個文件。
注意,目錄也是文件,也是用索引節點唯一標識,和普通文件不同的是,普通文件在磁碟裡面保存的是文件數據,而目錄文件在磁碟裡面保存子目錄或文件。
(PS:目錄項和目錄不是一個東西!你也不是一個東西(^_=), 雖然名字很相近,但目錄是個文件。持久化存儲在磁碟,而目錄項是內核一個數據結構,緩存在內存。
如果查詢目錄頻繁從磁碟讀,效率會很低,所以內核會把已經讀過的目錄用目錄項這個數據結構緩存在內存,下次再次讀到相同的目錄時,只需從內存讀就可以,大大提高了 文件系統的效率。
目錄項這個數據結構不只是表示目錄,也是可以表示文件的。)
磁碟讀寫的最小單位是 扇區 ,扇區的大小隻有512B大小,很明顯,如果每次讀寫都以這么小為單位,那這讀寫的效率會非常低。
所以,文件系統把多個扇區組成了一個 邏輯塊 ,每次讀寫的最小單位就是邏輯塊(數據塊) , Linux中的邏輯塊大小為4KB,也就是一次性讀寫 8個扇區,這將大大提高了磁碟的讀寫的效率。
以上就是索引節點、目錄項以及文件數據的關系,下面這個圖就很好的展示了它們之間的關系:
索引節點是存儲在硬碟上的數據,那麼為了加速文件的訪問,通常會把索引節點載入到內存中。
另外,磁碟進行格式化的時候,會被分成三個存儲區域,分別是超級塊、索引節點區和數據塊區。
●超級塊,用來存儲文件系統的詳細信息,比如塊個數、塊大小、空閑塊等等。
●索引節點區,用來存儲索引節點;
●數據塊區,用來存儲文件或目錄數據;
我們不可能把超級塊和索引節點區全部載入到內存,這樣內存肯定撐不住,所以只有當需要使用的時候,才將其載入進內存,它們載入進內存的時機是不同的.
●超級塊:當文件系統掛載時進入內存;
●索引節點區:當文件被訪問時進入內存;
文件系統的種類眾多,而操作系統希望 對用戶提供一個統一的介面 ,於是在用戶層與文件系統層引入了中間層,這個中間層就稱為 虛擬文件系統(Virtual File System, VFS) 。
VFS定義了一組所有文件系統都支持的數據結構和標准介面,這樣程序員不需要了解文件系統的工作原理,只需要了解VFS提供的統一介面即可。
在Linux文件系統中,用戶空間、系統調用、虛擬機文件系統、緩存、文件系統以及存儲之間的關系如下圖:
Linux支持的文件系統也不少,根據存儲位置的不同,可以把文件系統分為三類:
●磁碟的文件系統,它是直接把數據存儲在磁碟中,比如Ext 2/3/4. XFS 等都是這類文件系統。
●內存的文件系統,這類文件系統的數據不是存儲在硬碟的,而是佔用內存空間,我們經常用到的/proc 和/sys文件系統都屬於這一類,讀寫這類文件,實際上是讀寫內核中相關的數據。
●網路的文件系統,用來訪問其他計算機主機數據的文件系統,比如NFS. SMB等等。
文件系統首先要先掛載到某個目錄才可以正常使用,比如Linux系統在啟動時,會把文件系統掛載到根目錄。
在操作系統的輔助之下,磁碟中的數據在計算機中都會呈現為易讀的形式,並且我們不需要關心數據到底是如何存放在磁碟中,存放在磁碟的哪個地方等等問題,這些全部都是由操作系統完成的。
那麼,文件數據在磁碟中究竟是怎麼樣的呢?我們來一探究竟!
磁碟中的存儲單元會被劃分為一個個的「 塊 」,也被稱為 扇區 ,扇區的大小一般都為512byte.這說明即使一塊數據不足512byte,那麼它也要佔用512byte的磁碟空間。
而幾乎所有的文件系統都會把文件分割成固定大小的塊來存儲,通常一個塊的大小為4K。如果磁碟中的扇區為512byte,而文件系統的塊大小為4K,那麼文件系統的存儲單元就為8個扇區。這也是前面提到的一個問題,文件大小和佔用空間之間有什麼區別?文件大小是文件實際的大小,而佔用空間則是因為即使它的實際大小沒有達到那麼大,但是這部分空間實際也被佔用,其他文件數據無法使用這部分的空間。所以我們 寫入1byte的數據到文本中,但是它佔用的空間也會是4K。
這里要注意在Windows下的NTFS文件系統中,如果一開始文件數據小於 1K,那麼則不會分配磁碟塊來存儲,而是存在一個文件表中。但是一旦文件數據大於1K,那麼不管以後文件的大小,都會分配以4K為單位的磁碟空間來存儲。
與內存管理一樣,為了方便對磁碟的管理,文件的邏輯地址也被分為一個個的文件塊。於是文件的邏輯地址就是(邏輯塊號,塊內地址)。用戶通過邏輯地址來操作文件,操作系統負責完成邏輯地址與物理地址的映射。
不同的文件系統為文件分配磁碟空間會有不同的方式,這些方式各自都有優缺點。
連續分配要求每個文件在磁碟上有一組連續的塊,該分配方式較為簡單。
通過上圖可以看到,文件的邏輯塊號的順序是與物理塊號相同的,這樣就可以實現隨機存取了,只要知道了第一個邏輯塊的物理地址, 那麼就可以快速訪問到其他邏輯塊的物理地址。那麼操作系統如何完成邏輯塊與物理塊之間的映射呢?實際上,文件都是存放在目錄下的,而目錄是一種有結構文件, 所以在文件目錄的記錄中會存放目錄下所有文件的信息,每一個文件或者目錄都是一個記錄。 而這些信息就包括文件的起始塊號和佔有塊號的數量。
那麼操作系統如何完成邏輯塊與物理塊之間的映射呢? (邏輯塊號, 塊內地址) -> (物理塊號, 塊內地址),只需要知道邏輯塊號對應的物理塊號即可,塊內地址不變。
用戶訪問一個文件的內容,操作系統通過文件的標識符找到目錄項FCB, 物理塊號=起始塊號+邏輯塊號。 當然,還需要檢查邏輯塊號是否合法,是否超過長度等。因為可以根據邏輯塊號直接算出物理塊號,所以連續分配支持 順序訪問和隨機訪問 。
因為讀/寫文件是需要移動磁頭的,如果訪問兩個相隔很遠的磁碟塊,移動磁頭的時間就會變長。使用連續分配來作為文件的分配方式,會使文件的磁碟塊相鄰,所以文件的讀/寫速度最快。
連續空間存放的方式雖然讀寫效率高,但是有 磁碟空間碎片 和 文件長度不易擴展 的缺陷。
如下圖,如果文件B被刪除,磁碟上就留下一塊空缺,這時,如果新來的文件小於其中的一個空缺,我們就可以將其放在相應空缺里。但如果該文件的大小大於所
有的空缺,但卻小於空缺大小之和,則雖然磁碟上有足夠的空缺,但該文件還是不能存放。當然了,我們可以通過將現有文件進行挪動來騰出空間以容納新的文件,但是這個在磁碟挪動文件是非常耗時,所以這種方式不太現實。
另外一個缺陷是文件長度擴展不方便,例如上圖中的文件A要想擴大一下,需要更多的磁碟空間,唯一的辦法就只能是挪動的方式,前面也說了,這種方式效率是非常低的。
那麼有沒有更好的方式來解決上面的問題呢?答案當然有,既然連續空間存放的方式不太行,那麼我們就改變存放的方式,使用非連續空間存放方式來解決這些缺陷。
非連續空間存放方式分為 鏈表方式 和 索引方式 。
鏈式分配採取離散分配的方式,可以為文件分配離散的磁碟塊。它有兩種分配方式:顯示鏈接和隱式鏈接。
隱式鏈接是只目錄項中只會記錄文件所佔磁碟塊中的第一塊的地址和最後一塊磁碟塊的地址, 然後通過在每一個磁碟塊中存放一個指向下一 磁碟塊的指針, 從而可以根據指針找到下一塊磁碟塊。如果需要分配新的磁碟塊,則使用最後一塊磁碟塊中的指針指向新的磁碟塊,然後修改新的磁碟塊為最後的磁碟塊。
我們來思考一個問題, 採用隱式鏈接如何將實現邏輯塊號轉換為物理塊號呢?
用戶給出需要訪問的邏輯塊號i,操作系統需要找到所需訪問文件的目錄項FCB.從目錄項中可以知道文件的起始塊號,然後將邏輯塊號0的數據讀入內存,由此知道1號邏輯塊的物理塊號,然後再讀入1號邏輯塊的數據進內存,此次類推,最終可以找到用戶所需訪問的邏輯塊號i。訪問邏輯塊號i,總共需要i+ 1次磁碟1/0操作。
得出結論: 隱式鏈接分配只能順序訪問,不支持隨機訪問,查找效率低 。
我們來思考另外一個問題,採用隱式鏈接是否方便文件拓展?
我們知道目錄項中存有結束塊號的物理地址,所以我們如果要拓展文件,只需要將新分配的磁碟塊掛載到結束塊號的後面即可,修改結束塊號的指針指向新分配的磁碟塊,然後修改目錄項。
得出結論: 隱式鏈接分配很方便文件拓展。所有空閑磁碟塊都可以被利用到,無碎片問題,存儲利用率高。
顯示鏈接是把用於鏈接各個物理塊的指針顯式地存放在一張表中,該表稱為文件分配表(FAT, File Allocation Table)。
由於查找記錄的過程是在內存中進行的,因而不僅顯著地 提高了檢索速度 ,而且 大大減少了訪問磁碟的次數 。但也正是整個表都存放在內存中的關系,它的主要的缺點是 不適 用於大磁碟 。
比如,對於200GB的磁碟和1KB大小的塊,這張表需要有2億項,每一項對應於這2億個磁碟塊中的一個塊,每項如果需要4個位元組,那這張表要佔用800MB內存,很顯然FAT方案對於大磁碟而言不太合適。
一直都在,加油!(*゜Д゜)σ凸←自爆按鈕
鏈表的方式解決了連續分配的磁碟碎片和文件動態打展的問題,但是不能有效支持直接訪問(FAT除外) ,索引的方式可以解決這個問題。
索引的實現是為每個文件創建一個 索引數據塊 ,裡面存放的 是指向文件數據塊的指針列表 ,說白了就像書的目錄一樣,要找哪個章節的內容,看目錄查就可以。
另外, 文件頭需要包含指向索引數據塊的指針 ,這樣就可以通過文件頭知道索引數據塊的位置,再通過索弓|數據塊里的索引信息找到對應的數據塊。
創建文件時,索引塊的所有指針都設為空。當首次寫入第i塊時,先從空閑空間中取得一個塊, 再將其地址寫到索引塊的第i個條目。
索引的方式優點在於:
●文件的創建、增大、縮小很方便;
●不會有碎片的問題;
●支持順序讀寫和隨機讀寫;
由於索引數據也是存放在磁碟塊的,如果文件很小,明明只需一塊就可以存放的下,但還是需要額外分配一塊來存放索引數據,所以缺陷之一就是存儲索引帶來的開銷。
如果文件很大,大到一個索引數據塊放不下索引信息,這時又要如何處理大文件的存放呢?我們可以通過組合的方式,來處理大文件的存儲。
先來看看 鏈表+索引 的組合,這種組合稱為 鏈式索引塊 ,它的實現方式是在 索引數據塊留出一個存放下一個索引數據塊的指針 ,於是當一個索引數據塊的索引信息用完了,就可以通過指針的方式,找到下一個索引數據塊的信息。那這種方式也會出現前面提到的鏈表方式的問題,萬一某個指針損壞了,後面的數據也就會無法讀取了。
還有另外一種組合方式是 索引+索引 的方式,這種組合稱為多級索引塊,實現方式是通過一個索引塊來存放多個索引數據塊,一層套一層索引, 像極了俄羅斯套娃是吧๑乛◡乛๑
前面說到的文件的存儲是針對已經被佔用的數據塊組織和管理,接下來的問題是,如果我要保存一個數據塊, 我應該放在硬碟上的哪個位置呢?難道需要將所有的塊掃描一遍,找個空的地方隨便放嗎?
那這種方式效率就太低了,所以針對磁碟的空閑空間也是要引入管理的機制,接下來介紹幾種常見的方法:
●空閑表法
●空閑鏈表法
●點陣圖法
空閑表法
空閑表法就是為所有空閑空間建立一張表,表內容包括空閑區的第一個塊號和該空閑區的塊個數,注意,這個方式是連續分配的。如下圖:
當請求分配磁碟空間時,系統依次掃描空閑表裡的內容,直到找到一個合適的空閑區域為止。當用戶撤銷一個文件時,系統回收文件空間。這時,也需順序掃描空閑表,尋找一個空閑表條目並將釋放空間的第一個物理塊號及它佔用的塊數填到這個條目中。
這種方法僅當有少量的空閑區時才有較好的效果。因為,如果存儲空間中有著大量的小的空閑區,則空閑表變得很大,這樣查詢效率會很低。另外,這種分配技術適用於建立連續文件。
空閑鏈表法
我們也可以使用鏈表的方式來管理空閑空間,每一個空閑塊里有一個指針指向下一個空閑塊,這樣也能很方便的找到空閑塊並管理起來。如下圖:
當創建文件需要一塊或幾塊時,就從鏈頭上依次取下一塊或幾塊。反之,當回收空間時,把這些空閑塊依次接到鏈頭上。
這種技術只要在主存中保存一個指針, 令它指向第一個空閑塊。其特點是簡單,但不能隨機訪問,工作效率低,因為每當在鏈上增加或移動空閑塊時需要做很多1/0操作,同時數據塊的指針消耗了一定的存儲空間。
空閑表法和空閑鏈表法都不適合用於大型文件系統,因為這會使空閑表或空閑鏈表太大。
點陣圖法
點陣圖是利用二進制的一位來表示磁碟中一個盤塊的使用情況,磁碟上所有的盤塊都有一個二進制位與之對應。
當值為0時,表示對應的盤塊空閑,值為1時,表示對應的盤塊已分配。它形式如下:
在Linux文件系統就採用了點陣圖的方式來管理空閑空間,不僅用於數據空閑塊的管理,還用於inode空閑塊的管理,因為inode也是存儲在磁碟的,自然也要有對其管理。
前面提到Linux是用點陣圖的方式管理空閑空間,用戶在創建一個新文件時, Linux 內核會通過inode的點陣圖找到空閑可用的inode,並進行分配。要存儲數據時,會通過塊的點陣圖找到空閑的塊,並分配,但仔細計算一下還是有問題的。
數據塊的點陣圖是放在磁碟塊里的,假設是放在一個塊里,一個塊4K,每位表示一個數據塊,共可以表示4 * 1024 * 8 = 2^15個空閑塊,由於1個數據塊是4K大小,那麼最大可以表示的空間為2^15 * 4 * 1024 = 2^27個byte,也就是128M。
也就是說按照上面的結構,如果採用(一個塊的點陣圖+ 一系列的塊),外加一(個塊的inode的點陣圖+一系列的inode)的結構能表示的最大空間也就128M,
這太少了,現在很多文件都比這個大。
在Linux文件系統,把這個結構稱為一個 塊組 ,那麼有N多的塊組,就能夠表示N大的文件。
最終,整個文件系統格式就是下面這個樣子。
最前面的第一個塊是引導塊,在系統啟動時用於啟用引導,接著後面就是一個一個連續的塊組了,塊組的內容如下:
● 超級塊 ,包含的是文件系統的重要信息,比如inode總個數、塊總個數、每個塊組的inode個數、每個塊組的塊個數等等。
● 塊組描述符 ,包含文件系統中各個塊組的狀態,比如塊組中空閑塊和inode的數目等,每個塊組都包含了文件系統中「所有塊組的組描述符信息」。
● 數據點陣圖和inode點陣圖 ,用於表示對應的數據塊或inode是空閑的,還是被使用中。
● inode 列表 ,包含了塊組中所有的inode, inode 用於保存文件系統中與各個文件和目錄相關的所有元數據。
● 數據塊 ,包含文件的有用數據。
你可以會發現每個塊組里有很多重復的信息,比如 超級塊和塊組描述符表,這兩個都是全局信息,而且非常的重要 ,這么做是有兩個原因:
●如果系統崩潰破壞了超級塊或塊組描述符,有關文件系統結構和內容的所有信息都會丟失。如果有冗餘的副本,該信息是可能恢復的。
●通過使文件和管理數據盡可能接近,減少了磁頭尋道和旋轉,這可以提高文件系統的性能。
不過,Ext2 的後續版本採用了稀疏技術。該做法是,超級塊和塊組描述符表不再存儲到文件系統的每個塊組中,而是只寫入到塊組0、塊組1和其他ID可以表示為3、5、7的冪的塊組中。
在前面,我們知道了一個普通文件是如何存儲的,但還有一個特殊的文件,經常用到的目錄,它是如何保存的呢?
基於Linux 一切切皆文件的設計思想,目錄其實也是個文件,你甚至可以通過vim打開它,它也有inode, inode 裡面也是指向一些塊。
和普通文件不同的是, 普通文件的塊裡面保存的是文件數據,而目錄文件的塊裡面保存的是目錄裡面一項一項的文件信息 。
在目錄文件的塊中,最簡單的保存格式就是 列表 ,就是一項一項地將目錄下的文件信息(如文件名、文件inode.文件類型等)列在表裡。
列表中每一項就代表該目錄下的文件的文件名和對應的inode,通過這個inode,就可以找到真正的文件。
通常,第一項是「則」,表示當前目錄,第二項是.,表示上一級目錄, 接下來就是一項一項的文件名和inode。
如果一個目錄有超級多的文件,我們要想在這個目錄下找文件,按照列表一項一項的找,效率就不高了。
於是,保存目錄的格式改成 哈希表 ,對文件名進行哈希計算,把哈希值保存起來,如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應的塊裡面。
Linux系統的ext文件系統就是採用了哈希表,來保存目錄的內容,這種方法的優點是查找非常迅速,插入和刪除也較簡單,不過需要一些預備措施來避免哈希沖突。
目錄查詢是通過在磁碟上反復搜索完成,需要不斷地進行/0操作,開銷較大。所以,為了減少/0操作,把當前使用的文件目錄緩存在內存,以後要使用該文件時只要在內存中操作,從而降低了磁碟操作次數,提高了文件系統的訪問速度。
感謝您的閱讀,希望您能攝取到知識!加油!沖沖沖!(發現光,追隨光,成為光,散發光!)我是程序員耶耶!有緣再見。<-biubiu-⊂(`ω´∩)
⑸ 進程項 System Idle Process 是什麼東西
SystemIdleProcess是系統空閑進殲前程。
當CPU處於空閑狀態時,發出鬧穗一個IDLE命令來掛起CPU(暫時停止工作),可以有效降低CPU內核的溫度。在操作系統服務中沒有禁用它的選項。
它是除當前應用程序分配的處理器(CPU)百分比外,所有其他應用程序消耗的處理器(CPU)百分比;一旦應用程序發出請求,處理器立即響應。在這個進程中出現的CPU使用量不是實際的CPU使用量,而是CPU空閑率。
數字越大,CPU空閑率越高,反之亦然,液改卜如果開機後發現系統空閑進程的CPU使用率很低,應注意後台運行的大程序或感染病毒。數字越小,CPU越緊。這個過程是系統所需要的,不能被禁用。
(5)操作系統中什麼是空閑文件擴展閱讀:
系統的空閑進程不是一個真實的進程,系統的空閑進程是虛擬的核心,多任務操作系統將會存在。
當沒有可用進程時,系統處於空閑運行狀態,這意味著系統空閑進程系統正在運行,因此,它佔用了超過90%的CPU時間,這表明您的機器負載非常輕。
如果我們使用Photoshop來繪制,你會發現系統空閑進程系統的CPU消耗一直在變化,而且越來越小。
系統空閑進程中的空閑指的是空閑,系統空閑進程,系統空閑進程使用的CPU越多,您的計算機就越空閑,當系統空閑進程達到5%以下時,可以選擇重啟。