暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

opengauss 代码结构

suger 2023-02-02
418

代码结构
(一)通信管理
openGauss查询响应是使用简单的“单一用户对应一个服务器线程”的客户端/服务器模型实现的。由于我们无法提前知道需要建立多少个连接,因此必须使用主进程(GaussMaster)主进程在指定的TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网协议)端口上侦听传入的连接,只要检测到连接请求,主进程就会生成一个新的服务器线程。服务器线程之间使用信号量和共享内存相互通信,以确保整个并发数据访问期间的数据完整性。

客户端进程可以被理解为满足openGauss协议的任何程序。许多客户端都基于C语言库libpq进行通信,但是该协议有几种独立的实现,例如Java JDBC驱动程序。

建立连接后,客户端进程可以将查询发送到后端服务器。查询是使用纯文本传输的,即在前端(客户端)中没有进行解析。服务器解析查询语句、创建执行计划、执行并通过在已建立的连接上传输检索到的结果集,将其返回给客户端。

openGauss数据库中处理客户端连接请求的模块叫做postmaster。前端程序发送启动信息给postmaster,postmaster根据信息内容建立后端响应线程。postmaster也管理系统级的操作比如调用启动和关闭程序。postmaster在启动时创建共享内存和信号量池,但它自身不管理内存、信号量和锁操作。

当客户端发来一个请求信息,postmaster立刻启动一个新会话,新会话对请求进行验证,验证成功后为它匹配后端工作线程。这种模式架构上处理简单,但是高并发下由于线程过多,切换和轻量级锁区域的冲突过大导致性能急剧下降。因此openGauss通过线程资源池化复用的技术来解决该问题。线程池技术的整体设计思想是线程资源池化,并且在不同连接直接复用。

1. postmaster源码组织
postmaster源码目录为:/src/gausskernel/process/postmaster。postmaster源码文件如表2所示。

表2 postmaster源码文件

postmaster.cpp 用户响应主程序
aiocompleter.cpp 完成预取(Prefetch)和后端写(BackWrite)I/O操作
alarmchecker.cpp 闹钟检查线程
lwlockmonitor.cpp 轻量锁的死锁检测
pagewriter.cpp 写页面
pgarch.cpp 日志存档
pgaudit.cpp 审计线程
pgstat.cpp 统计信息收集
startup.cpp 服务初始化和恢复
syslogger.cpp 捕捉并写所有错误日志
autovacuum.cpp 垃圾清理线程
bgworker.cpp 后台工作线程(服务共享内存)
bgwriter.cpp 后台写线程(写共享缓存)
cbmwriter.cpp remoteservice.cpp postmaster信号处理
checkpointer.cpp 检查点处理
fencedudf.cpp 保护模式下运行用户定义函数
gaussdb_version.cpp 版本特性控制
twophasecleaner.cpp 清理两阶段事务线程
walwriter.cpp 预写式日志写入
 




原文链接:https://blog.csdn.net/GaussDB/article/details/116132257

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论