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

news/2024/4/29 20:22:14/文章来源:https://blog.csdn.net/lyfwwb/article/details/137104223

 返回: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.luyixian.cn/news_show_1027460.aspx

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

相关文章

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介:文件存储路径: 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中,我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中,使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库,旨在通过…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深,制药行业作为国民经济的重要支柱之一,也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来,制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

scala-idea环境搭建及使用

环境搭建 创建一个新项目,选择maven工程 点击next,写入项目名,然后finish 注意:默认下,maven不支持scala的开发,需要引入scala框架,右键项目点击-》add framework pport....,在下图…

基于java+SpringBoot+Vue的书籍学习平台设计与实现

基于javaSpringBootVue的书籍学习平台设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含: 书籍学习平台是一个基于Internet的在线学习资源平台&#xf…

Apache Hive的基本使用语法(二)

Hive SQL操作 7、修改表 表重命名 alter table score4 rename to score5;修改表属性值 # 修改内外表属性 ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL""TRUE"); # 修改表注释 ALTER TABLE table_name SET TBLPROPERTIES (comment new_commen…

音视频开发Day01

备注 ffmpeg 库相关函数记忆 FFmpeg 库简介 FFmpeg一共包含8个库: avcodec:编解码(最重要的库) avformat:封装格式处理。 avfilter:滤镜特效处理 avdevice:各种设备的输入输出。 avutil:工具库(大部分库都需要这个库的支持)。 postproc:后加工。 swresample:音频采样数据格式…

一分钟开服 《幻兽帕鲁》游戏专属服务器by京东云主机

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程,非常简单,京东云推出幻兽帕鲁镜像系统,镜像直接选择幻兽帕鲁镜像即可一键自动部署,不需要手动操作,真正的新手0基础部署幻兽帕鲁,阿腾云atengyun.…

OSCP靶场--pyLoader

OSCP靶场–pyLoader 考点(信息收集CVE-2023-0297) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.26 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-28 09:14 EDT Nmap scan report for 192.168.178.26 Host is up…

基于Python的电商特产数据可视化分析与推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 利用网络爬虫技术从某东采集某城市的特产价格、销量、评论等数据,经过数据清洗后存入数据库,并实现特产销售、市场占有率、价格区间等多维度的可视化统计分析,并…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具,基于此,做一篇学习笔记进行记录。 二、安装 ID…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus :主要是负责存储、抓取、聚合、查询方面。 node_exporter :主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求:1台主服务器 n台从服务器 (被监控的linux虚机&am…

WPF自定义Panel:让拖拽变得更简单

在 WPF 应用程序中,拖放操作是实现用户交互的重要组成部分。通过拖放操作,用户可以轻松地将数据从一个位置移动到另一个位置,或者将控件从一个容器移动到另一个容器。然而,WPF 中默认的拖放操作可能并不是那么好用。为了解决这个问…

uniApp使用XR-Frame创建3D场景(7)加入点击交互

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用 这篇我们讲解如何与场景中的模型交互&#xff08;点击识别&#xff09; 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-mesh id"…

【已修复】iPhone13 Pro 长焦相机水印(黑斑)修复 洗水印

iPhone13 Pro 长焦相机水印&#xff08;黑斑&#xff09;修复 洗水印 问题描述 iPhone13 Pro 后摄3倍相机有黑色斑点&#xff08;水印&#xff09;&#xff0c;如图所示&#xff0c; 后摄相机布局如图所示&#xff0c; 修复过程 拆机过程有风险&#xff0c;没有把握最好不要…

MySQL学习笔记------函数

目录 函数 字符串函数 数值函数 函数 指一段可以直接被另一段程序调用的程序或代码 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用如下&#xff1a;select 函数 concat(s1,s2,s3,...,sn) 字符串拼接&#xff0c;将s1,s2,...,sn拼接成一个字符串 #字符串拼…

C/C++语言学习路线: 嵌入式开发、底层软件、操作系统方向(持续更新)

初级&#xff1a;用好手上的锤子 1 【感性】认识 C 系编程语言开发调试过程 1.1 视频教程点到为止 1.2 炫技视频看看就行 1.3 编程游戏不玩也罢 有些游戏的主题任务就是编程&#xff0c;游戏和实际应用环境有一定差异&#xff08;工具、操作流程&#xff09;&#xff0c;在…