- 浏览: 231146 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
话说初始化和设置完 GUC 参数后,改变了当前工作文件夹,给数据集文件夹加了文件锁 postmaster.pid ,接着就是初始化时区设置,这些都跳过去了,后来发现初始化时区用到了 pg 里的动态哈希表,决定还是把这个写出来。
动态哈希表在 pg 里使用的地方很多, pg 使用它管理共享内存 shared memory 、锁、市区 timezone 等。 Linux 使用哈希表来管理内存、连接等。后面再讨论 pg 里的动态哈希表 dynmaic hashtable 。
1 先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化 Timezones 的方法调用过程图
这一节写图中红色方框圈起来的部分,上面的部分基本上在前面已经写过了,有小部分有略过。红色框中的部分就是初始化 Timezones 的过程调用,这主要做了两件事,一是创建了一个 ”Timezones” AllocSet/MemoryContext ,二是建了一个 pg 中的动态哈希表,来管理 / 存放 timezone 。
2 初始化全局时区 global_t imezones 的过程
话说 main()-> … ->PostmasterMain()-> … -> pg_timezone_initialize () ( 以后用“ -> ” 表示调用 ) ,先到前面的文章《 pg 启动过程中的那些事三》里提到的 config_generic ** 类型的有序 GUC 参数数组 guc_variables 里用二分法查找 config_string 类型参数timezone ,此时该参数还没有设置,接着 -> select_default_ timezone() -> identify_system_timezone() 函数根据 OS 环境变量识别操作系统的 timezone 设置,再 -> select_default_ timezone() -> set_global_timezone() -> pg_tzset() 在内存里初始化一个静态全局变量动态哈希表static HTAB * timezone_cache ,在哈希表timezone_cache 里记录时区结构pg_tz_cache 类型的实例。然后使pg_tz * 类型全局指针变量 global_timezone 指向哈希表中的pg_tz_cache 结构类型实例中pg_tz 结构的成员tz 。最后->SetConfigOption() 设置GUC 参数“timezone ”为“ASIA/Hong_Kong ”(这个是我PC 上跑的结果)。
下面是pg_tz_cache 、pg_tz 等机构定义。
typedef struct
{
/* tznameupper contains the all-upper-case name of the timezone */
char tznameupper[TZ_STRLEN_MAX + 1];
pg_tz tz;
} pg_tz_cache;
struct pg_tz
{
/* TZname contains the canonically-cased name of the timezone */
char TZname[TZ_STRLEN_MAX + 1];
struct state state;
};
struct state
{
int leapcnt;
int timecnt;
int typecnt;
int charcnt;
pg_time_t ats[TZ_MAX_TIMES];
unsigned char types[TZ_MAX_TIMES];
struct ttinfo ttis[TZ_MAX_TYPES];
char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, 3 /* sizeof gmt */ ),
(2 * (TZ_STRLEN_MAX + 1)))];
struct lsinfo lsis[TZ_MAX_LEAPS];
};
struct ttinfo
{ /* time type information */
long tt_gmtoff; /* UTC offset in seconds */
int tt_isdst; /* used to set tm_isdst */
int tt_abbrind; /* abbreviation list index */
int tt_ttisstd; /* TRUE if transition is std time */
int tt_ttisgmt; /* TRUE if transition is UTC */
};
struct lsinfo
{ /* leap second information */
pg_time_t ls_trans; /* transition time */
long ls_corr; /* correction to apply */
};
pg_tz_cache 的结构在内存里看起来是这样的。
时区相关结构图
初始化global_timezone 是从 -> select_default_ timezone() -> set_global_timezone() -> pg_tzset() -> init_timezone_hashtable() -> hash_create() 开始的(调用过程要是看晕了就看上面的调用过程图吧),先初始化一个AllocSet/MemoryContext 类型变量“Timezones ”,接着在AllocSet/MemoryContext 类型的“Timezones ”实例里就是HTAB 、HASHHDR 、HashSegment 、HashBucket 、HashElemen 等等一堆招呼,初始化成了“Timezones ”动态哈希表。熟悉哈希表/ 哈希算法的同学看着HashBucket 、HashElement 也能猜出来大概是干什么用的,HashSegment 是干什么的?这个和动态哈希表“dynmaic hashtable ”的动态,或者说可扩展哈希表的可扩展有关。我认为用 “可扩展哈希表” 更能体现“dynmaic hashtable ”的功能,更贴近中国人用词习惯,以后就用“可扩展哈希表”吧。可扩展哈希表以后再讨论。pg 里还有个Shared memory index, 也是这个可扩展哈希表类型的,是和共享内存管理有关的东东,到内存管理机制时再讨论。
经过一连串的调用,hash_create 创建的可扩展哈希表“Timezones ”是一个由256 个HashSegment ,256 个HashBucket ,4 个HashSegment+Entry 组成的哈希表。在pg 里,有的哈希表是放在内存上下文MemoryContext 中的,有的哈希表是放在共享内存shared memory 里的,这个 “Timezones ”哈希表是放在“Timezones ”内存上下文里的。为了看起来更清晰,就没有把“Timezones ”哈希表放到AllocBlock 里的AllocChunk 里。结构图在下面。
“Timezones ”哈希表结构
pg 里的timezone 文件以PG_BINARY 格式存放在%PostgreSQL Home%\share\timezone 里。
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2065题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1824话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1736话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1437话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1387Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1763话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1534话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1889在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1805话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1632话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1856话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1317话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1260话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15783 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一
2012-08-08 14:42 5687到pg 服务进程了,打算搞一个完整但简单的查询例子,从 ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13813 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1615话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14333 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1646话说 main()->Postm ...
相关推荐
五、 pg _roles:_roles:_roles:_roles: _roles: 69 六、 pg_rules: pg_rules:pg_rules:pg_rules: pg_rules: 69 七、 pg_settings: pg_settings: pg_settings: pg_settings:pg_settings: pg_settings:pg_settings:pg_...
- 功能:初始化参数。 - 输入标签:与M+FX5PG_SetPositioningData类似。 - 输出标签:与M+FX5PG_SetPositioningData类似。 11. **M+FX5PG_WriteFlash** - 功能:将缓冲存储器中的定位数据和块启动数据写入闪存...
PostgreSQL的学习心得和知识总结(四十五)|关于PostgreSQL数据库开源作业调度扩展 pg_cron 默认GMT时区修改 的实现方案
- `setup_arch`接下来调用`init_bootmem`函数以初始化启动时的内存分配器。此分配器仅在系统启动过程中使用,用于为永久的内核数据分配内存。 - 这些由`bootmem`分配器分配的页被视为内核的一部分,它们在系统启动...
pg_timetable:PostgreSQL高级调度 pg_timetable是PostgreSQL高级作业调度程序,与cron等传统调度程序相比,具有许多优势。 它完全由数据库驱动,并提供了一些高级概念。 # ./pg_timetable Application Options: -...
标题中的"pg055axibridgepcie_055PG.com_055pg.com_www.055PG.COM_https//:055"似乎是一个标识符,结合描述中的"AXI Memory Mapped to PCI Express (PCIe)",我们可以推测这可能是一份关于在系统设计中使用AXI...
/_____/\ /______/\ /_____/\ /__/\ /__/\ /_______/\/_____/\ /________/\\:::_ \ \\::::__\/__\::::_\/_\::\ \\ \ \ \__.::._\/\::::_\/_\__.::.__\/ \:(_) \ \\:\ /____/\\:\/___/\\::\/_\ .\ \ \::\ \ \:\/___/\...
:smiling_face_with_heart-eyes: :elephant: pg-emoji1.关于emoji是一个纯SQL 扩展,用于按/文本对表情符号进行编码/解码。 查找表由[ ]中的前1024个表情符号构成,其中每个表情符号都映射到一个唯一的10位序列。 ...
Oracle数据库的多国语言设置是其支持全球多样化的关键特性,允许系统处理各种语言、货币格式、排序方式以及CHAR、VARCHAR2、CLOB和LONG字段中的数据。这涉及到两个核心概念:国家语言设置和字符集设置。 国家语言...
Angular的国际化(i18n)库 Transloco允许您为内容定义不同语言的翻译,并在运行时轻松地在它们之间切换。 它公开了丰富的API,可以高效,干净地管理翻译。 它提供了多个插件,可以改善您的开发经验。 以下是它提供...
以上步骤详细介绍了如何在 CentOS 7.x 系统中安装 PostgreSQL 9.5 并进一步安装 PG_strom 1.x 版本的过程。PG_strom 作为 PostgreSQL 的一种扩展,能够有效地利用 GPU 的并行计算能力来加速数据处理任务,特别是在 ...
如何运行: $ docker run -d --name postgres -e POSTGRES_PASSWORD=postgres binakot/postgresql-postgis-timescaledb 您也可以使用构建的docker映像和pgAdmin4运行应用程序堆栈:docker docke
在IT行业中,数据库管理是至关重要的任务,尤其是在大规模数据处理时,如Greenplum这样的分布式数据库系统。Greenplum是一个基于PostgreSQL的高性能、可扩展的数据仓库解决方案,广泛用于数据分析和商业智能。本文将...
标题中的“VC_过启动_内核过pg读写_过启动项_过pg保护_启动项_”指的是与Windows操作系统、内核级保护以及启动管理相关的技术话题。在这个场景中,“VC”可能是Visual C++的简称,一种常用于开发Windows系统应用的...
gs_initdb初始化报错:PANIC: Could not create file “global/pg_dw_meta”: Invalid argument gs_ctl 启动报错:gaussDB state is Coredump 2. 问题分析过程 3. 源码解读过程,详细分析问题,定位问题,从而解决...
pg_snapshot_too_old 用于在PostgreSQL中启用Snapshot Too Old错误的扩展。 概要 安装扩展 ./configure make sudo make install 加载扩展 CREATE EXTENSION pg_snapshot_too_old; 配置扩展 全局配置 更新/etc/...
通过对Linux内核版本2.6.13.2的源代码进行深入分析,我们不仅了解了系统启动的基本流程,还深入了解了在这个过程中涉及的关键数据结构和初始化机制。这些知识对于理解现代操作系统的工作原理至关重要,同时也为后续...
7. PG Pin处理:add_pg_pin_to_db和add_pg_pin_to_lib命令在ICC2中没有直接对应的命令。 8. Power State处理:add_power_state命令在ICC2中具有相同的功能,是UPF命令的一部分。 9. Row处理:add_row命令在ICC2中...
PG9.6查询优化器处理流程1 PG9.6查询优化器处理流程1是PostgreSQL 9.6版本中查询优化器的处理流程。查询优化器是数据库管理系统中的一种核心组件,负责将用户提交的查询语句转换为高效的执行计划,以便快速地检索...