自己编译SQLite或将SQLite移植到新的操作系统(六)

 返回:SQLite—系列文章目录   

上一篇:SQLite中的动态内存分配(五)

下一篇:SQLite—系列文章目录   

1.0 引言

对于大多数应用程序,推荐的构建方法 SQLite是使用合并代码 文件 sqlite3.c 及其相应的头文件 sqlite3.h。sqlite3.c 代码文件应编译和 在任何 Unix、Windows 系统上运行,无需任何更改 或特殊的编译器选项。大多数应用程序可以简单地包括 sqlite3.c 文件以及其他 C 代码文件一起使 启动应用程序,将它们编译在一起,然后开始工作 和配置良好的 SQLite 版本。

大多数应用程序都可以很好地与 SQLite 一起使用 默认配置,没有特殊的编译时配置。 大多数开发人员应该能够完全忽略此文档 并且只需从合并中构建 SQLite而无需任何 特殊知识,无需采取任何特殊行动。

然而,高度调整和专业化 应用程序可能想要或需要替换一些 SQLite的内置系统接口与替代实现 更适合应用的需要。SQLite的设计 在编译时轻松重新配置以满足特定的 单个项目的需求。在编译时配置中 SQLite的选项如下:

  • 将内置互斥子系统替换为替代方案 实现。

  • 完全禁用所有互斥以用于单线程 应用。

  • 重新配置内存分配子系统以使用内存 分配器 其他 malloc() 实现从标准 图书馆。

  • 重新对齐内存分配子系统,使其永不调用 malloc() 满足所有内存请求 在启动时分配给 SQLite 的固定大小的内存缓冲区。

  • 将文件系统的接口替换为替代接口 设计。换言之,覆盖所有系统调用 SQLite使与磁盘通信具有完全不同的功能 系统调用集。

  • 覆盖其他操作系统接口,例如调用以获取 祖鲁语或当地时间。

一般来说,其中有三个独立的子系统 可以在编译时修改或覆盖的 SQLite。这 互斥子系统用于序列化对 SQLite 资源的访问,这些资源 在线程之间共享。使用内存分配子系统分配 SQLite对象和数据库所需的内存 缓存。最后,虚拟文件系统子系统是 用于在 SQLite 和底层之间提供可移植接口 操作系统,尤其是文件系统。我们称这三个 子系统 SQLite 的“接口”子系统。

我们强调,大多数应用程序都由 SQLite接口子系统的内置默认实现。 鼓励开发人员使用 尽可能默认的内置实现 并在没有任何特殊编译时选项或参数的情况下构建 SQLite。 但是,一些高度专业化的应用程序可能会从以下方面受益 替换或修改这些内置 SQLite 中的一个或多个 接口子系统。 或者,如果SQLite用于 Unix(Linux 或 Mac OS X)、Windows(Win32 或 WinCE)或 OS/2,然后没有 内置到SQLite中的接口子系统将起作用 应用程序需要提供替代实现 适用于目标平台。

2.0 配置或替换互斥子系统

在多线程环境中,SQLite 使用互斥锁进行序列化访问共享资源。 互斥子系统仅对访问的应用程序是必需的来自多个线程的 SQLite。对于单线程应用程序,或者仅从单个线程调用SQLite 的应用程序,互斥锁子系统可以通过以下命令重新编译来完全禁用 选择:

-DSQLITE_THREADSAFE=0

互斥锁很低占用资源,但不是还是会消耗一点资源的,所以当互斥锁被完全禁用时性能会更好。生成的库占用空间也会小一点。在编译时禁用互斥锁是针对有意义的应用程序的建议优化。

当使用 SQLite 作为共享库时,应用程序可以测试以查看 是否已使用 sqlite3_threadsafe() API 禁用互斥锁。链接到 SQLite 的应用程序 运行时并从多个线程使用 SQLite 可能应该检查这一点 API 来确保它们不会意外地链接到 禁用了互斥锁的 SQLite 库。单线程 当然,无论应用程序是否正常工作,应用程序都将正常工作。 不是 SQLite 被配置为线程安全,尽管它们会有点 使用禁用互斥锁的 SQLite 版本时速度更快。

也可以在运行时使用 sqlite3_config() 接口禁用 SQLite 互斥锁。要完全禁用所有互斥, 应用程序可以调用:

sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);

在运行时禁用互斥锁不如禁用互斥锁有效 在编译时,因为 SQLite 仍然必须对布尔变量进行测试 查看互斥锁在互斥锁的每个点是启用还是禁用互斥锁 可能是必需的。但是仍然有性能优势 在运行时禁用互斥锁。

对于多线程应用程序,它们会注意如何 管理线程,SQLite支持替代运行时配置 这是在不使用任何互斥锁和默认情况之间的中间位置 互斥视线中的一切。这种中间互斥锁对齐可以 按以下方式建立:

sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0);

这里有两个单独的配置更改,可以一起使用,也可以单独使用。SQLITE_CONFIG_MULTITHREAD设置禁用 序列化对数据库连接对象和预准备语句对象的访问。使用此设置时,应用程序 可以从多个线程免费使用 SQLite,但必须确保 没有两个线程尝试同时访问相同的数据库连接或与同一数据库连接关联的任何预准备语句。两个线程可以使用 SQLite 同时,但它们必须使用单独的数据库连接。 第二个SQLITE_CONFIG_MEMSTATUS设置禁用该机制 在SQLite中跟踪所有未完成内存的总大小 分配请求。这样就不需要对每个调用进行互斥处理 到 sqlite3_malloc() 和 sqlite3_free(),这节省了巨大的 互斥操作数。但是禁用 内存统计机制是 sqlite3_memory_used()、sqlite3_memory_highwater() 和 sqlite3_soft_heap_limit64() 接口停止工作。

SQLite 使用 pthreads 作为其在 Unix 上的互斥锁实现,并且 SQLite 需要递归互斥锁。最现代的 pthread 实现 支持递归互斥锁,但并非所有互斥锁都支持。对于不这样做的系统 支持递归互斥锁,建议应用运行 仅在单线程模式下。如果这是不可能的,SQLite提供 另一种递归互斥体实现,建立在 pthread 的标准“快速”互斥锁。此替代方案 只要 pthread_equal() 是 原子和处理器具有连贯的数据缓存。替代方案 递归互斥锁实现由以下方式启用 编译器命令行开关:

-DSQLITE_HOMEGROWN_RECURSIVE_MUTEX=1

将SQLite移植到新的操作系统时,通常是必要的 将内置互斥子系统完全替换为替代方案围绕新操作系统的互斥原语构建。这通过使用以下选项编译 SQLite 来完成:

-DSQLITE_MUTEX_APPDEF=1

当使用 SQLITE_MUTEX_APPDEF=1 选项编译 SQLite 时,它完全省略了其互斥基元函数的实现。但是SQLite 库仍会在必要时尝试调用这些函数,因此应用程序本身必须实现互斥基元函数并将它们链接在一起使用 SQLite。

3.0 配置或替换内存分配子系统

默认情况下,SQLite 获取对象所需的内存和从标准库的 malloc()/free()实现中缓存。 实验性内存分配器的工作也在进行中满足来自单个固定内存缓冲区的所有内存请求在应用程序启动时添加到 SQLite。有关这些的其他信息实验性内存分配器将在将来的修订版中提供的本文档。

SQLite支持应用程序指定替代方案的能力 内存分配器 在运行时sqlite3_mem_methods,通过使用指向 替代实现,然后注册新的替代 使用 sqlite3_config() 接口实现。 例如:

sqlite3_config(SQLITE_CONFIG_MALLOC, &my_malloc_implementation);

SQLite复制 sqlite3_mem_methods 象的内容 因此,可以在 sqlite3_config()调用返回后修改对象。

4.0 添加新的虚拟文件系统

自 3.5.0 版 (2007-09-04)起, SQLite支持称为虚拟文件系统或“VFS”的接口。 这个对象有点命名错误,因为它 实际上是整个底层操作系统的接口,而不是 只是文件系统。

有趣的功能之一 VFS 接口是SQLite可以在同时。每个数据库连接都必须为其选择一个VFS 使用 sqlite3_open_v2() 首次打开连接时使用。 但是,如果一个进程包含多个数据库连接,则每个数据库连接都可以选择不同的VFS。可以在运行时使用 sqlite3_vfs_register() 接口添加 VFS。

