【轉】inode快取與dentry快取
1. inode快取
1: struct inode {
2: /* RCU path lookup touches following: */
3: umode_t i_mode;
4: uid_t i_uid;
5: gid_t i_gid;
6: const struct inode_operations *i_op;
7: struct super_block *i_sb;
8:
9: spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
10: unsigned int i_flags;
11: unsigned long i_state;
12: #ifdef CONFIG_SECURITY
13: void *i_security;
14: #endif
15: struct mutex i_mutex;
16:
17:
18: unsigned long dirtied_when; /* jiffies of first dirtying */
19:
20: struct hlist_node i_hash;
21: struct list_head i_wb_list; /* backing dev IO list */
22: struct list_head i_lru; /* inode LRU list */
23: struct list_head i_sb_list;
24: union {
25: struct list_head i_dentry;
26: struct rcu_head i_rcu;
27: };
28: unsigned long i_ino;
29: atomic_t i_count;
30: unsigned int i_nlink;
31: dev_t i_rdev;
32: unsigned int i_blkbits;
33: u64 i_version;
34: loff_t i_size;
35: #ifdef __NEED_I_SIZE_ORDERED
36: seqcount_t i_size_seqcount;
37: #endif
38: struct timespec i_atime;
39: struct timespec i_mtime;
40: struct timespec i_ctime;
41: blkcnt_t i_blocks;
42: unsigned short i_bytes;
43: struct rw_semaphore i_alloc_sem;
44: const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
45: struct file_lock *i_flock;
46: struct address_space *i_mapping;
47: struct address_space i_data;
48: #ifdef CONFIG_QUOTA
49: struct dquot *i_dquot[MAXQUOTAS];
50: #endif
51: struct list_head i_devices;
52: union {
53: struct pipe_inode_info *i_pipe;
54: struct block_device *i_bdev;
55: struct cdev *i_cdev;
56: };
57:
58: __u32 i_generation;
59:
60: #ifdef CONFIG_FSNOTIFY
61: __u32 i_fsnotify_mask; /* all events this inode cares about */
62: struct hlist_head i_fsnotify_marks;
63: #endif
64:
65: #ifdef CONFIG_IMA
66: atomic_t i_readcount; /* struct files open RO */
67: #endif
68: atomic_t i_writecount;
69: #ifdef CONFIG_FS_POSIX_ACL
70: struct posix_acl *i_acl;
71: struct posix_acl *i_default_acl;
72: #endif
73: void *i_private; /* fs or device private pointer */
74: };
inode可能處於三種狀態:
1)unused,裡面沒有儲存有效的內容,可以被複用為新的用途;
2)in use,正在被使用,其成員i_count以及i_nlink一定大於0,此時inode與檔案系統或者說裝置上的檔案相關聯,但是自從上次與裝置同步後,內容沒有發生改變,即不是dirty的;
3)dirty,inode裡面的內容已經與檔案系統中的檔案內容不一致了,即髒了,需要進行檔案同步操作。
前兩種狀態的inode都各自位於一個全域性的連結串列中,而第三種的inode位於super_block結構體中的一個連結串列中。
先看inode結構體中的一個成員:
struct list_head i_lru; /* inode LRU list */
對應著一個全域性的連結串列:
static LIST_HEAD(inode_lru);
static DEFINE_SPINLOCK(inode_lru_lock);
1: /*
2: * Called when we're dropping the last reference
3: * to an inode.
4: *
5: * Call the FS "drop_inode()" function, defaulting to
6: * the legacy UNIX filesystem behaviour. If it tells
7: * us to evict inode, do so. Otherwise, retain inode
8: * in cache if fs is alive, sync and evict if fs is
9: * shutting down.
10: */
11: static void iput_final(struct inode *inode)
12: {
13: struct super_block *sb = inode->i_sb;
14: const struct super_operations *op = inode->i_sb->s_op;
15: int drop;
16:
17: WARN_ON(inode->i_state & I_NEW);
18:
19: if (op && op->drop_inode)
20: drop = op->drop_inode(inode);
21: else
22: drop = generic_drop_inode(inode);
23:
24: if (!drop && (sb->s_flags & MS_ACTIVE)) {
25: inode->i_state |= I_REFERENCED;
26: if (!(inode->i_state & (I_DIRTY|I_SYNC)))
27: inode_lru_list_add(inode);
28: spin_unlock(&inode->i_lock);
29: return;
30: }
31:
32: if (!drop) {
33: inode->i_state |= I_WILL_FREE;
34: spin_unlock(&inode->i_lock);
35: write_inode_now(inode, 1);
36: spin_lock(&inode->i_lock);
37: WARN_ON(inode->i_state & I_NEW);
38: inode->i_state &= ~I_WILL_FREE;
39: }
40:
41: inode->i_state |= I_FREEING;
42: inode_lru_list_del(inode);
43: spin_unlock(&inode->i_lock);
44:
45: evict(inode);
46: }
函式iput_final是在當inode沒有被任何地方引用後,即變成了unused狀態後,回收inode的機制。
if (op && op->drop_inode)
drop = op->drop_inode(inode);
else
drop = generic_drop_inode(inode);
drop為0時,表示i_nlink為0,並且inode沒有儲存著inode_hashtable中的拉鍊表,即這個inode可以被釋放掉。
1: /*
2: * Normal UNIX filesystem behaviour: delete the
3: * inode when the usage count drops to zero, and
4: * i_nlink is zero.
相關推薦
【轉】inode快取與dentry快取
inode快取與dentry快取 ,轉載,供學習參考 1. inode快取 1: struct inode { 2: /* RCU path lookup touches following: */
【轉】ehcache實現頁面整體快取和頁面區域性快取
ehcache實現頁面整體快取和頁面區域性快取 之前寫過spring cache和ehcache的基本介紹和註解實現快取管理,今天記錄下web專案的頁面快取技術。 頁面快取是否有必要?。 這樣說吧,幾乎所有的網站的首頁都
【轉】JavaScript MD5 與 Java MessageDigest 加密後的值相同
cda padding highlight xe7 net abs algorithm urn -a function integer(n) { return n%(0xffffffff+1); } function shr(a,b) { a=integer(a);
【轉】https淺析與抓包
img 網站 字節 pan 嗅探 www. tcp 解析 算法 0.HTTP之殤 數據明文傳輸,易嗅探 數據完整性無驗證,易篡改 網站身份無認證,易假冒 由此誕生HTTPS。 1.什麽是HTTPS HTTP + SSL/TLS TLS是SSL的升級版
【轉】凸集與凸函數
strong 不同 rap 因此 src image com 求解 函數 來自:https://blog.csdn.net/kebu12345678/article/details/54926287 凸函數:如果函數f(x)的圖像上方的點構成的集合是一個凸集的話,那麽
【轉】策略模式與命令模式區別
區別 相同 策略模式 菜單 nbsp 之間 mman 變化 排隊 策略模式 把易於變化的行為分別封裝起來,讓它們之間可以互相替換, 讓這些行為的變化獨立於擁有這些行為的客戶。GoF《設計模式》中說道:定義一系列算法,把它們一個個封裝起來,並且使它們可以相互替換。該模式使得算
Git衝突與解決方法【轉】 Git衝突與解決方法
本文轉載自:https://www.cnblogs.com/gavincoder/p/9071959.html Git衝突與解決方法 1、git衝突的場景 情景一:多個分支程式碼合併到一個分支時; 情景二:多個分支向同一個遠端分支推送程式碼時; 實際上,push操作即是將
【轉】男人成熟與不成熟的N個標誌
男人成熟的N個標誌1.以事業為重。2.腳踏實地,明白物質也是愛情的基礎之一。3.當心愛的女人和別的男人在一起時,衷心祝福。4.不對愛情充滿太多幻想。5.著裝得體,精神飽滿。6.擅於發現女人的優點長處並讚美對方。7.有女人緣,但善於把握寸度。8.信守承諾,沒有把握不會輕易許諾。9.說話乾淨利落,不婆婆媽媽。10
【轉】HTTPS淺析與抓包分析 | 老D部落格
0x00 HTTP之殤 資料明文傳輸,易嗅探 資料完整性無驗證,易篡改 網站身份無認證,易假冒 由此誕生HTTPS。 0x01 什麼是HTTPS TLS是SSL的升級版 二圖勝千言: //圖片來源於網路 作用:防嗅探,防篡改,身份認證 0
【轉】IP地址與整數之間的轉換
1、IP地址轉換為整數 原理:IP地址每段可以看成是8位無符號整數即0-255,把每段拆分成一個二進位制形式組合起來,然後把這個二進位制數轉變成 一個無符號32為整數。 舉例:一個ip地址為10.0.3.193 每段數字 相對應的二進位制數 10 00001010 0 00
【轉】VirtualBox 主機與虛擬機器互相訪問且均上外網
VirtualBox中有4中網路連線方式:NAT Bridged Adapter Internal Host-only Adapter VMWare中有三種,其實他跟VMWare 的網路連線方式都是一樣概念,只是比VMWare多了Internal方式。 要讓自己(或別人)理解深刻,方法就是做比較和打比方,比較
【轉】 HDMI介紹與流程
接收 獲得 www gpo rac math ... dev smi 轉自:https://www.cnblogs.com/TaigaCon/p/3840653.html HDMI,全稱為(High Definition Multimedia Interface
Hibernate持久層框架使用【八】效能優化與快取
一級快取: 在hibernate中一級快取是預設開啟的,它與session相關,例如當你對資料庫中的資料進行查詢後,它會將查詢到的物件儲存到記憶體中,再次查詢時便直接從記憶體中讀取,從記憶體中讀取的速度顯然比從資料庫中讀取資料要快得多。 為了證明,可以寫一個測試類對快取進行測試 publ
【轉】Linux手動釋放快取的方法
Linux手動釋放快取的方法 轉自:https://www.cnblogs.com/focai/p/5829897.html Linux釋放記憶體的命令: sync echo 1 > /proc/sys/vm/drop_caches drop_caches的值可以是0-3之間的數字,代
【轉】ZFS讀快取深入研究:ARC
本文對ZFS的ARC機制講的比較清晰易懂,轉載學習下。【轉自】http://blog.chinaunix.net/uid-28466562-id-3837685.html ZFS 讀快取深入研究:ARC 在Solaris ZFS 中實現的ARC(Adjustable Replacement
【轉】瀏覽器快取知識小結及應用
開發過程中瞭解到的和瀏覽器快取相關的兩個名詞,強快取和協商快取。算是碰到了知識的盲點,在網上學習的過程中發現一篇帖子總結的非常不錯,特此轉載,以便日後複習以及推介給大家。先給出原文連結:瀏覽器快取知識小結及應用-------我是分割線-------瀏覽器快取,也就是客戶端快取
【Hibernate學習筆記】Session清空快取與清理快取
1. 清空快取 當呼叫session.evict(customer); 或者session.clear(); 或者session.close()方法時,Session的快取被清空。 2. 清理快取 Session具有一個快取,位於快取中的物件處於持久化狀態
Linux內核中的中斷棧與內核棧的補充說明【轉】
desc 試圖 調度 php == over 註冊 tex 存在 轉自:http://blog.chinaunix.net/uid-12461657-id-3487463.html 原文地址:Linux內核中的中斷棧與內核棧的補充說明 作者:MagicBoy2010
用戶空間與內核空間,進程上下文與中斷上下文[總結]【轉】
存儲器 com ont article 模式 tab 用戶代碼 ssi 而在 轉自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文轉載自:http://www.cnblogs.com/Anker/p/3
【轉】哈希(Hash)與加密(Encrypt)的基本原理、區別及工程應用
phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以