清華大學《操作系統》(二十二):文件系統

文件系統和文件:

  • 文件系統是操作系統中管理持久性數據的子系統,提供數據存儲和訪問功能,組織、檢索、讀寫訪問數據。
  • 文件是具有符號名,由字節序列構成的數據項集合,是文件系統的基本數據單位,文件名是文件的標識符號。

文件系統功能:

  1. 分配文件磁盤空間:管理文件塊(位置和順序)、管理空閑空間(位置)、分配算法(策略)
  2. 管理文件集合:Ⅰ、定位(文件及其內容);Ⅱ、命名(通過名字找到文件);Ⅲ、文件系統結構(文件組織方式)
  3. 數據可靠和安全:安全(多層次保護數據);可靠(持久保存文件,避免系統崩潰、媒體錯誤、網絡攻擊等)

文件屬性:

  1. 名稱、類型、位置、大小、保護、創建者、創建時間、最近修改時間等
  2. 文件頭:文件系統元數據中的文件信息

文件描述符:

文件訪問方式:進程訪問文件數據前必須先打開文件

內核跟蹤進程打開的所有文件:操作系統為每個進程維護一個打開文件表,文件描述符是打開文件的標識,即?文件描述符是操作系統在打開文件表中維護的打開文件狀態和信息,其中包括:

  • 文件指針:a. 最近一次讀寫位置;b.每個進程分別維護自己的打開文件指針?
  • 文件打開計數:a. 被打開文件當前被打開的次數,b. 最后一個進程關閉文件時,將其從打開文件表中移除
  • 文件磁盤位置:緩存數據訪問信息?
  • 訪問權限:a. 每個進程的文件訪問模式(只讀、可寫等)

文件的用戶視圖和系統視圖

  • 文件的用戶視圖:持久的數據結構
  • 系統訪問接口:a.字節序列的集合(UNIX);b. 系統不關心存儲在磁盤上的數據結構,應用程序應該關心。
  • 操作系統內部視角?:a.數據塊的集合,b.塊是邏輯存儲單元,而扇區是物理存儲單元,c. 塊大小與扇區大小可以不相等,通常是幾個扇區構成一個數據塊

用戶視圖到系統視圖的轉換:

  • 進程讀文件:a. 獲取字節所在的數據塊,b. 返回數據塊內對應內容
  • 進程寫文件:a. 獲取數據塊,b. 修改數據塊中對應內容,c. 寫回數據塊
  • 文件系統中的基本操作單位是數據塊

訪問模式:

  • 順序訪問:按字節順序一次讀取(大多數)
  • 隨機訪問:從中間讀寫(不常用,但很重要,比如虛擬內存中把內存頁存儲在文件)
  • 索引訪問:依據數據特征索引,操作系統通常不提供文正索引訪問,可以在上面建數據庫,數據塊建立索引內容

文件內部的結構(操作系統不關心):應用系統打開復雜文件,但對操作系統該文件可能很簡單?

  • 無結構:單詞、字節的隊列?
  • 簡單記錄結構:列,固定/可變長度?
  • 復雜結構:格式化文檔(MS Word, PDF),可執行文件

文件共享和訪問控制:

  • 多用戶系統中文件共享是很必要的,需要對訪問進行控制:a. 每個用戶能夠獲得哪些文件的哪些訪問權限,b. 訪問模式:讀、些、執行、刪除、列表等
  • 操作系統維護文件訪問控制列表(ACL):a. 每個文件每個用戶有哪些權限?<用戶|組|所有人, 讀|寫|可執行>,b. 用戶識別ID,識別用戶,表明每個用戶所允許的權限及保護模式,c. 組識別ID,允許用戶組成組,指定組訪問權限

語義一致性:

  • 規定多進程如何同時訪問共享文件:a. 與同步算法相似:b. 因磁盤I/O和網絡延遲而設計簡單
  • 1.Unix文件系統(UFS)語義(將一致性問題甩給應用程序去處理):a. 對打開文件的寫入內容立即對其他打開同一文件的其他用戶可見,b. 共享文件指針允許多用戶同時讀取和寫入文件
  • 2.會話語義:a. 寫入內容只有當文件關閉時可見
  • 3.讀寫鎖

