3
这节主要讨论
bgwriter
进程到了
BackgroundWriterMain
,设置合适的信号处理句柄,
创建一个资源属主以保持对本进程资源的跟踪
,
创建一个本进程的所有工作都在其内做的内存上下文
"Background Writer"
,创建这个内存上下文是为了本进程在错误恢复期间能重置
context
并且因此避免可能的内存泄漏。
设置错误跳跃点。接着不堵塞信号(当
postmaster
进程
fork
本进程时用
PG_SETMASK(&BlockSig)
堵塞了他们)。然后进入无限循环,检查并处理任何请求或者最近收到的信号。如果请求了检查
点,就根据情况做一个重启点或做一个检查点;如果没请求检查点,就做一个脏缓存写。然后再接着循环。
BackgroundWriterMain
方法的调用序列图
BackgroundWriterMain
方法的调用序列图
4
下面是
BackgroundWriterMain
流程示意图。
BackgroundWriterMain
流程示意图
BackgroundWriterMain
中主要是根据情况看是否有创建检查点请求,如果有,再进一步根据情况判断是要做一个重启点还是要创建一个检查点,根据情况调用
CreateCheckPoint
或
CreateRestartPoint
方法;如果没有请求检查点,调用
BgBuffferSync
方法做脏缓存写。
5
其中
CreateCheckPoint
方法创建检查点的具体情况参见《
PostgreSQL
启动过程中的那些事十六:启动进程二》。创建重启点的
CreateRestartPoint
方法和
创建检查点相似,但被用于
WAL
恢复期间创建一个点,如果重启,恢复可以从这个点继续前滚而不用重放整个恢复日志。
CreateRestartPoint
流程示意图
创建重启点主要是为恢复重启保持一个合适的检查点,这个检查点必须是一个安全的重启点。如果可能创建一个重启点,创建重启点主要是把数据库系统共享内存中的数据全部刷出到磁盘,并把可以安全重启的检查点存入控制文件和共享内存中相关变量,详细信息参见上面的“
CreateRestartPoint
流程示意图”。
6
BgBuffferSync
方法根据策略调用
SyncOneBuffer
把需要同步的脏缓存块逐个写出。
pg
里缓存池里的所有缓存块是由以
Nbuffers
个
BufferDesc
结构数组里的
freeNext
组成的空闲缓存链表和一个查找缓存的哈西表索引
“
Shared
Buffer Lookup Table
”(参见《
PostgreSQL
启动过程中的那些事七:
shmem
中初始化
BufferPool
》)进行管理。其中,
SyncOneBuffer() -> FlushBuffer()
-> smgrwrite()
,在存储管理器
smgr
的
smgrwrite
方法里根据
smgr
的接口
smgr_write
和规则转到磁盘
md
的
mdwrite
方法。
mdwrite
方法不是同步写——在返回时块不是必须在磁盘上,其只是把这个缓存块的内容传到
OS
的
kernel
,最终调用
OS
的
Write
接口,
kernel
再根据情况安排写磁盘任务。但是,在下一次检查点记录到
WAL
日志前通过文件同步
fsync
我们将强制将这些改变的缓存块写到磁盘。
在
BgBuffferSync
方法里多次提到
clock
sweep
算法,
clock
sweep
算法是缓存池替换时使用的算法,其开始一个循环次数上限为
tryCounter=NBuffers
的循环来检查缓存池里的空闲缓存块,当找到一个引用计数
refCount
为
0
但最近使用过(
usage_count
不等于
0
)的缓存块时将
usage_count
减
1
,接着重新设置
tryCounter=NBuffers
并继续遍历,直到有缓存块的
refCount
和
usage_count
都为
0
,则其最近较少使用,可以被替换掉。
------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
- 大小: 68.2 KB
- 大小: 119.2 KB
- 大小: 115.9 KB
分享到:
相关推荐
一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...
其中,存储过程是一个非常重要的概念,本文将对 PostgreSQL 中的存储过程进行详细的介绍和解释。 什么是存储过程 存储过程是一组为了完成特定任务而编写的 SQL 语句集合。它可以将复杂的操作封装起来,以便于重复...
Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...
PostgreSQL的存储过程是由一系列SQL语句组成的代码块,可以被多次调用并执行,类似于编程语言中的函数。调试存储过程有助于理解其内部逻辑,查找并修复潜在的错误或性能瓶颈。 1. **调试环境设置** 调试PostgreSQL...
赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar; 赠送Maven依赖信息文件:postgresql-42.3.1.pom; 包含翻译后的API文档:...
在PostgreSQL中,BGWorker是用户定义的后台进程,它们不是作为数据库服务器的一部分启动,而是由服务器启动并在需要时执行特定的任务。这种设计使得BGWorker能够执行长时间运行的操作,而不阻塞主线程或影响其他...
### PostgreSQL内核分析——多进程结构 #### 一、进程的理解与创建 进程是一个正在运行的程序实例,它具有动态的特性。对于程序员而言,所编写的代码在未经编译之前仅是静态的源代码。当这些代码经过编译、链接等...
PostgreSQL修炼之道:从小工到专家 PostgreSQL是一种功能强大且广泛应用的开源关系型数据库管理系统,本书《PostgreSQL修炼之道:从小工到专家》旨在帮助读者深入理解PostgreSQL的核心原理和最佳实践,从而提升...
本套程序是在VS2005下C#开发,...在对PostgreSQL数据库进行操作时,用到了如何调用存储过程来完成各项操作。 将App_Data下的数据库文件导入到PostgreSQL 8.3版里面,库名为:HYGL 然后修改web.config中的配置即可使用
在转换过程中,需要注意以下几点: * 将 MySQL 的 tinyint 类型转换为 PostgreSQL 的 int2 类型,这可能会导致实体属性类型不匹配的问题。 * 将 MySQL 的 hidden 类型转换为 PostgreSQL 的 int4 类型,这可能会导致...
初始化数据库是PostgreSQL安装过程中必不可少的一步,可以通过执行以下命令完成: ```bash sudo /usr/pgsql-15/bin/postgresql-15-setup initdb ``` 初始化完成后,将会创建数据库目录并设置默认权限。 ##### 3.4...
### Linux下PostgreSQL安装与开机启动详解 #### 1. 添加用户及创建目录 为了确保PostgreSQL服务的安全性,我们通常会为它创建一个独立的系统用户。这一步骤包括了用户创建、密码设定以及相关目录的搭建。 ##### ...
赠送jar包:postgresql-42.2.2.jar; 赠送原API文档:postgresql-42.2.2-javadoc.jar; 赠送源代码:postgresql-42.2.2-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.2.pom; 包含翻译后的API文档:...
PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组
PostgreSQL存储过程是一种数据库编程的方法,它允许用户在数据库中定义和执行复杂的操作逻辑,而不仅仅是简单的查询。存储过程在数据库管理系统中起着至关重要的作用,它们可以提高性能,增加安全性,减少网络流量,...
PostgreSQL 存储过程中的连接字符不是 `+`,而是使用 `||`。例如: ``` str := 'hello' || 'world'; ``` 四、控制结构 PostgreSQL 存储过程支持多种控制结构,包括条件语句、循环语句和跳转语句。 1. 条件语句 ...
赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar; 赠送源代码:postgresql-42.2.5-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.5.pom; 包含翻译后的API文档:...
PostgreSQL中国社区资深数据库专家、沃趣科技首席数据库架构师撰写,PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 ...
在启动过程中,`postmaster`会执行一系列初始化操作,比如创建共享内存段、设置信号处理程序等。初始化完成后,通过`ServerLoop`函数进入循环状态,等待并处理来自客户端的连接请求。对于崩溃或异常终止的子进程,`...
数据架构师的PostgreSQL修炼:高效设计、开发与维护数据库应用 EPUB 数据架构师的PostgreSQL修炼:高效设计、开发与维护数据库应用 EPUB 数据架构师的PostgreSQL修炼:高效设计、开发与维护数据库应用 EPUB