RelCache中存放的不是元组, 而是RelationData数据结构(数据结构3.13),
每一个RelationData结构表示一个表的模式信息,这些信息都由系统表元组中的信息构造而来.
不是.
值得注意的是,
两种Cache都不是所有进程共享的,每一个PG进程都维护着自己的SysCache和RelCache.
即: 在PG中, 每一个进程都有属于自己的Cache.
换句话说,
同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个RelationData结构).
系统表元组Cache(SysCache).
SysCache中存放的是最近使用过的系统表的元组.
说明RelCache表模式信息Cache(RelCache).
RelCache中包含所有最近访问过的表的模式信息(包含系统表的信息).
RelCache存放的不是元组, 而是RelationData数据结构(数据结构3.13),
每一个RelationData结构表示一个表的模式信息,
这些信息都由系统表元组中的信息构造而来.
注: 两种Cache都不是所有进程共享的,
每一个PG的进程都维护着自己的SysCache和RelCache.
对RelCache的管理比SysCache要简单许多,原因在于大多数时候RelCache中存储的RelationData的结构是不变的,因此PG仅用一个Hash表来维持这样一个结构.
对RelCache的查找,插入,删除,修改等操作也非常简单
两者的类似和SysCache的初始化类似, RelCache的初始化同样也在InitPostgres函数中进行,
同样分为两个阶段: RelationCacheInitialize 和 RelationCacheInitializePhase2.
如果需要访问的系统表在Cache中无法找到或者需要访问普通表的元组,
就需要对缓冲池进行访问. 任何对于表,元组,索引表等的操作都在缓冲池中进行,
缓冲池的数据调度都以磁盘块为单位,
需要访问的数据以磁盘块为单位调用函数smgrread写入缓冲池,
而smgrwrite将缓冲池数据写回到磁盘.
调入缓冲池中的磁盘块称为缓冲区, 缓冲块或者页面, 多个缓冲区组成了缓冲池.
缓冲池管理模块的主要结构如下图.
如果需要访问的系统表元组在Cache中无法找到或者需要访问普通表的元组,
就需要对缓冲池进行访问.
任何对于表,元组,索引表等的操作都在缓冲池中进行,缓冲池的数据调度都以磁盘块为单位,需要访问的数据以磁盘块为单位调用函数smgrread写入缓冲池,而smgrread将缓冲池数据写回到磁盘.调入缓冲池池中的磁盘块称为缓冲区,缓冲块或者页面,多个缓冲区组成了缓冲池.
共享缓冲区为什么采取了静态方式 *****为了便于实现, PG对共享缓冲区的管理采取了静态方式:
它在系统配置时规定好了共享缓冲区的总数(1000个, 由全局变量NBuffers定义),
以后在每次系统启动时,
由Postmaster或某一独立的Postgres从共享内存中分配一片空间作共享缓冲区,
全部(共享)缓冲区构成共享缓冲池.
主要有4块:
初始化共享缓冲池
共享缓冲区查询
共享缓冲区替换策略
本地缓冲池管理
3.3.4 IPC 什么是IPCIPC(进程间通信, Inter-Process
Communication)是指至少两个或者两个以上的进程交换数据或信号的技术或者方法.
由于进程是操作系统分配资源的最小单位, 每个进程都有自己独立的一套系统资源,
不同进程之间的资源是相互隔离的.
为了使不同进程之间能够互相访问资源并且进行协同工作, 操作系统提供了IPC机制.
广义上的IPC不仅可以使用同一计算上的多个进程进行通信,
而且可以使不同计算机上的多个进程进行通信,
但PG中的IPC只考虑同一计算机上的进程间通信.
为了使不同进程之间能够互相访问资源并且协同工作, 操作系统提供了IPC机制.
PG中的IPC有什么不同广义上的IPC不仅可以使用同一计算上的多个进程进行通信,
而且可以使不同计算机上的多个进程进行通信,
但PG中的IPC只考虑同一计算机上的进程间通信.
IPC有多种实现方法, 包括文件, Socket, 共享内存等.
PG中的IPC主要采用共享内存的方式来实现,
即在系统中开辟一片所有进程都可以读写的内存空间,
并约定好进程读写这片内存的时机和方式,
这样进程之间就可以通过这片共享内存来交换数据.
在共享内存的基础上, PG的IPC机制还提供了以下功能:
进程和Postermaster的通信机制
统一管理进程的相关变量和函数
提供了SI Message机制, 即无效消息传递机制.
有关清除的函数.
IPC模块主要分几部分内容共3部分:
共享内存管理
SI Message
其他
3.4 表操作与元组操作 3.4.1 表操作 3.4.2 元组操作 3.5 VACUUM机制 为什么需要Vacuum机制