目錄:

文件以目錄的形式組織起來,目錄是一類特殊的文件,目錄的內容是文件索引表<文件名,指向文件的指針>,目錄和文件是樹狀結構。

目錄的操作:搜索,創建,刪除,枚舉,重命名,在文件系統中遍歷一個路徑?

目錄實現:

  • 文件名的線性列表,包含指向數據塊的指針,編程簡單,執行耗時
  • 哈希表,搜索快速,引起沖突,長度固定

文件別名:

硬鏈接與軟鏈接:

  • 硬鏈接:多個文件項指向一個文件,刪除到最后一個指向他的文件名時刪除實體
  • 軟鏈接:以快捷方式指向其他文件,刪除快捷方式不影響實體,刪除實體則快捷方式無效了

文件目錄中的循環:

?

?避免方式:

  • 只允許到文件的鏈接,不允許到目錄的鏈接
  • 增加鏈接時,用循環檢測算法確定是否合理
  • 實際操作系統中通常限制路徑可遍歷文件目錄的數量,超過指定長度停止檢索

名字解析(路徑遍歷):

名字解析即把邏輯名字轉換成物理資源,有兩種方式:

  1. 依據路徑名,在文件系統中找到實際文件位置,
  2. 進程設置當前工作目錄,從工作目錄開始往下解析,用相對路徑代替絕對路徑
  3. 例子:解析“/bin/ls”:讀取根目錄的文件頭;讀取根目錄的數據塊,搜索"bin“項;讀取bin的文件頭;讀取bin的數據塊,搜索"ls"項;讀取ls的文件頭。

文件系統掛載:

文件系統需要先掛載才能被訪問,未掛載的文件系統被掛載到掛載點上才能被找到。

文件系統種類:

  1. 磁盤文件系統:a. 文件存儲在數據存儲設備上,如磁盤,b. 例如:FAT、NTFS、ext2/3,ISO9660等
  2. 數據塊文件系統:a. 文件特征可悲尋址,b. 例如WinFS
  3. 日志文件系統:a. 記錄文件系統的修改/事件
  4. 網絡/分布式文件系統:a. 例如:NFS,SMB,AFS,GFS。?b. 文件可以通過網絡被共享,文件位于遠程服務器,客戶端遠程掛載服務器文件系統,標準系統文件訪問被轉換成遠程訪問,要有標準文件共享協議。c. 面臨更多挑戰,例如客戶端用戶辨別、一致性問題、錯誤處理模式。

文件系統的實現

分層結構:虛擬文件系統(VFS,Virtual File System)、特定文件系統模塊

虛擬文件系統:

虛擬文件系統的提出是為了面對多種不同的文件系統對上提供一種統一的接口。

目的:
????????1.對所有不同文件系統的抽象

?功能:
????????1.提供相同的文件和文件系統接口(對上)

????????2.管理所有文件和文件系統關聯的數據結構

????????3.高效查詢歷程,遍歷文件系統

????????4.與特定文件系統模塊的交互(對下)

文件系統基本數據結構:

1.文件卷控制塊(Unix:superblock)

?????????????a. 每個文件系統一個

?????????????b. 文件系統詳細信息

?????????????c. 塊、塊大小、空余塊、計數/指針等

2.文件控制塊(Unix:vnode || inode)

?????????????a. 每個文件一個

?????????????b. 文件詳細信息

?????????????c. 訪問權限、擁有者、大小、數據塊位置等

3.目錄項(Linux:dentry)

?????????????a. 每個目錄項一個(目錄和文件)

?????????????b. 將目錄項數據結構及樹形布局編碼成樹形數據結構

?????????????c. 指向文件控制塊、父目錄、子目錄等

上述數據結構需要持久存儲在外存中,當需要時加載進內存:

????????1.卷控制塊:當文件系統掛載時進入內存;

