精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從根上理解 Node.js 的 Fs 模塊:一起設計一個文件系統

開發 前端
Node.js 提供了 File System 的 api,可以讀寫文件、目錄、修改權限、創建軟鏈等。可能大家 api 用的比較熟練,但對于這些 api 的原理不一定理解。要想真正理解 File System,還得從根上來看。

[[424137]]

Node.js 提供了 File System 的 api,可以讀寫文件、目錄、修改權限、創建軟鏈等。

可能大家 api 用的比較熟練,但對于這些 api 的原理不一定理解。要想真正理解 File System,還得從根上來看。

下面我們從 0 到 1 設計一個文件系統試試。

從 0 到 1 設計一個文件系統

什么是文件呢?

[[424138]]

這樣一份比較完整的資料就是文件。

但是計算機的持久化存儲是在硬盤,主要是磁盤和 SSD 固定硬盤:

計算機里的文件是一個邏輯概念,并不是物理上存在的一個個實體。

那么如果給了這樣一個硬盤,讓我們自己造一個文件系統出來,實現文件的功能。怎么做呢?

簡單想了下:挨著放。

然后還要記錄下索引,啥文件在啥位置:

這樣是可以,但是有個問題,萬一文件 B 被刪除了,那對應的空間就要釋放:

然后又來了一個文件 D,發現放不進去啊,這地方太小了。

A 和 B 中間這塊空間就是碎片,碎片會把磁盤可用空間割裂成不連續的很多小塊。

怎么辦呢?如何更好的利用磁盤空間?

分塊!把文件分成一小塊一小塊的,比如 1k 為一個塊,可以不用連續存,把所有塊記錄在索引中就行了。

索引咋記錄的看不清,放大點來看:

每個文件的索引中都記錄了把數據存在了哪幾個塊,這樣一塊一塊的讀出來就行了。

而且文件刪除了,那些塊還可以繼續用,不會有很大的碎片。

妙啊!

難怪文件系統第一步就是分塊,內存管理第一步是分頁,這樣才能高效利用空間啊。

這種索引節點,可以叫做 index node,簡稱 inode 就好了。

而且,除了文件名和存放的塊以外,還可以記錄其他信息,比如創建時間、修改時間、文件權限、所屬用戶等等。

到這里就可以對文件下個物理層面上的定義了: 文件就是 inode 記錄的信息和它所索引的一系列數據塊。

那我寫文件利用了一個塊,刪除文件釋放了一個塊,怎么知道呢?得單獨記錄下來塊的狀態。

數據塊只有空閑和被占用兩個狀態,一個二進制位就行了。通過一段二進制數把所有塊的空閑狀態記錄下來。一個位代表一個值,這叫做位圖。在這里就是塊位圖。

硬盤中大部分是數據塊,開頭的一段來放 inode 所在的塊和數據塊的塊位圖。

inode 也是存在塊里的,比如我們規定只能用 5 個塊放 inode,那 inode 總量是有限的,也就是是說文件系統可以創建的文件是有上限的。

我們也要記錄下所有 inode 的空閑狀態,也就是 inode 位圖。

簡單理一下我們設計的文件系統:

為了更好的利用硬盤空間,我們對數據進行了分塊,每個文件用到了哪些塊記錄在 inode 里。inode 還記錄了文件的創建時間、修改時間、權限等信息。

通過塊位圖來記錄數據塊空閑狀態,通過 inode 位圖來記錄 inode 的空閑狀態。

但我如果想知道硬盤中有幾個塊、用了幾個,有幾個 inode、用了幾個,怎么辦呢?

簡單,遍歷一遍塊位圖和 inode 位圖,就知道個數了。

但每次這么算太慢了,這就像我們設計數據庫的時候,一個論壇下面有多少個帖子,這個數據不會是每次用 sql 查詢的,而是在帖子增刪的時候動態維護一個字段在數據庫表中,直接查詢即可。

那我們也設計一個塊用來存這種統計信息,也就是:

這個塊是較高層的統計信息,我們可以叫它超級塊。

現在把我們設計好的文件系統交給用戶,就可以通過它來高效利用硬盤了。