Unix、Windows 和 OS/2 上 SQLite 的默认版本包括 适用于目标平台的 VFS。为其他构建的 SQLite 默认情况下,操作系统不包含 VFS,但应用程序 可以在运行时注册一个或多个。

5.0 将SQLite移植到新的操作系统

为了将SQLite移植到新的操作系统 - 操作 默认情况下不支持系统 - 应用程序 必须提供...

  • 一个有效的互斥子系统(但前提是它是多线程的),
  • 工作内存分配子系统(假设它缺少 malloc() 在其标准库中),以及
  • 一个有效的 VFS 实现。

所有这些东西都可以在一个辅助C代码文件中提供然后链接到库存的“sqlite3.c”代码文件以生成一个有效的目标操作系统的 SQLite 构建。除了 替代互斥锁和内存分配子系统以及新的 VFS, 辅助 C 代码文件应包含 以下两个例程:

  • sqlite3_os_init()
  • sqlite3_os_end()

“sqlite3.c”代码文件包含 VFS 的默认实现 以及 sqlite3_initialize() 和 sqlite3_shutdown()函数适用于 Unix、Windows和OS/2。 防止在sqlite3.c 时加载这些默认组件之一 编译后,需要添加以下编译时 选择:

-DSQLITE_OS_OTHER=1

SQLite 核心将提前调用 sqlite3_initialize()。辅助 C 代码文件可以包含 sqlite3_initialize()的实现注册适当的 VFS,并且可能还初始化替代方案 互斥系统(如果需要互斥锁)或进行任何内存分配所需的子系统初始化。 SQLite 核心从不调用 sqlite3_shutdown(),但它是 官方 SQLite API,编译时未另行提供 -DSQLITE_OS_OTHER=1,所以辅助 C 代码文件可能应该提供 它是为了完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/776079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刚刚,百度和苹果宣布联名

百度 Apple 就在刚刚,财联社报道,百度将为苹果今年发布的 iPhone16、Mac 系统和 iOS18 提供 AI 功能。 苹果曾与阿里以及另外一家国产大模型公司进行过洽谈,最后确定由百度提供这项服务,苹果预计采取 API 接口的方式计费。 苹果将…

Jenkins用户角色权限管理

Jenkins作为一款强大的自动化构建与持续集成工具,用户角色权限管理是其功能体系中不可或缺的一环。有效的权限管理能确保项目的安全稳定,避免敏感信息泄露。 1、安装插件:Role-based Authorization Strategy 系统管理 > 插件管理 > 可…

Docker 哲学 - Dockerfile 指令

Dockerfile 的 entrypoint 和 cmd 书写方式一样吗,分别用一个node项目的 demo来举例 Dockerfile 的 entrypoint 、cmd 有什么区别,分别举例他们同时出现的场景和 单独出现的场景 entrypoint 和 cmd 命令: 同时出现: 1、cmd 作为 e…

【教程】iOS如何抓取HTTP和HTTPS数据包经验分享

📱 在日常的App开发和研发调研中,对各类App进行深入的研究分析时,我们需要借助专业的抓包应用来协助工作。本文将介绍如何使用iOS手机抓包工具来获取HTTP和HTTPS数据包,并推荐一款实用的抓包应用——克魔助手,希望能够…

快速上手Pytrch爬虫之爬取某应图片壁纸

一、前置知识 1 爬虫简介 网络爬虫(又被称作网络蜘蛛、网络机器人,在某些社区中也经常被称为网页追逐者)可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息。 1.1 Web网页存在方式 表层网页指的是不需要提交表单&…

《数据结构学习笔记---第三篇》---单链表具体实现

目录 1.链表 1.1 链表的概念及结构 2.不带头单链表的实现 2.1创建头文件“SList.h” 2.2 创建具体接口实现文件SList.c 2.2.1打印 2.2.2申请链表结点 2.2.3创建一个长度为n的链表 2.2.4尾插尾删 2.2.5头插头删 2.2.6寻找x元素,返回pos 2.2.7插入和删除pos…

量子专家联合开展欧洲之星项目“SupremeQ”以实现光量子计算优势

内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨浪味仙 沛贤 深度好文:1800字丨10分钟阅读 近日,英国全栈光量子计算系统公司 ORCA Computers、德国单光子探测器提供商 Pixel Photonics、丹麦量…