????????2.文件控制塊:當文件被訪問時加載進內存

????????3.目錄項:便利一個文件路徑時進入內存

文件緩存與打開文件:?

?????????多個位置都存在磁盤緩存,操作系統主要討論內存中的數據塊緩存。

數據塊緩存:

1.數據塊按需存入內存

????????????a. 提供read()操作

????????????b. 預讀:預先讀取后面的數據塊

2.數據塊使用后被緩存

????????????a. 假設數據將會再次用到

????????????b. 寫操作可能被緩存和延遲寫入

3.兩種數據塊緩存方式

????????????a. 數據塊緩存

????????????b. 頁緩存:同一緩存數據塊和內存頁

打開文件的數據結構:

??????????每個被打開的文件都有一個文件描述符,包含了文件狀態信息:目錄項、當前文件指針、文件操作設置等

??????????每個進程管理一個進程打開文件表,系統還維護一個系統級的打開文件表,有文件打開時,文件卷就不能被卸載。

打開文件鎖

有了打開文件表,文件系統可以提供打開文件鎖,用于協調多進程的文件訪問:

?????????1.強制:根據鎖保持情況和訪問需求確定是否拒絕訪問

?????????2.勸告:進程可以查找鎖的狀態來決定怎么做

文件大小:

????????大多數文件都很小:

????????????a. 需要對小文件提供很好的支持

????????????b. 塊空間不能太大

????????一些非常大的文件

????????????a. 必須支持大文件(64位文件偏移)

????????????b. 大文件訪問必須高效

文件分配:

????????本質是如何表示分配給一個文件數據塊的位置和順序

????????分配方式:

???????????a. 連續分配:

???????????????文件頭指定起始塊和長度

???????????????分配策略:最佳匹配、最先匹配

???????????????優點是文件讀取表現好,高效的順序和隨機訪問,缺點是碎片,文件增長問題,文件增大時的策略比較棘手

???????????b. 鏈式分配:

???????????????文件以數據庫鏈表方式存儲

???????????????文件頭包含了到第一塊和最后一塊的指針

???????????????優點是創建、增大、縮小都很容易,沒有碎片,但是隨機訪問無法實現,效率低。可靠性較差,一個鏈被破壞,后面的數據塊就丟失了。

???????????c. 索引分配:

???????????????為每個文件創建一個索引數據塊,指向文件數據塊的指針列表

???????????????文件頭包含了索引數據塊指針

???????????????優點是創建、增大、縮小容易,沒有碎片,支持直接訪問,缺點是文件很小時,存儲索引開銷大,大文件索引塊可能大小不夠。

????????指標:

???????????a. 存儲效率:外部碎片等

???????????b. 讀寫性能:訪問速度

????????實際文件系統中通常幾種方式組合應用,例如對大文件索引塊使用鏈表組織,多級索引。

空閑空間管理:

??????????空閑空間管理是指跟蹤記錄文件卷中未分配的數據塊。

空閑空間組織方式:

?????????1.位圖法:使用簡單,但大磁盤需要一個很大的向量表記錄空閑空間。

?????????2.鏈表法

?????????3.鏈式索引

典型的磁盤文件系統組織

分區:硬盤磁盤的一種適合操作系統指定格式的劃分?

文件卷:一個擁有一個文件系統實例的可訪問的外存空間?

冗余磁盤陣列RAID:

?????????希望使用多磁盤改善吞吐量、可靠性和可用性,以提高性能。如RAID0,RAID1,RAID4。

冗余磁盤陣列的實現:

?????????1.軟件:操作系統內核的文件卷管理

?????????2.硬件:RAID硬件控制器(I/O)

RAID0(磁盤條帶化):
?????????把數據塊分成多個子塊,存儲在獨立的磁盤中,通過獨立磁盤上并行訪問數據塊提供更大的磁盤帶寬

RAID1(磁盤鏡像):
????????同時向兩個磁盤寫入相同的數據,可靠性成倍增長,讀取性能線性提升