發布版本:神光文件系統 V1.0。

但現在我們的文件系統好像還不是很好用,只能創建文件,那如果我創建了 1000 個文件呢?

查詢起來慢,也容易命名沖突。

怎么辦呢?

命名空間!目錄!就像文件夾的思想一樣。

那怎么實現呢?

每個 inode 是一個文件,那把 inode 組織成樹不就行了。

比如我們有兩個文件 B 和 C:

我們創建一個目錄 A:

在 inode 里面添加一個 isDirectory 的屬性,如果是目錄,那么就讀取數據塊的內容,找到其中的 inode 節點編號,就知道該目錄下的文件了。

這就是目錄的實現原理:通過 inode 的 isDirectory 屬性區分是文件還是目錄,如果是目錄就讀取數據塊中的 inode 信息來查找子文件,如果是文件,則直接讀取數據塊作為文件內容。

從一個 inode 到另一個 inode 的查找順序叫做路徑(path)。

比如這樣一個文件的 inode 查找順序:

那文件路徑就是 /A/D/dongdong.jpg

這就是文件路徑的本質:文件路徑就是 inode 查找順序

現在我們支持目錄的嵌套了,可以把文件、目錄組織成樹形結構方便管理。

發布版本:神光文件系統 v2.0。

現在一個 inode 只有一條路徑過來,因為是樹嘛,那如果我想兩條路徑都可以找到同一個 inode 呢?

比如 /A/D/dongdong.jpg 可以訪問到該文件:

我想通過 /A/B/dongdong.jpg 也能訪問,怎么辦呢?

直接指過去不就行了。

這樣確實可以有兩條路徑找到同一個文件,這個額外的鏈接我們起名叫做硬鏈接。

但是因為一個節點有兩個父節點,就不再是樹了,變成了圖。所以,文件樹這個概念嚴格意義上來說還是存在問題的,可能是個文件圖。

但是我如果想給 dongdong.jpg 換個名字,叫 dongdong2.jpg 呢?

現在都是同一個 inode 節點,改了就都改了。但我只想改 /A/B 的 path 的文件名,別的不改。

那就再創建個 inode 節點,用來改名,然后這個 inode 節點指向 dongdong.jpg。

這種不直接指過去,多了一個 inode 來改名,之后再指過去,這種我們叫做軟鏈接。

為什么叫硬呢?因為改不了,直接指向同一個 inode。

為什么叫軟呢?因為可以改,多了一層 inode 用來改名。

所以我們分別起名硬軟鏈接。

硬鏈接和軟鏈接都是用于多條路徑可以查找到同一個文件的,但是硬鏈接不能單獨改名,軟連接可以。

monorepo 的實現就是基于軟連接的,可以指向同一個目錄 inode,而且還可以起個別名。

實現了軟硬鏈接,可以發新版本了。

發布版本:神光文件系統 v3.0。

復盤一下我們設計的文件系統:

v1.0:

通過數據塊來存儲文件內容,提高硬盤利用效率

通過 inode 記錄所用的數據塊和文件的創建時間、權限等信息

通過塊位圖記錄數據塊的空閑狀態

通過 inode 位圖記錄 inode 空閑狀態。

通過超級塊記錄 inode 和數據塊的統計信息。

這個版本實現了文件的存取,但是不支持目錄。

v2.0:

通過 inode 中添加一個屬性來記錄是文件還是目錄

目錄的數據塊中存放具體文件列表的 inode 信息,讀取目錄的時候可以讀取出文件列表。

按照目錄 inode、文件 inode 的一層層的查找順序叫做文件路徑。

這個版本實現了目錄和路徑的功能。

v3.0:

通過多個目錄 inode 包含同一個 inode 的方式,來實現多條路徑查找同一文件的功能,叫做硬鏈接。

目錄先創建一個 inode 節點用于改名,然后該 inode 節點指向目標 inode 節點,這叫做軟連接。

這個版本實現了多條路徑查找統一文件的軟硬鏈接功能。

真實的文件系統也是類似的實現,目前有很多文件系統,比如 ext2、FAT 等,原理和我們設計的文件系統差不多。

