`

pg启动过程中的那些事五:初始化世界上现有行政区时区

阅读更多

 

话说初始化完全局时区后,初始化全部的时区。 从默认时区文件 %PostgreSQL Home%\share\timezone\Default 中读、解析世界上按行政区划现有的时区以及这些时区和UTC 的以秒记的时差到 临时 MemoryContext "TZParserMemory" 里的有序tzEntry ** 类型的timezone 数组base 里。然后把base 数组拷贝到 MemoryContext "TopMemoryContext" , 使datekn * 类型静态全局变量timezonetktbl 指向该数组 。最后删除 临时 MemoryContext "TZParserMemory"

1 先上个图,看一下函数调用过程梗概,中间略过部分细节

 

 

初始化 全部时区 的方法调用过程图

 

       这一节写图中红色方框圈起来的部分,上面的部分基本上在前面已经写过了,有小部分有略过。红色框中的部分就是初始化全部 timezone 的过程调用,主要是从以 PG_BINARY 格式存储的 默认时区文件 %PostgreSQL Home%\share\timezonesets\Default 中读并解析到 临时 MemoryContext "TZParserMemory" 里的tzEntry ** 类型的timezone 有序数组base 里。然后把base 数组拷贝到TopMemoryContext, 使datekn * 类型静态全局变量timezonetktbl 指向该数组 。最后删除 临时 MemoryContext "TZParserMemory"

2 初始化 ” Timezones” AllocSet/MemoryContext 的过程

GUC grand unified configuration )参数

pg 启动时 timezone_abbreviations_string 的值是“UNKNOWN ”。看到这个时pg 什么也不做。如果timezone_abbreviations_string 的值还没有被配置文件中的值重置, pg_timezone_abbrev_initialize () 会设置 timezone_abbreviations_string 为“Default ”。这么做有两个目的:一是避免重复从配置文件加载时区设置,二是为了在InitializeGUCOptions() 过程中再读时区配置文件。后者在一个EXEC_BACKEND 子进程中不工作,因为my_exec_path 还没有设置且因此pg 不能定位PGSHAREDIR 。(实际上同样的hack 被用在延迟初始化TimeZone 。如果我们have any more ,我们应该试着清除和centralize 这个机制)

话说 main()-> ->PostmasterMain()-> -> pg_timezone_abbrev_initialize () 以后用“ -> 表示调用 ,检查 静态全局变量 timezone_abbreviations_string ,如果是UNKONWN -> SetConfigOption() 从默认时区文件加载时区并设置该变量。

先创建 临时 MemoryContext "TZParserMemory" ,再调用 MemoryContextAlloc (直接调用AllocSetAlloc )在 "TZParserMemory" 里分配128 tzEntry 元素的数组空间 ,再 -> ParseTzFile 来有序加载并解析 %PostgreSQL Home%\share\timezonesets\Default 文件。把数组逐个元素以(abbrev 转成小写赋给datetkn ,根据is_dst (是否国家)typeoffset /60/15 赋给value )转换后赋给TopMemoryContext 里的 datekn 类型数组 使datekn * 类型静态全局变量timezonetktbl 指向该数组。 删除 临时 MemoryContext "TZParserMemory" ,这个到pg 内存管理机制时再讨论。最后 ->set_string_field GUC 参数timezone_abbreviations_string 从“UNKNOWN ”置成“Default ”。

 

下面是结构 datetkn 定义

typedef struct

{

    char         token[TOKMAXLEN];

    char         type;

    char         value;          /* this may be unsigned, alas */

} datetkn;

 

下图是创建了 临时 MemoryContext "TZParserMemory" ,把世界上各行政区时区缩写和相对于格林威治时间的偏移加载并解析到 tzEntry 数组,而且已经把tzEntry 数组经过换算放到了 MemoryContext "TopMemoryContext" 里的datekn 数组,还没有删除 临时 MemoryContext "TZParserMemory" 时的内存结构图。

 


 

  • 大小: 84.6 KB
  • 大小: 139.7 KB
0
0
分享到:
评论

相关推荐

    Linux 内存管理系统:初始化

    Linux内核在启动过程中会经历一系列复杂的初始化流程,以确保内存管理系统的正确配置。本文将详细介绍Linux内存管理系统初始化的处理流程及其背后的原理。 #### 二、内存管理系统的初始化流程 Linux内核内存管理...

    pg055axibridgepcie_055PG.com_055pg.com_www.055PG.COM_https//:055

    标题中的"pg055axibridgepcie_055PG.com_055pg.com_www.055PG.COM_https//:055"似乎是一个标识符,结合描述中的"AXI Memory Mapped to PCI Express (PCIe)",我们可以推测这可能是一份关于在系统设计中使用AXI...

    nacos-2.0.1 postgresql初始化脚本

    nacos-2.0.1 postgresql初始化脚本

    PostgreSQL中文手册9.2

    三、 pg_attrdef: pg_attrdef: pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef:pg_attrdef: . 63 四、 pg_authid: pg_authid: pg_authid: pg_authid:pg_authid: 64 五、 pg_auth_members: pg_...

    积木报表官方初始化sql

    积木报表官方初始化sql

    nacos使用pg数据库的初始化脚本

    nacos使用pg数据库的初始化脚本

    新建SQL数据库并初始化

    接下来是数据库的初始化过程,这主要包括: 1. **设计表结构**:定义数据库中的表格,每个表格代表一类实体,包含多个字段(列)。使用`CREATE TABLE`语句定义表格结构,如`CREATE TABLE 表名 (字段1 数据类型, ...

    在windows下手动初始化PostgreSQL数据库教程

    在初始化过程中,initdb会生成一系列的配置文件和数据库模板,并设置默认的最大连接数、共享缓冲区等参数。完成初始化之后,会得到一系列的成功消息,表明数据库系统已经准备就绪。 最后,使用pg_ctl工具来启动...

    epson1390清零

    初始化设置 : USB ID : Head ID : Head angular Band angular : Microwave : Bi-D PG Typical ECO : MC1-1 : MC1-5 : MC2-4 : PG - MC1-5 : MC2-3 : PG - - MC1-5 : MC2-3 : PW...

    GPU数据库PG_strom的安装及使用

    以上步骤详细介绍了如何在 CentOS 7.x 系统中安装 PostgreSQL 9.5 并进一步安装 PG_strom 1.x 版本的过程。PG_strom 作为 PostgreSQL 的一种扩展,能够有效地利用 GPU 的并行计算能力来加速数据处理任务,特别是在 ...

    VC_过启动_内核过pg读写_过启动项_过pg保护_启动项_

    标题中的“VC_过启动_内核过pg读写_过启动项_过pg保护_启动项_”指的是与Windows操作系统、内核级保护以及启动管理相关的技术话题。在这个场景中,“VC”可能是Visual C++的简称,一种常用于开发Windows系统应用的...

    [原创]JOS_lab2实验报告: 内存管理及异常初始化

    【JOS Kernel 实验报告:内存管理与异常初始化】 在这个实验中,主要涉及了操作系统内核JOS(简明操作系统)中的两个关键组件:内存管理和异常处理。实验目的是理解和实现虚拟内存机制以及物理内存的分配与回收,...

    linux中pg11的包

    2. **初始化数据库集群**: - 使用`initdb`命令来创建新的PostgreSQL数据库集群,例如:`sudo -u postgres initdb --locale zh_CN.UTF-8 -D /var/lib/postgresql/11/main`。 3. **启动与停止服务**: - 启动:`...

    PG12864F功能介绍

    1. **初始化设置**:使用前需对显示器进行初始化设置,包括设置显示模式、清屏等操作。 2. **指令发送**:通过数据线向显示器发送指令,实现显示内容的更新。 3. **数据传输**:除了指令外,还需要传输实际要显示的...

    pgadmin3-1.10.2 -postgresql可视化工具

    在提供的压缩包中,"upgrade.bat" 文件可能是用于更新现有 pgadmin3 安装的批处理脚本,而 "pgadmin3.msi" 是 Windows 安装程序包,通过这个文件,用户可以方便地在 Windows 系统上安装或升级 pgadmin3。安装过程...

    SEPG的组建与实施活动探讨.pdf

    要实现从较低级别向更高级别的过渡,软件企业需要采取一系列改进措施,其中最关键的是成立软件工程过程组(Software Engineering Process Group, SEPG),负责软件过程改进和标准化工作。 #### 二、SEPG的组建 ###...

    汇川-MD系列变频器多功能PG卡使用说明书版本号:V1.0.pdf

    汇川技术MD系列变频器多功能PG卡是一种专门设计用于配合MD380/MD380M/MD500/CS700全系列变频器使用的扩展卡,具有对编码器信号...正确的安装和操作可以最大化地发挥PG卡的功能,为工业自动化领域提供了可靠的技术支持。

    PG86IMG.zip

    HBOOT,全称为Bootloader,是手机启动过程中的第一部分,负责初始化硬件、验证系统映像并加载操作系统。 【描述】卡刷过程指的是用户通过手动方式将新的系统固件或特定模块(如HBOOT)安装到设备中,通常用于更新、...

Global site tag (gtag.js) - Google Analytics