RAID4(帶校驗的磁盤條帶化):
?????????數據塊級的磁盤條帶化加專用奇偶校驗磁盤,一個磁盤專用于奇偶校驗,允許只有一個磁盤發生故障時進行數據恢復

RAID5(帶分布式校驗的磁盤條帶化):
????????數據塊的校驗和不單獨存放在固定的一個磁盤中,而是分布在多個磁盤中,減少對RAID4中奇偶校驗磁盤的讀寫壓力

RAID6(每組條帶有兩個冗余塊),允許兩個磁盤出錯

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

卡巴綠殺6 By Moshow魔手

卡巴綠殺6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【這是卡巴斯基綠色移動版本推薦用于u盤】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下無毒)擁有全球最全的病毒庫)擁有最快的全球剿毒反應速度) 基于穩定…

python將字符串寫入csv_用Python將字符串值寫入CSV文件

我有一個很大的數據集&#xff0c;在第二列有句子和他們的情緒狀態。我開發了代碼來將它們讀作numpy數組。我需要的是&#xff0c;如果一個句子的情感是中性的&#xff0c;那么返回為真&#xff0c;否則返回假。if-else條件返回的每個結果都應寫入CSV文件。但是這里它只在CSV文…

加載靜態文件,父模板的繼承和擴展

用url_for加載靜態文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 從static文件夾開始尋找可用于加載css, js, image文件繼承和擴展把一些公共的代碼放在父模板中&#xff0c;避免每個模板寫同樣的內容。base.html子模板繼…

清華大學《操作系統》(二十三):I/O子系統

常見設備接口類型&#xff1a; 1、字符設備&#xff1a;鍵盤鼠標、串口 a.以字節為單位順序訪問 b.I/O命令通常使用文件訪問接口和語義 2、塊設備&#xff1a;磁盤、磁帶、光驅 a.均勻的數據塊訪問 b.I/O命令通常使用文件系統接口&#xff0c;也可以使用內存映射訪問 3、網絡…

百度地圖 Android SDK - 個性化地圖

什么是百度個性化地圖Android SDK&#xff1f; 百度個性化地圖Android SDK是一套基于Android 2.2及以上版本號設備的應用程序接口&#xff0c;您能夠通過該套接口實現主要的地圖功能&#xff0c;而且能夠定制地圖樣式&#xff0c;實現個性化地圖。 該接口提供下面功能&#xff…

mysql讀寫分離_MySQL基于amoeba讀寫分離實驗

主從復制只是一個同步數據的方式讀寫分離&#xff1a;只在主的上面寫&#xff0c;只在從的上面讀讀寫分離方案&#xff1a;【1】基于程序代碼內部 (生產環境中應用最廣泛&#xff0c;性能最好&#xff0c;需要開發人員來實現)【2】基于中間代理層的實現amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所謂Django models模型&#xff0c;是指的對數據庫的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在這里的意思是通過models&#xff0c;將數據庫的借口抽象成python自己的一個類。然后在python Django框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的機制&#xff0c;在當前頁使用MasterPage的情況下&#xff0c;放在 ContentPlaceholder1這樣的內容頁的控件無法用Page.FindControl來查找&#xff0c;原因何在&#xff1f;MSDN對FindControl的解釋&#xff1a;在當前的命名容器…

ATT匯編語言與GCC內嵌匯編簡介

AT&T匯編語言與GCC內嵌匯編簡介 1 AT&T 與INTEL的匯編語言語法的區別 1.1大小寫 1.2操作數賦值方向 1.3前綴 1.4間接尋址語法 1.5后綴 1.6指令 2 GCC內嵌匯編 2.1簡介 2.2內嵌匯編舉例 2.3語法 2.3.1匯編語句模板 2.3.2輸出部分 2.3.3輸入部分 2.3.4限制字符 2.3.5破…

Python內存管理以及垃圾回收機制

垃圾回收&#xff1a;用通俗點的語言解釋就是內存管理和垃圾回收的過程. 大管家refchain 在Python的C源碼中有一個名為refchain的環狀雙向鏈表&#xff0c;這個鏈表就比較厲害了&#xff0c;因為Python程序中一旦創建對象都會把這個對象添加到refchain這個鏈表中。也就是說他…

