sqlite pager 从 磁盘 读取内存

笔记

btree模块,通过pager模块来读和写二进制文件,通过pager模块,把sqlite文件看成一个由page组成的数组。所有的操作,都是先从磁盘读取到内存,操做完了以后再写回。
这里假设 数据库足够大,比内存还要大

再内存中用来存放部分数据库数据的叫做cache 或者 data buffer 在sqlite中称作为page cahce
pager的责任是使得上层透明,并且提供一个在 mian memory中可以通过地址访问的功能

pager的功能

也提供一些事务处理的特性:事务管理,数据管理,日志管理,锁管理

  1. 数据管理:协调,cache和文件数据读写,文件空间管理
  2. 日志管理:journal file when wrting
  3. 锁管理:使得事务成为可能

pager实现数据持久化,和事务自动化

每个pagecache 表示一个一个程序的内存空间,多个连接,有多个pagecache。

sqlite 没有使用系统的缓存机制自己每次需要cache的时候直接从native file 获取

旧版本是这样,我阅读的新的版本,在开启debug模式的时候,才会直接从硬盘读取

pager manage至关重要
pager 结构中的ahash数组,是用来存放hashtable用来访问在 page cache中的page(新版本,中page结构没有ahash这个数组,而是存放一个函数的指针,通过传入xGet函数指针,传入参数访问,真正获取的函数为getPageNormal)

每个hash,指向一个桶,每个桶,中有多个page,组成一个linkedlist 内部是无序的

pgHdr只能pager看到 btree不能看到
dirty表示,还没有写回到native文件中

nref来运行LRU

nref表明是否pined down 如果没有pined down 就是free的 后面用来作替换算法时使用的
读写都遵循LRU算法 sqlite 用queue来 管理 free pages(unpind page)

page 如何从file到memory

在pager结构中,有pager->fd->pMethods->xRead 方法,通过调用,seekAndRead,从磁盘读取到内存

开启了debug模式,会直接从磁盘中读取文件,而不会使用cache
从已知的头中设置一些信息?

在分配内存方面大多使用memcpy为什么?以及区别

strcpy 和 memcpy 主要有以下 3 方面的区别。
1、复制的内容不同。strcpy 只能复制字符串,而 memcpy 可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy 不需要指定长度,它遇到被复制字符的串结束符 "\0" 才结束,所以容易溢出。memcpy 则是根据其第 3 个参数决定复制的长度。
3、用途不同。通常在复制字符串时用 strcpy,而需要复制其他类型数据时则一般用 memcpy

新版本3.16.2,替代ahash为xget函数指针来获取page

每个PCache对应db的中的一个page

btree层,只操作,database pages 的复制层
btree通过page number从pager处 获得 page的内存可访问地址

再修改之前,btree 会通知 pager从而让page 及时保存
当btree 修改完成后也会通知page 从而page及时保存 每个pager对象,只关联一个文件
pager 只有一个,当有多个线程链接的时候,会创建多个pager cahce提供使用

PgHdr 每个再cache中的page又这个结构管理
btree getpage,通常情况通过getPageNormal方法,从cache中获取page

从磁盘读入指定内存方法

开启debug编译选项

debug编译选项
debug编译选项

sqltie提供统一的接口sqlite3OsRead(pPager->fd, pDest, N, 0);读入特定长度内容
底层调用unixread方法
实际的底层方法
实际的底层方法

使用memcpy调用
memecpy函数
memecpy函数

再内存结构中的pageMemPage

内存中的page
内存中的page
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,134评论 30 470
  • 史上最全的iOS面试题及答案 迷途的羔羊--专为路痴量身打造的品牌。史上最精准的定位。想迷路都难!闪电更新中......
    南虞阅读 1,500评论 0 8
  • 1.写一个NSString类的实现 +(id)initWithCString:(c*****t char *)nu...
    韩七夏阅读 3,754评论 2 37
  • 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家。(题...
    Job_Yang阅读 12,103评论 12 143
  • 首先,要感谢 DEV Club 能给我一个这么好的平台,在那里学到大牛们分享的技术.这次感谢的是张三华,张哥的这么...
    A_sura阅读 1,041评论 5 11