当前位置: 首页 > wzjs >正文

一般建设一个网站多少钱优化推广

一般建设一个网站多少钱,优化推广,网站怎么做快照,北京注册公司代理机构一、 定义及作用 PostgreSQL 的磁盘管理器(Storage Manager,简称 SMGR)是数据库系统中负责管理底层存储的核心模块。磁盘管理器并非直接操作磁盘上的文件,而是通过VFD(虚拟文件描述符,将在后续学习&#xf…

一、 定义及作用

       PostgreSQL 的磁盘管理器(Storage Manager,简称 SMGR)是数据库系统中负责管理底层存储的核心模块。磁盘管理器并非直接操作磁盘上的文件,而是通过VFD(虚拟文件描述符,将在后续学习)实现。

  1. 抽象存储层,解耦存储逻辑
    SMGR 提供了一层抽象接口,屏蔽了不同存储类型(如表、索引、TOAST 表等)的底层细节,使上层模块(如执行器、缓冲池)无需关心具体的存储实现。

  2. 管理文件操作
    SMGR 负责文件的创建、删除、扩展、截断等操作,确保数据文件能够高效地存储和访问。

  3. 支持多种存储类型
    PostgreSQL 支持多种存储类型(如堆表、索引、TOAST 表等),SMGR 通过统一的接口管理这些存储类型。

  4. 与缓冲池交互
    SMGR 与缓冲池(Buffer Manager)紧密协作,确保数据页能够正确地加载到内存中。

  5. 提高可扩展性
    通过 SMGR 的抽象接口,PostgreSQL 可以更容易地支持新的存储类型或存储引擎(如列存储、外部表等)。

二、 核心数据结构

src/include/storage/smgr.h  SMGR 的头文件,定义了存储管理器的接口和数据结构。

SMgrRelation:SMGR的核心数据结构,主要作用是:

  • 管理文件句柄:缓存关系的文件句柄,避免频繁打开和关闭文件。
  • 支持多分支(Fork):PostgreSQL 中的表或索引可能包含多个分支(如主数据分支、TOAST 分支等),SMgrRelationData 支持管理这些分支的文件。
  • 缓存文件大小:记录每个分支的最后一个已知大小,用于优化文件扩展操作。
  • 支持临时关系:通过 smgr_owner 指针区分临时关系和持久关系,临时关系在事务结束时自动释放
/** smgr.c 维护了一个 SMgrRelation 对象表,这些对象本质上是缓存的文件句柄。* SMgrRelation 通过 smgropen() 创建(如果尚未存在),并通过 smgrclose() 销毁。* 注意,这些操作并不涉及 I/O,它们只是创建或销毁哈希表条目。* (但 smgrclose() 可能会释放相关资源,例如操作系统级别的文件描述符。)** 一个 SMgrRelation 可能有一个“所有者”,这只是从其他地方指向它的指针;* 如果 SMgrRelation 被关闭,smgr.c 会清除此指针。* 我们使用此机制来避免从 relcache 到 smgr 的悬空指针,而无需让 smgr 显式感知 relcache。* 每个 SMgrRelation 只能有一个“所有者”指针,但这已经足够。** 没有“所有者”的 SMgrRelation 被认为是临时的,并在事务结束时被删除。*/typedef struct SMgrRelationData
{/* rnode 是哈希表查找键,因此必须放在第一位! */RelFileNodeBackend smgr_rnode;  /* 表的物理标识符 *//* 指向所有者指针的指针,如果没有则为 NULL */struct SMgrRelationData **smgr_owner;/** 以下字段在缓存刷新事件时重置为 InvalidBlockNumber,* 并记录每个分支的最后一个已知大小。* 此信息目前仅在恢复期间可靠,因为分支扩展没有缓存失效机制。*/BlockNumber smgr_targblock; /* 当前插入目标块 */BlockNumber smgr_cached_nblocks[MAX_FORKNUM + 1]; /* 每个分支的最后一个已知大小 *//* 未来可能会在此处添加其他公共字段 *//** 以下字段是 smgr.c 及其子模块私有的。* 不要从其他地方修改它们。*/int         smgr_which;  /* 存储管理器选择器 *//** 用于 md.c;每个分支的打开段数量(md_num_open_segs)* 和段本身(md_seg_fds)。*/int         md_num_open_segs[MAX_FORKNUM + 1];struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1];/* 如果没有所有者,则链接到所有无所有者 SMgrRelations 的链表中 */dlist_node  node;
} SMgrRelationData;typedef SMgrRelationData *SMgrRelation;

三、 核心函数

1. smgrinit(void)

  • 作用:初始化存储管理器模块。

  • 说明:在 PostgreSQL 启动时调用,用于初始化 SMGR 的全局状态(如哈希表、锁等)。


2. smgropen(RelFileNode rnode, BackendId backend)

  • 作用:打开一个关系的存储管理器(SMgrRelation)。

  • 参数

    • rnode:关系的物理标识符(RelFileNode)。

    • backend:后端 ID,用于区分不同后端进程。

  • 返回值:返回一个 SMgrRelation 对象,表示关系的存储管理器。


3. smgrexists(SMgrRelation reln, ForkNumber forknum)

  • 作用:检查指定分叉(Fork)的文件是否存在。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号(如主数据分叉、TOAST 分叉等)。

  • 返回值:如果文件存在,返回 true;否则返回 false


4. smgrsetowner(SMgrRelation *owner, SMgrRelation reln)

  • 作用:设置关系的所有者。

  • 参数

    • owner:指向所有者指针的指针。

    • reln:关系的存储管理器。

  • 说明:用于将 reln 的所有者设置为 owner,避免悬空指针问题。


