当前位置: 首页 > news >正文

PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制

简单来说,PgSQL的psql客户端向服务端发起连接请求,服务端接收到请求后,fork出一个子进程,之后由该子进程和客户端进行交互,处理客户端的SQL等,并将结果返回给客户端。那么,他是如何做到客户端和服务端子进程进行交互呢?服务端怎么做到和多个客户端交互呢?

1、客户端如何连接

psql客户端连接及发送SQL命令过程如下图所示:

fb85abfa1c737ffb5e4e8ed7824efeea.png

1)通过parse_psql_options函数解析出psql连接时指定的端口号、用户名、database名等

2)然后将这些参数以keywors[]和values[]数组保存,并作为入参带入PQconnectdbParams函数连接服务端

(1)PQconnectdbParams连接主要由PQconnectPoll完成,可以看到它仅通过socket函数创建套接字后,就直接调用connect连接服务端。由于没有通过bind函数绑定一个端口,所以在客户端会自动分配一个随机端口。

3)连接成功后,后面在MainLoop函数中接收psql端的输入,接收到命令后通过SendQuery函数将其在上面的套接字上将其发送给服务端。

举例:在windows版本上通过psql连接postgres后端口情况:

504c9ff0e011ee3da5266c266514d150.png

psql的进程ID为14856:

62a0c6621f691af5a015f9ee8bf05c04.png

通过netstat命令可以看到客户端随机分配了端口53761。服务端10900为postgres主进程,他绑定在5432端口上:

3ded34d3b9ec7edd69e42998f786eb7c.png

2、服务端如何构建连接

52b36d006350d57548199cce7c0f5a27.png

1)Postgres进程启动的时候就会绑定配置项port设置的端口,由函数StreamServerPort函数完成。上图所示,StreamServerPort完成socket、bind、listen的操作。

2)然后,进入ServerLoop函数中,通过select等待客户发来连接请求。一旦接收到后,就通过ConnCreate函数调用accept与客户端构建连接,返回对应的socket。

3)接着,通过BackendStartup函数调用fork_process函数fork出子进程,子进程会继承父进程上一步构建好连接的socket。

4)子进程不使用监听socket,所以需要将从父进程继承而来的监听socket关闭掉。

5)子进程进入BackendRun->PostgresMain中,初始化一系列内容,并通过recv函数在2)中的socket上接收客户端发来的命令,然后判断命令类型,比如简单查询,就会exec_simple_query去执行

6)父进程由于不需要执行客户端命令,所以fork出子进程后,通过StreamClose将2)中的socket关闭掉,这样就做到了在主进程中不接收客户端命令。

http://www.lryc.cn/news/371407.html

相关文章:

  • 实现开发板三盏灯点亮熄灭
  • 外汇天眼:盈透证券为客户提供更丰富的欧洲衍生品交易渠道
  • 论文阅读Rolling-Unet,卷积结合MLP的图像分割模型
  • Linux Shell命令vim使用
  • 如何将 API 管理从 Postman 转移到 Apifox
  • 用链表实现的C语言队列
  • 国产SDI视频均衡驱动器,功能与 LMH0387/LMH0344 一致
  • 如何用Xinstall CPS结算系统打破传统营销桎梏,实现用户增长?
  • (代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:
  • 如何提高网站收录?
  • Docker 学习总结(83)—— 配置文件daemon.json介绍及优化建议
  • Javaweb04-Servlet技术2(HttpServletResponse, HttpServletRequest)
  • chat gpt基本原理解读
  • 单目标应用:基于蛇鹫优化算法SBOA的微电网优化(MATLAB代码)
  • MySQL系列-安装配置使用说明(MAC版本)
  • vue elementui el-input 正则验证,限制只能输入数字和小数
  • 强化学习入门
  • 简约不简单,建筑装饰演绎现代美学
  • SpringBoot调用WebService的实践
  • 源码编译构建LAMP
  • 搜索是门艺术,大神都是这样找资源
  • 【设计模式深度剖析】【5】【行为型】【迭代器模式】
  • 怎么更快捷的修改图片大小?压缩图片jpg、png、gif的快捷方法
  • Shell脚本 if语句
  • 集合查询-并(UNION)集运算、交(INTERSECT)集运算、差(EXCEPT)集运算
  • 常用的bit位操作
  • 自动控制原理【期末复习】(二)
  • 机器学习——集成学习和梯度提升决策树
  • MYSQL 查看SQL执行计划
  • ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的MPAM