sqlite的体系结构介绍:
sqlite是由接口(Interface)、编译器(Compiler)、虚拟机(Virtual Machine )和后端程序(Back End)组成。
还有另两种对体系结构的图示比较简单:
接口(Interface) :
由sqlite c API组成,程序、脚本、库文件等等都是通过它与数据库进行交互的,转化为对API的调用(ODBC和JDBC也一样)。数据库的使用者,通过API与数据库通信。
编译器(Compiler):
包含分词器(Tokenizer)、分析器(Parser)、代码生成器(Code Generator)。其中,Tokenizer 和Parser 负责检查sql语言的语法,转化为分层处理的数据结构语法树,送给Code Genetator 处理成汇编代码,送给VM(虚拟机)执行。
虚拟机(Virtual Machine):
也叫做虚拟数据库引擎(Virtual Database Enegine),是内核中最重要的一部分。基于寄存器,128个操作指令(opcodes),与系统的OS、cpu、系统体系相互独立,专门处理数据。它的指令集中所有的指令或者用来完成具体的数据库操作(比如打开一个表的游标、做记录、提取一列或者开始一个事务等),或者以某种方式控制栈为完成这些操作做准备。sqlite中的所有sql语句----从选择和更新记录到创建表、视图以及索引----都是首先编译成虚拟机语言,形成一个独立的定义了如何完成给定的命令的指令集。VDBE是sqlite的核心,它之前的所有模块都是用于创建VDBE程序的,它之后的所有模块都是用于执行VDBE程序的,每次执行一条指令。
后端(Back End):
包含B-tree、页缓存(page cache,pager)、操作系统接口(系统调用)。B-tree和page cache共同对数据进行管理。B-tree的主要功能就是索引,它维护着各个页面之间的复杂的关系,便于快速找到所需数据。而pager的主要作用就是通过OS接口在B-tree和Disk之间传递页面。B-tree的职责就是排序。它维护着多个页之间错综复杂的关系,这些关系能保证快速定位并找到一切有联系的数据。B-tree将页面组织成树状结构(这也是它叫做B-tree的原因),这种组织结构很适合搜索,页面就是树的叶子。
详细点说就是:pager(sqlite的一种数据结构)帮助B-tree管理页面,它负责传输。pager根据B-tree的请求从磁盘读取页面或者向磁盘写入页面。磁盘操作是目前计算机必须做的工作中最慢的事情之一。因此pager试图通过将频繁使用的页面缓存在内存中来加速这一操作,从而最小化与硬盘直接交互所花费的时间。pager的功能描述页包含事务管理、数据库锁以及崩溃恢复,其中许多功能是通过OS接口(OS Interface)实现的。像文件锁一样的很多事情在不同的操作系统上实现是不同的。OS接口(OS Interface)为sqlite其他模块提供了屏蔽这些差异的抽象层。最终的结果就是其他模块看到的是一个一致的对外的系统接口。所以,pager不用担心在Windows上以一种方式锁文件,而在其他不同操作系统上(例如UNIX)上使用另一种方式。这就使得sqlite很容易移植到不同的操作系统上。
注意最后一个图可以这样解释:
前端预处理应用程序传递过来的sql语句和sqlite命令。对获取的编码分析,优化,并转换为后端能够执行的sqlite内部字节编码。后端是用来解释字节编码程序的引擎。该引擎做的才是真正的数据库处理工作。
工具和测试代码:
工具模块中包含各种各样的实用功能,还有一些如内存分配、字符串比较、Unicode转换之类的公共服务也在工具模块中。这个模块就是一个包罗万象的工具箱,很多其它模块都需要调用和共享它。测试模块中包含了无数的回归测试语句,用来检查数据库代码的每个细微角落。这个模块是sqlite性能如此可靠的原因之一。
原文链接:https://www.f2er.com/sqlite/201841.html