文件系統設計完了,回到最開始的目標,我們是想深入理解 Node.js 的 File System 的 api。下面就來看一下。

Node.js 的文件系統 api

Node.js 通過 V8 注入了 fs 的 api 給 js 用,底層是通過 c++ 調用操作系統的文件系統功能,也就是我們上面設計的那種文件系統。

我們調用的 fs 的 api 最終就是調用了操作系統的文件系統功能。

自己設計了一個文件系統之后,我們再來看下 fs 的 api,是不是理解更深了:

  • fs.stat 獲取 inode 中的信息的
  • fs.chmod 修改文件權限,也是修改 inode 信息
  • fs.chown 修改所屬用戶,也是修改 inode 信息
  • fs.copyFile 復制 inode 和數據塊,把新的 inode 添加到對應目錄的 inode 內容中
  • fs.link 創建軟硬鏈接的,也就是多條路徑查找同一個文件的 inode,軟連接還可以改名
  • fs.mkdir 創建目錄 inode 的
  • fs.rmdir 讀取目錄 inode 包含的所有文件 inode 的

具體 api 還有很多,但都是用來操作我們上面設計的那個文件系統的。

從根上理解了文件系統,用這些 api 也會得心應手。

總結

為了真正理解 Node.js 的 fs 模塊,我們一起設計了一個文件系統:

  • 把文件分成不同數據塊,這樣可以高效利用磁盤空間。
  • 文件的索引節點 index node 中記錄了所包含的數據塊和創建時間、權限、是否是目錄等信息。
  • 通過塊位圖記錄數據塊空閑狀態。
  • 通過 inode 位圖記錄 inode 空閑狀態。
  • 通過超級塊記錄硬盤的 inode、數據塊的使用信息。
  • 通過 inode 對應的數據塊內容包含文件 inode 信息列表的方式實現了目錄節點。

我們得出一些重要結論:

文件本質上就是 inode + 數據塊。

路徑本質上就是查找目標 inode 的路徑。

硬鏈接本質上就是多個目錄 inode 包含同一個 inode。

軟連接本質上就是多創建了一個 inode 用于改名,對應數據塊中指向目標 inode。

Node.js 的 fs api 是通過 c++ 注入 v8 的對操作系統能力的調用,理解了文件系統,再學那些 api 就很輕松了。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2022-04-07 09:29:04

文件系統硬盤操作系統

2025-07-11 08:09:07

Node.jsAPI權限

2021-10-12 23:45:43

NodeJs事件

2023-06-20 06:44:14

Node.jsCPU 負載

2020-11-05 09:27:48

JavaScript開發技術

2024-06-17 11:59:39

2011-10-25 09:28:30

Node.js

2013-11-01 09:34:56

Node.js技術

2020-08-07 10:40:56

Node.jsexpress前端

2022-10-18 18:43:40

Node.js低代碼

2024-03-26 10:38:47

模塊CommonJSES

2019-12-17 11:40:44

Node.js模塊前端

2020-08-24 08:07:32

Node.js文件函數

2024-03-11 10:30:31

Linux文件系統

2024-02-28 08:47:29

文件系統數據

2022-08-29 07:48:27

文件數據參數類型

2022-06-05 13:52:32

Node.jsDNS 的原理DNS 服務器

2011-06-17 10:29:04

Nodejavascript

2021-09-26 05:06:04

Node.js模塊機制

2024-09-10 08:06:41

點贊
收藏

51CTO技術棧公眾號

