美文网首页
sqlite pager 从 磁盘 读取内存

sqlite pager 从 磁盘 读取内存

作者: zhouyao | 来源:发表于2017-02-10 12:38 被阅读181次

笔记

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

相关文章

  • sqlite pager 从 磁盘 读取内存

    笔记 btree模块,通过pager模块来读和写二进制文件,通过pager模块,把sqlite文件看成一个由pag...

  • Linux 性能监控分析

    一、 Linux性能分析—内存 1. 内存工作机制 当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,...

  • MapReduce 过程

    Map 从磁盘上读取数据 执行map函数 Partition分区(放进内存) Sort排序(内存排序) Combi...

  • 程序是怎样跑起来的(二)

    程序是如何跑起来的 内存和磁盘的亲密关系 磁盘缓存是指:从磁盘中读出的数据在内存中,当该数据再次被读取时,不是从磁...

  • 缓存技术

    内存缓存 磁盘缓存 基本一致。此外,直接从官网下载最新的SQLite源码编译,比iOS系统自带的sqlite3.d...

  • 【Spark】Spark 存储原理--读数据过程

    本篇结构: 读取数据块过程 内存读取 磁盘读取 远程读取 一、读取数据块过程 BlockManager 的 get...

  • R语言-02读取数据

    从剪贴板中读取数据 大数据读取 从大文件中读取数据,scan的妙用 避免数据过大程序运行内存不够的问题,用磁盘代替...

  • daily -- mysql 性能分析、优化基础

    MySQL常见瓶颈 CPUCPU满负载,一般发生在数据装入内存活从磁盘读取数据时 磁盘IO磁盘I/O瓶颈一般发生在...

  • SQLite自动增量

    SQLite自动增量 1. 摘要 AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开...

  • 文件操作

    读取和写入:文件有内容读取就是将文件中的内容读取到内存中。写入就是将内存中的内容写入到磁盘文件中。内存就相当于你的...

网友评论

      本文标题:sqlite pager 从 磁盘 读取内存

      本文链接:https://www.haomeiwen.com/subject/hlygittx.html