餐饮服务升级:微信小程序扫码点餐制作

餐饮体验的升级不仅体现在食物的质量和环境的营造上,更在于服务的便捷性和智能化。扫码点餐小程序正是这一理念的体现,它通过简化点餐流程,为顾客和商家带来了双赢的局面。那么商家微信小程序扫码点餐制作的流程是怎么样呢?怎么快…

二叉树的遍历及线索二叉树试题解析

一、单项选择题 01.在下列关于二叉树遍历的说法中,正确的是( C ). A.若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点,则它一定是该子树的前序遍历结果序列的最后一个结点 B.若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一…

安卓国内ip代理app,畅游网络

随着移动互联网的普及和快速发展,安卓手机已经成为我们日常生活和工作中不可或缺的一部分。然而,由于地理位置、网络限制或其他因素,我们有时需要改变或隐藏自己的IP地址。这时,安卓国内IP代理App便成为了一个重要的工具。虎观代理…

Chrome之解决:浏览器插件不能使用问题(十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

c语言知识点整理------基础c语言框架,数据类型,变量常量,注释

前言 本文不涉及讲解原理,用简洁明了的风格,去整理方便查阅的知识点。 (适合有编程基础,或者需要作为笔记的人群使用) 程序基本框架 结果会输出hello world。 程序的执行 c语言属于编译型语言。 代码执行分为五个…

文件上传漏洞-服务端检测

服务端检测 服务端检测就是网站对用户上传的文件的检测代码放置在服务器里,当用户上传的文件通过了检测才会被允许保存在服务器里。 MIME类型检测 MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。用来表示文档、文件或字节流的…

第115讲:Mycat核心配置文件各项参数的作用以及概念

文章目录 1.Mycat配置文件相关概念2.Schema配置文件3.Rule配置文件4.Server配置文件 1.Mycat配置文件相关概念 在Mycat中核心的配置文件有schema.xml和rule.xml以及server.xml三个,其中schema.xml是用来配置数据库、表、读写分离、分片节点、分片规则等信息&#x…

精准营销的秘密:独立站如何通过大数据与AI技术实现个性化定制

在当今电商市场竞争激烈的背景下,电商行业逐渐步入个性化、精细化的运营时代。独立站作为电商领域的重要组成部分,其推广策略也在不断地进行创新与升级。个性化定制策略以其精准、高效的特点,正逐渐成为独立站推广的新宠。本文Nox聚星将和大家…

PostgreSQL关系型数据库介绍与部署

使用背景 在过去的几年中,PostgreSQL的使用量逐渐增加,而Oracle和MySQL的使用量则有所下降。这主要是由于以下几个原因:开源和免费、功能丰富、可扩展性强、安全性高、跨平台支持好、社区活跃、成熟稳定。这些因素使得PostgreSQL成为了许多开…

针对COT控制模式下低ESR电容造成次谐波振荡问题的片内斜波补偿方案

COT模式:MOS管固定导通时间控制模式,关断时间由输出反馈电压与内部基准源的相较值决定。 RBCOT控制模式:Ripple-Based COT基于纹波的固定导通时间控制方法,特别的是环路控制部分主要有固定导通时间发生装置及比较器组成。RBCOT控…

Java:反射 reflection ( 概念+相关类+使用方法)

文章目录 一、反射(reflection)1.概念优点:缺点 2.反射的相关类1.Class类1.**反射机制的起源**2.获得类相关的方法3.获得类中属性的相关方法4.获得类中注解相关的方法5.获得类中构造器相关的方法6.获得类中方法相关的方法 2.获取Class对象的三种方法:1.使…

剑指Offer题目笔记19(二分查找)

面试题68: 问题: ​ 输入一个排序的整形数组nums和一个目标值t,如果数组nums中包含t,则返回在数组中的下标,否则返回按照顺序插入到数组的下标。 解决方案: ​ 使用二分查找。每次二分查找都选取位于数组…

Days 35 ElfBoard板对Java的支持

Java作为一种功能强大且广泛应用的编程语言,具有广泛的适应性和实用性。在ELF 1开发板上集成Java支持,无疑将赋予嵌入式开发者更广阔的选择空间,今天就为各位小伙伴详细解析如何在ELF 1开发板上成功部署和运行Java环境。 1.拷贝两个压缩包到E…