- 浏览: 233427 次
- 性别:
- 来自: 北京
-
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
文章列表
pg
初始化完
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化管理各种事务和事务本身相关结构的实例。然后就是初始化缓冲池(
buffer pool
)。
缓冲区
(buffers)
存在于一个空闲内存块列表和一个哈希表查询数据结构。下面简述一下和缓冲池相关的概念。
查找缓冲区(
buffer
)时必须注意,在
I/O
开始之前缓冲区必须可用。负责尝试读缓冲区的第二个进程会分配自己的复制,这样缓冲池就不一致了。
...
pg
初始化
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化
xlog
。然后依次初始化
clog
、
subtrans
、
twophase
、
multixact
。安排按
clog
、
subtrans
、
multixact
、
twophase
的顺序写,把
twopha ...
pg
初始化
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化
xlog
。然后依次初始化
clog
、
subtrans
、
twophase
、
multixact
。安排按
clog
、
subtrans
、
multixact
、
twophase
的顺序写,把
twophase
放到
multixact
之后是因为前面三个用了相同的算法和数据结构,连起来写可以加深印象和归类记忆,本来想把初始化
clog
、
subtrans
、
multix ...
pg
初始化
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化
xlog
。然后依次初始化
clog
、
subtrans
、
twophase
、
multixact
。安排按
clog
、
subtrans
、
multixact
、
twophase
的顺序写,把
twophase
放到
multixact
之后是因为前面三个用了相同的算法和数据结构,连起来写可以加深印象和归类记忆,本来想把初始化
clog
、
subtrans
、
multix ...
pg
初始化完
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化
xlog
。然后依次初始化
clog
、
subtrans
、
twophase
、
multixact
。安排按
clog
、
subtrans
、
multixact
、
twophase
的顺序写,把
twophase
放到
multixact
之后是因为前面三个用了相同的算法和数据结构,连起来写可以加深印象和归类记忆,本来想把初始化
clog
、
subtrans
、
multi ...
pg
初始化完
shmem
,给其加上索引
"ShmemIndex"
后,接着就在
shmem
里初始化
xlog
。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化
xlog
方法调用流程图
2
初始化
xlog
相关结构
话说
main()->
…
->PostmasterMain()->
…
->reset_shared() ->
CreateSh ...
pg
的内存处理
AllocSet/MemoryContext
外,另一个主要部分就是共享内存shared memory
。这一节讨论共享内存(简写shmem
)的初始化及其哈希表索引
"ShmemIndex"
的建立,这是共享内存/shmem
管理的基础。
在
reset_shared
()
这个函数里,
计算数据缓冲、xlog
、clog
、共享进程、子事务、并发控制、轻量级锁、backend
进程等需要的共享内存,
调用
shmget()
函数在堆上分配,接着在头部初始化一个
PGShmemHeader
*
类型的
...
二叉树搜索具有对数时间的表现有个假设:输入数据具有相当的随机性。现在我们看哈希表,这种数据结构,其在插入、删除、查询操作上也具有常数评价时间的表现,而且这种表现以统计为基础,不依赖数据的随机性。
...
pg
现在要初始化另一块内存——共享内存
shared memory
(以后
shared memory
有时会简写成
shmem
),在这块内存里,
pg
存放数据、锁、各种
backend
进程等。
1
先上个图,看一下函数调用过程梗概,中间略过部分细节
初始化共享内存方法调用流程图
2
计算
shared memory
大小
话说
main()->
…
->PostmasterMa ...
pg
到这儿检查参数
EnableSSL
,
如果使能建立
SSL
连接,
就
初始化相关库。
pg
里安全相关的部分基本上是基于
OpenSSL
开发。搞网络安全的人没有不知道
OpenSSL
的,看到
OpenSSL
心中就有数了。国内的
VPN
、网银、安全支付等产品,基本上都是基于
OpenSSL
开发的。如果有兴趣可以先看看关于
OpenSSL
的资料,有本
E
文的书,名字忘了,
162
页左右吧,专门介绍
OpenSSL
的。看之前先认真看两本网络安全的教科书吧,要不然不看晕的人估计没几个。
这片文章是占 ...
话说
MemoryContextMethods
结构里的函数实现了pg
里AllocSet/MemoryContext
的内存管理机制,定义见下面。
typedef
struct
MemoryContextMethods
{
void
*(*alloc) (MemoryContext context, Size
size);
/* call this free_p in case someone #define's free() */
void
...
话说
MemoryContextMethods
结构里的函数实现了pg
里AllocSet/MemoryContext
的内存管理机制,定义见下面。
typedef
struct
MemoryContextMethods
{
void
*(*alloc) (MemoryContext context, Size
size);
/* call this free_p in case someone #define's free() */
void
...
话说初始化完全局时区后,初始化全部的时区。
从默认时区文件
%PostgreSQL Home%\share\timezone\Default
中读、解析世界上按行政区划现有的时区以及这些时区和UTC
的以秒记的时差到
临时
MemoryContext
"TZParserMemory"
里的有序tzEntry **
类型的timezone
数组base
里。然后把base
数组拷贝到
MemoryContext
"TopMemoryContext"
里,
使datekn *
类型静态全局变量timezonet ...
话说初始化和设置完
GUC
参数后,改变了当前工作文件夹,给数据集文件夹加了文件锁
postmaster.pid
,接着就是初始化时区设置,这些都跳过去了,后来发现初始化时区用到了
pg
里的动态哈希表,决定还是把这个写出来。
动态哈希表在
pg
里使用的地方很多,
pg
使用它管理共享内存
shared memory
、锁、市区
timezone
等。
Linux
使用哈希表来管理内存、连接等。后面再讨论
pg
里的动态哈希表
dynmaic hashtable
。
1
先上个图,看一下函数调用过程梗概, ...
话说
MemoryContextMethods
结构里的函数实现了pg
里AllocSet/MemoryContext
的内存管理机制,定义见下面。
typedef
struct
MemoryContextMethods
{
void
*(*alloc) (MemoryContext context, Size
size);
/* call this free_p in case someone #define's free() */
void
...