性欧美video高清bbw| 国产99对白在线播放| 亚洲影院天堂中文av色| 91久久久免费一区二区| 在线观看一区二区三区三州| 性一交一乱一精一晶| 久久久久国产精品一区二区| 久久精品人人做人人爽| 亚洲一区二区在线免费| 国产乱子精品一区二区在线观看| 一区二区三区不卡在线观看| 欧美精品二区三区四区免费看视频 | 最新日韩一区| 亚洲综合在线第一页| 日韩视频在线观看国产| 国产91麻豆视频| 日本女优在线视频一区二区| 久久久久久999| 成人精品一二三区| 婷婷五月色综合香五月| 日韩欧美一二区| 国产一区二区在线免费播放| f2c人成在线观看免费视频| 国产精品久久久99| 欧美性xxxx69| 成人午夜免费福利| 看片网站欧美日韩| 日本一欧美一欧美一亚洲视频| 免费一级片在线观看| 日韩av久操| 亚洲欧美国产一本综合首页| 中文字幕第九页| 精品国产一级| 欧美日韩精品电影| 国产熟人av一二三区| 91超碰在线播放| 一区二区三区中文在线| 亚洲在线播放电影| 韩国三级在线观看久| 99在线热播精品免费| 99久久精品无码一区二区毛片| 在线观看不卡的av| 奇米精品一区二区三区在线观看| 45www国产精品网站| 久久久久成人精品无码| 偷拍欧美精品| 色妞一区二区三区| 久久久久久久毛片| 免费视频一区三区| 亚洲色图综合网| 亚洲人人夜夜澡人人爽| 国产色噜噜噜91在线精品| 日韩一级视频免费观看在线| 欧美国产日韩在线视频| www一区二区三区| 538在线一区二区精品国产| 99sesese| av日韩久久| 91精品国产色综合久久不卡电影| 182午夜在线观看| 欧美综合影院| 制服丝袜中文字幕一区| 一级片免费在线观看视频| 超碰男人的天堂| 欧美天堂在线| 欧美日韩国产高清一区二区 | 成人免费视屏| 亚洲色大成网站www久久九九| 在线观看日本一区| 91精品国产91久久久久久青草| 国产精品久久久久久久久免费丝袜 | 国产精品老熟女视频一区二区| 老司机午夜精品99久久| 91精品久久久久久久久不口人| 国产一区二区小视频| 国产精品77777竹菊影视小说| 国产精品9999久久久久仙踪林| 丰满少妇高潮在线观看| 91麻豆精品一区二区三区| 欧美日韩一区二区视频在线| 午夜在线视频播放| 亚洲男人的天堂av| 成人一对一视频| 日韩a**中文字幕| 欧美久久久久久久久| av影片在线播放| 西野翔中文久久精品字幕| 中文字幕精品av| www.av视频| 午夜在线精品| 成人国产精品色哟哟| 亚洲精品国偷拍自产在线观看蜜桃| 99久免费精品视频在线观看| 图片区小说区区亚洲五月| 国产黄色小视频在线| 天天色综合天天| 亚洲娇小娇小娇小| 卡通动漫国产精品| 日韩一区二区欧美| 日本三级一区二区| 久草热8精品视频在线观看| 不卡一区二区三区视频| 日本电影一区二区在线观看| 亚洲男帅同性gay1069| 免费在线观看的av网站| 国产成人久久精品一区二区三区| 日韩成人在线网站| 国产免费美女视频| 欧美亚洲免费| 亚洲自拍偷拍在线| 国产福利小视频在线| 亚洲国产sm捆绑调教视频 | 精品3atv在线视频| 精品日韩在线一区| 99久久99久久精品免费看小说.| 欧美私人啪啪vps| 国产精品老女人精品视频| 好吊色视频一区二区| 国产精品欧美精品| 18禁男女爽爽爽午夜网站免费| 国产一区二区三区精品在线观看| 国产亚洲欧美视频| 五月婷婷开心网| 国产成人精品三级麻豆| 亚洲图片小说在线| 色综合一本到久久亚洲91| 极品日韩av| 精品一区二区三区在线| 亚洲网址你懂得| 日本少妇性生活| 韩国av一区二区三区四区| 视频一区二区三| 亚洲v.com| 亚洲国产精品大全| 国产精品九九九九九九| 久久99久久99精品免视看婷婷| 人禽交欧美网站免费| 欧美xxxhd| 亚洲电影免费观看高清完整版在线观看 | 国产二区国产一区在线观看| 午夜精品一区二区在线观看| 欧美片第一页| 亚洲欧美国产视频| 日韩 国产 欧美| 91免费小视频| 日韩欧美亚洲天堂| 另类在线视频| 97在线免费视频| 天天摸夜夜添狠狠添婷婷| 亚洲高清免费观看| 大尺度做爰床戏呻吟舒畅| 亚洲视频观看| 国产日韩精品久久| 九色porny丨入口在线| 精品国产乱码久久久久久老虎| 超碰手机在线观看| 国产精品69毛片高清亚洲| 老司机午夜网站| 一区二区亚洲视频| 久久久久久久久久久免费| 蜜桃在线一区二区| 岛国av在线不卡| 国产精品无码一区二区三区| 水蜜桃久久夜色精品一区的特点| 欧美日韩精品免费观看视一区二区| 性感女国产在线| 夜夜嗨av色综合久久久综合网| 一区二区视频播放| 亚洲黄色在线视频| 午夜剧场免费看| 国产精品入口66mio| 欧美日韩一区二区三区在线视频 | 欧美无人区码suv| 亚洲在线免费| 亚洲v国产v| 蜜桃精品一区二区三区| 国内精品久久久久| 国产小视频在线| 欧美日韩夫妻久久| 久久亚洲AV无码| 99国内精品久久| 九色porny91| 亚洲精品中文字幕乱码| 国产日韩久久| 中文字幕av一区二区三区佐山爱| 日韩中文字幕网| 亚洲女人18毛片水真多| 色婷婷综合久久久中文一区二区| 在线日韩国产网站| youjizz国产精品| 无限资源日本好片| 红桃视频国产精品| 日韩欧美99| 97青娱国产盛宴精品视频| 日本中文字幕不卡免费| av免费网站在线观看| 亚洲码在线观看| 国产jzjzjz丝袜老师水多| 色综合激情久久| 欧美成欧美va| 国产日韩欧美电影| 在线看黄色的网站| 免费成人av资源网| 91精品国产91久久久久麻豆 主演| 国产乱码精品一区二区亚洲| 91精品入口蜜桃| 性感美女一区二区在线观看| 欧美精品激情在线| 五月天婷婷在线视频| 日韩经典第一页| 精品黑人一区二区三区国语馆| 色欧美日韩亚洲| 国产一级性生活| 国产精品久久久久久久久晋中 | 国产精品爽爽久久久久久| 欧美午夜美女看片| 欧美久久久久久久久久久久| 国产精品日韩精品欧美在线| 久久一区二区电影| 国产成人h网站| 粉色视频免费看| 久久亚洲国产精品一区二区| 国产在线播放观看| 欧美一区二区三区久久精品| 视频一区视频二区视频三区视频四区国产| 成人资源在线| 91九色蝌蚪成人| 四虎影视国产精品| 国产精品美女在线| 偷拍中文亚洲欧美动漫| 91av视频导航| 1区2区在线| 欧美国产日韩一区二区三区| 国产精品一卡二卡三卡 | 中文在线字幕免费观看| 中文字幕日韩欧美精品在线观看| 青青草视频免费在线观看| 精品成人一区二区三区四区| 性做久久久久久久久久| 欧美一级在线免费| 国产区精品在线| 51久久夜色精品国产麻豆| 亚洲天堂中文在线| 欧美日韩美女一区二区| 中文字幕 亚洲视频| 欧美在线看片a免费观看| 日韩精品一区二区亚洲av| 欧美日韩国产中字| 日韩中文字幕在线观看视频| 欧美午夜精品久久久久久人妖| 久久久久亚洲av成人毛片韩| 福利微拍一区二区| 国产成人无码专区| 欧美伊人久久久久久午夜久久久久| 91在线视频免费播放| 91黄色在线观看| 一区二区自拍偷拍| 91精品国产综合久久久久久久久久 | 欧美日韩国产成人在线免费| 亚洲天堂免费av| 欧美一卡二卡在线| 免费国产黄色片| 国产丝袜一区二区| av男人的天堂在线| 久久久精品一区| 日本在线观看大片免费视频| 97色在线视频观看| 免费电影日韩网站| 国产日韩欧美91| 国色天香久久精品国产一区| 国产伦精品一区二区三区免| 亚洲国产精品嫩草影院久久av| 欧美综合77777色婷婷| 欧美电影免费播放| 精品人妻大屁股白浆无码| 母乳一区在线观看| 亚洲综合婷婷久久| 岛国精品一区二区| 日韩在线免费观看av| 亚洲视频综合在线| 精品成人免费视频| 欧美无砖专区一中文字| 99久久精品无免国产免费| 亚洲第一视频网| av成人手机在线| 久久久亚洲精选| 成人在线观看免费视频| 91久久久一线二线三线品牌| 四虎影视精品| 91免费视频黄| 香蕉成人久久| 日韩欧美中文视频| 久久综合色播五月| 欧美三级小视频| 欧美性xxxxxxxx| 动漫av一区二区三区| 中文字幕亚洲欧美在线| 超碰在线资源| 国产精品私拍pans大尺度在线| 国产精品网址| 正在播放国产精品| 国产视频一区免费看| 色偷偷中文字幕| 国产精品亲子乱子伦xxxx裸| 国产精品黄色网| 91精品麻豆日日躁夜夜躁| 国产污视频在线| 97视频在线观看网址| 午夜免费欧美电影| 亚洲午夜精品久久| 鲁大师成人一区二区三区| 久久黄色一级视频| 国产精品青草综合久久久久99| 亚洲免费在线观看av| 精品久久久久久久一区二区蜜臀| 日本在线免费| 国产91在线播放| 天堂俺去俺来也www久久婷婷| 国产在线拍揄自揄拍无码| 久久精品亚洲| 大乳护士喂奶hd| 依依成人精品视频| 99国产精品久久久久99打野战| 在线观看国产精品日韩av| www.成人爱| 精品国产一区二区三区四区精华 | 国产精品99久久免费观看| 综合视频在线观看| 蜜臀久久久99精品久久久久久| 亚洲第一页av| 亚洲444eee在线观看| 亚洲狼人综合网| 九九久久国产精品| 国产一区二区三区黄网站| 在线精品日韩| 久久精品久久精品| 亚洲天堂精品一区| 欧美三级电影精品| 91精品专区| 国产精品欧美亚洲777777| 日韩精品四区| 欧美午夜aaaaaa免费视频| 国产亚洲成av人在线观看导航| 香蕉影院在线观看| 亚洲欧美日韩爽爽影院| 亚洲美女久久精品| 日韩av电影免费在线| 日本不卡的三区四区五区| 极品人妻videosss人妻| 欧美午夜精品电影| 中国日本在线视频中文字幕| 国产精品网站大全| 97精品国产福利一区二区三区| 日韩一区二区三区不卡视频| 国产精品日韩精品欧美在线| 国产口爆吞精一区二区| 欧美成人h版在线观看| 中文在线免费一区三区| 国产精品一色哟哟| 91视频国产资源| 日本一区二区三区久久| 久久久成人av| 动漫3d精品一区二区三区乱码| 久久久久久久久久网| 久久美女高清视频| 黄色一区二区视频| 久久这里有精品| 国产欧美啪啪| 北条麻妃av高潮尖叫在线观看| 国产精品国产自产拍在线| 国产福利第一页| 97精品免费视频| 欧美肉体xxxx裸体137大胆| 99国产精品久久久久久| 亚洲一区二区三区不卡国产欧美| 日韩av成人| 国产一区二区香蕉| 亚洲无线一线二线三线区别av| aa片在线观看视频在线播放| 欧美在线观看一区二区| 日本孕妇大胆孕交无码| 久久精品aaaaaa毛片| 蜜桃视频一区二区三区| 毛片a片免费观看| 亚洲女人天堂成人av在线| 一区在线不卡| 国产成人在线免费看| 国产欧美精品一区二区三区四区| 国产精品爽爽久久久久久| 97视频在线观看视频免费视频 | **性色生活片久久毛片| 黄色一级a毛片| 国产精品久久久久久久久久新婚| 欧美在线黄色| 偷拍夫妻性生活| 91精品欧美久久久久久动漫 | 五月天婷婷在线视频| 国产欧美日韩亚洲| 久久99国内精品| 中文字幕超碰在线|