pythonfillcolor_openpyxl 填充顏色(單元格)

如果需要填充某個單元格的顏色需要3步&#xff1a;# 1-加載庫文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一個工作簿wb Workbook()ws wb.active#隨便賦個值d4 ws[D4]d4 43d4.value#3-設置樣式&#xff0c;并且加載到對應單元格fill …

Mint-ui中loadmore(上拉加載下拉刷新)組件在ios中滑動會觸發點擊事件的解決方法...

bug說明&#xff1a; Mint-ui中loadmore(上拉加載下拉刷新)組件 在 使用fastclick的情況下 &#xff0c;在ios設備中滑動會觸發點擊事件&#xff1b; 解決方法&#xff1a; 我是按需引入&#xff0c;去項目中找到loadmore下的index.js&#xff0c;全部引入的要找mint下面mint-u…

【Ext.Net學習筆記】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨瀏覽器的ExtJS庫和.NET Framework的一套支持ASP.NET AJAX的開源Web控件&#xff0c;包含有豐富的Ajax運用&#xff0c;其前身是Coolite。 下載地址&#xff1a;http://www.ext.net/download/ 示例地址&#xff1a;http://examples.ext.net/ 1.首先下載Ext.Net,地…

面試之操作系統

基本特征 1. 并發 并發是指宏觀上在一段時間內能同時運行多個程序&#xff0c;而并行則指同一時刻能運行多個指令。并行需要硬件支持&#xff0c;如多流水線、多核處理器或者分布式計算系統。操作系統通過引入進程和線程&#xff0c;使得程序能夠并發運行。 2. 共享 共享是指…

mysql新增列并同時增加數據_圖解MySQL | [原理解析] MySQL 為表添加列 是怎么quot;立刻quot;完成的...

在上一期圖解 圖解MySQL | MySQL DDL為什么成本高&#xff1f;中&#xff0c;我們介紹了&#xff1a;傳統情況下&#xff0c;為表添加列需要對表進行重建騰訊團隊為 MySQL 引入了 Instant Add Column 的方案(以下稱為 "立刻加列" 功能)可以快速完成 為表添加列 的任務…

GCC for Win32開發環境介紹

GCC for Win32開發環境介紹(1) 第一章 在視窗操作系統下的GCC 第一節GCC家族概覽 GCC是一個原本用于Unix-like系統下編程的編譯器。不過&#xff0c;現在GCC也有了許多Win32下的移植版本。所以&#xff0c;也許對于許多Windows開發者來說&#xff0c;GCC還是一個比較陌生的東西…

包裝函數

function wrap(object,method,wrapper){ //object:包裝方法所屬對象 method:方法名 wrapper:替換函數var fn object[method];return object[method] function(){return wrapper.apply(this,[fn.bind(this)].concat(Array.prototype.slice.call(arguments)));}; } 轉載于…

JAR——pinyin4j-2.5.0

簡介&#xff1a;將中文轉為拼音&#xff1b; 使用&#xff1a; 123//返回的是字符串String pinyin[] PinyinHelper.toHanyuPinyinStringArray(chinese);//eg:你----ni3本文轉自wauoen51CTO博客&#xff0c;原文鏈接&#xff1a;http://blog.51cto.com/7183397/1605894&#…

Android高效加載大圖、多圖解決方案,有效避免程序OOM

http://blog.csdn.net/guolin_blog/article/details/9316683轉載于:https://www.cnblogs.com/jianglijs/p/7827524.html

Flask 上下文源碼解析

簡單來說&#xff0c;上下文包括request_ctx(封裝了request和session),app_request(封裝了app和g)&#xff0c;兩個ctx都儲存在一個叫做Local的數據結構中&#xff0c;這個結構的作用就是會自動根據不同的線程id返回對應的數據&#xff0c;然后通過一個叫做 LocalStark 的結構把…