筆記
btree模塊苍苞,通過pager模塊來讀和寫二進制文件,通過pager模塊筒饰,把sqlite文件看成一個由page組成的數(shù)組缴啡。所有的操作,都是先從磁盤讀取到內(nèi)存瓷们,操做完了以后再寫回业栅。
這里假設(shè) 數(shù)據(jù)庫足夠大,比內(nèi)存還要大
再內(nèi)存中用來存放部分數(shù)據(jù)庫數(shù)據(jù)的叫做cache 或者 data buffer 在sqlite中稱作為page cahce
pager的責任是使得上層透明谬晕,并且提供一個在 mian memory中可以通過地址訪問的功能
pager的功能
也提供一些事務處理的特性:事務管理碘裕,數(shù)據(jù)管理,日志管理攒钳,鎖管理
- 數(shù)據(jù)管理:協(xié)調(diào)帮孔,cache和文件數(shù)據(jù)讀寫,文件空間管理
- 日志管理:journal file when wrting
- 鎖管理:使得事務成為可能
pager實現(xiàn)數(shù)據(jù)持久化夕玩,和事務自動化
每個pagecache 表示一個一個程序的內(nèi)存空間你弦,多個連接,有多個pagecache燎孟。
sqlite 沒有使用系統(tǒng)的緩存機制自己每次需要cache的時候直接從native file 獲取
舊版本是這樣禽作,我閱讀的新的版本,在開啟debug模式的時候揩页,才會直接從硬盤讀取
pager manage至關(guān)重要
pager 結(jié)構(gòu)中的ahash數(shù)組旷偿,是用來存放hashtable用來訪問在 page cache中的page(新版本,中page結(jié)構(gòu)沒有ahash這個數(shù)組爆侣,而是存放一個函數(shù)的指針萍程,通過傳入xGet函數(shù)指針,傳入?yún)?shù)訪問兔仰,真正獲取的函數(shù)為getPageNormal)
每個hash茫负,指向一個桶,每個桶乎赴,中有多個page忍法,組成一個linkedlist 內(nèi)部是無序的
pgHdr只能pager看到 btree不能看到
dirty表示,還沒有寫回到native文件中
nref來運行LRU
nref表明是否pined down 如果沒有pined down 就是free的 后面用來作替換算法時使用的
讀寫都遵循LRU算法 sqlite 用queue來 管理 free pages(unpind page)
page 如何從file到memory
在pager結(jié)構(gòu)中榕吼,有pager->fd->pMethods->xRead 方法饿序,通過調(diào)用,seekAndRead羹蚣,從磁盤讀取到內(nèi)存
開啟了debug模式原探,會直接從磁盤中讀取文件,而不會使用cache
從已知的頭中設(shè)置一些信息顽素?
在分配內(nèi)存方面大多使用memcpy為什么咽弦?以及區(qū)別
strcpy 和 memcpy 主要有以下 3 方面的區(qū)別。
1胁出、復制的內(nèi)容不同离唬。strcpy 只能復制字符串,而 memcpy 可以復制任意內(nèi)容划鸽,例如字符數(shù)組输莺、整型、結(jié)構(gòu)體裸诽、類等嫂用。
2、復制的方法不同丈冬。strcpy 不需要指定長度嘱函,它遇到被復制字符的串結(jié)束符 "\0" 才結(jié)束,所以容易溢出埂蕊。memcpy 則是根據(jù)其第 3 個參數(shù)決定復制的長度往弓。
3疏唾、用途不同。通常在復制字符串時用 strcpy函似,而需要復制其他類型數(shù)據(jù)時則一般用 memcpy
新版本3.16.2槐脏,替代ahash為xget函數(shù)指針來獲取page
每個PCache對應db的中的一個page
btree層,只操作撇寞,database pages 的復制層
btree通過page number從pager處 獲得 page的內(nèi)存可訪問地址
再修改之前顿天,btree 會通知 pager從而讓page 及時保存
當btree 修改完成后也會通知page 從而page及時保存 每個pager對象,只關(guān)聯(lián)一個文件
pager 只有一個蔑担,當有多個線程鏈接的時候牌废,會創(chuàng)建多個pager cahce提供使用
PgHdr 每個再cache中的page又這個結(jié)構(gòu)管理
btree getpage,通常情況通過getPageNormal
方法啤握,從cache中獲取page
從磁盤讀入指定內(nèi)存方法
開啟debug編譯選項
sqltie提供統(tǒng)一的接口
sqlite3OsRead(pPager->fd, pDest, N, 0);
讀入特定長度內(nèi)容底層調(diào)用unixread方法
使用memcpy調(diào)用