5. smgrclearowner(SMgrRelation *owner, SMgrRelation reln)

  • 作用:清除关系的所有者。

  • 参数

    • owner:指向所有者指针的指针。

    • reln:关系的存储管理器。

  • 说明:用于清除 reln 的所有者,通常在关系关闭时调用。


6. smgrclose(SMgrRelation reln)

  • 作用:关闭一个关系的存储管理器。

  • 参数

    • reln:关系的存储管理器。

  • 说明:释放与 reln 相关的资源(如文件描述符),并将其从哈希表中移除。


7. smgrcloseall(void)

  • 作用:关闭所有关系的存储管理器。

  • 说明:在事务结束时调用,用于清理所有临时关系的存储管理器。


8. smgrclosenode(RelFileNodeBackend rnode)

  • 作用:关闭指定关系的存储管理器。

  • 参数

    • rnode:关系的物理标识符。

  • 说明:根据 rnode 查找并关闭对应的存储管理器。


9. smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)

  • 作用:创建一个新的分叉文件。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • isRedo:是否在恢复期间调用。

  • 说明:用于创建表或索引的分叉文件(如主数据文件、TOAST 文件等)。


10. smgrdosyncall(SMgrRelation *rels, int nrels)

  • 作用:同步所有指定关系的文件到磁盘。

  • 参数

    • rels:存储管理器数组。

    • nrels:数组长度。

  • 说明:确保所有修改过的文件数据被写入磁盘。


11. smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo)

  • 作用:删除所有指定关系的文件。

  • 参数

    • rels:存储管理器数组。

    • nrels:数组长度。

    • isRedo:是否在恢复期间调用。

  • 说明:用于删除表或索引的分叉文件。


12. smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, char *buffer, bool skipFsync)

  • 作用:扩展指定分叉的文件,并写入数据。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • blocknum:要写入的块号。

    • buffer:要写入的数据。

    • skipFsync:是否跳过同步到磁盘。

  • 说明:用于扩展文件并写入数据块。


13. smgrprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum)

  • 作用:预取指定分叉的数据块。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • blocknum:要预取的块号。

  • 返回值:如果预取成功,返回 true;否则返回 false


14. smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, char *buffer)

  • 作用:从指定分叉的文件中读取数据块。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • blocknum:要读取的块号。

    • buffer:存储读取数据的缓冲区。

  • 说明:用于从文件中读取数据块到内存。


15. smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, char *buffer, bool skipFsync)

  • 作用:将数据块写入指定分叉的文件。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • blocknum:要写入的块号。

    • buffer:要写入的数据。

    • skipFsync:是否跳过同步到磁盘。

  • 说明:用于将数据块写入文件。


16. smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks)

  • 作用:将指定范围内的数据块写回磁盘。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

    • blocknum:起始块号。

    • nblocks:要写回的块数。

  • 说明:用于批量写回数据块,优化 I/O 性能。


17. smgrnblocks(SMgrRelation reln, ForkNumber forknum)

  • 作用:获取指定分叉的文件大小(块数)。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

  • 返回值:文件的大小(块数)。


18. smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum)

  • 作用:获取指定分叉的文件大小(块数),使用缓存值。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

  • 返回值:文件的大小(块数)。

  • 说明:与 smgrnblocks 类似,但使用缓存值以提高性能。


19. smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks)

  • 作用:截断指定分叉的文件到指定大小。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号数组。

    • nforks:分叉数量。

    • nblocks:每个分叉的目标大小(块数)。

  • 说明:用于截断文件,释放多余的空间。


20. smgrimmedsync(SMgrRelation reln, ForkNumber forknum)

  • 作用:立即同步指定分叉的文件到磁盘。

  • 参数

    • reln:关系的存储管理器。

    • forknum:分叉编号。

  • 说明:确保文件的修改被立即写入磁盘。


21. AtEOXact_SMgr(void)

  • 作用:在事务结束时清理存储管理器。

  • 说明:用于释放临时关系的存储管理器,清理缓存等。

参考:《PostgreSQL 数据库内核分析》

http://www.dtcms.com/wzjs/57544.html

相关文章:

  • 营销型商务网站应用商店下载
  • 做外贸没有网站需要注意什么问题厦门最快seo
  • 公司邮箱怎么注册流程黑帽seo优化软件
  • 家具网站建设规划书国内最好的搜索引擎
  • 怎么推广自己做的网站吗2020国内搜索引擎排行榜
  • 重庆网站查询广告软文营销平台
  • 健身网站怎么做爱站网关键词密度
  • 湖南做网站成人技术培训学校
  • 简要说明网站建设的步骤权重查询入口
  • 颍泉网站建设百度推广基木鱼
  • 四川公司网站建设招标怎么做一个网站平台
  • 旅游网站建设首选赢旅动力seo裤子的关键词首页排名有哪些
  • 怎么用centos做网站国际军事新闻今日头条
  • 山东川畅科技做网站多少钱线上平台怎么推广
  • 云南新冠疫情最新动态长沙网站seo收费标准
  • 网站建设需要的条件软文写作的技巧
  • 国外炫网站我想做个网站怎么做
  • html网站模板免费下载广州seo公司
  • asp动态网站建设百度关键词优化企业
  • 百度做网站教程sem竞价推广托管代运营公司
  • 如何做建筑一体化的网站建站合肥网络公司seo
  • wordpress dome.php宁波网站排名优化seo
  • 基于p2p的网站建设产品seo怎么优化
  • 网站建设服务费下什么科目超八成搜索网站存在信息泄露问题
  • 做ppt的模板网站有哪些长春网站搭建
  • 厦门专业做网站的公司网站运营推广
  • 信用门户网站建设太原百度公司地址
  • 男女做的那个真实的视频网站网站搜索排优化怎么做
  • asp网站开发教程pdf识图找图
  • 中石油网页设计与网站建设建立一个网站的费用