0. 前言
Postgres内核中shared buffer的初始化过程是在buf_init.c(缓冲区管理器初始化例程,src/backend/storage/buffer)源文件中实现的。
该文件中的几个注释值得重视:
-  Data Structures(数据结构) 
 缓冲区位于freelist和查找数据结构中。
-  Buffer Lookup(缓存查找) 
 两个重要的注意事项。首先,在IO开始之前,缓冲区必须可供查找。否则,试图读取缓冲区的第二个进程将分配自己的副本,缓冲池将变得不一致。
-  Buffer Replacement (缓存替换) 
 请参阅freelist.c。缓冲区在数据管理器使用或IO过程中无法替换。
-  Synchronization/Locking(同步/锁) 
 这是缓冲区描述符中的一个标志。该参数必须在IO初始化时设置,并在IO结束时清除。它的存在是为了确保一个进程不会在另一个进程启动时使用缓冲区。参阅WaitIO和相关例程。
-  refcount 
 统计对缓冲区中持有pins的进程数。缓冲区在IO期间和BufferAlloc()之后被pinned。Pins必须在事务结束前释放。为了提高效率,如果单个后端多次pins缓冲区,则不会增加共享refcount。检查bufmgr.c中的PrivateRefCount基础结构
0.1 Postgres内存架构
Postgres内