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.rhkb.cn/news/348694.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python第二语言(八、Python包)

目录 1. 什么是Python包 2. 创包步骤 2.1 new包 2.2 查看创建的包 2.3 拖动文件到包下 3. 导入包 4. 安装第三方包 4.1 什么是第三方包 4.2 安装第三方包-pip 4.3 pip网络优化 1. 什么是Python包 包下有__init__.py就是包,无__init__.py就是文件夹。于Ja…

Linux常用基本命令-操作

目录 一、shell 1、什么是shell 二、Linux基本的命令分类 1、内部命令和外部命令 2、查看内部命令 2.1、help命令 2.2、enable 命令 2.3、type命令 2.4、whereis命令 2.5、which 命令 2.6、hash缓存 ​编辑 三、Linux常用命令 1、Linux命令格式 2、编辑Linux命…

FRP 内网穿透 | 实现远程访问与安全管理

唠唠闲话 内网穿透简介 在互联网上,两个不同主机进行通信需要知道对方的 IP 地址。由于世界人口和设备众多,IPv4 资源相对紧缺,因此绝大部分情况下是通过路由器或交换机转换公网 IP 后才上网。 位于路由器或交换机后的设备通常是内网设备&…

Chroium 源码目录结构分析(1):源码目录体积一栏

获取源码 首先,我们拉一份最新的源代码(笔者是2024.6.6日拉取的): fetch --nohistory chromium 源码预处理 如果运行build,会生成许多生成的代码,因此我们不运行build。 然后,把干扰后续分析…

docker拉取镜像失败超时的解决方法,docker配置国内镜像源

更换国内源 创建或修改 /etc/docker/daemon.json 文件 安装docker后一般只有 /etc/docker 这个目录 下面并没有 daemon.json 文件 我们直接创建 : vim /etc/docker/daemon.json {"registry-mirrors" : ["https://registry.docker-cn.com"…

【redis】redis事务

目录 Redis事务四个命令redis事务特性redis事务执行原理 Redis 事务的使用基本使用watch 监控watch 实现原理补充 Redis事务 Redis事务是一种将多个命令打包成一个单独操作的机制,它保证了在执行这些命令期间,其他命令无法插入。 四个命令 Redis事务通…

基于Java+SpringBoot制作一个软考助手答题小程序

基于Java+SpringBoot制作一个软考小助手考试答题小程序。其中系统前端功能包括注册登录、公告通知、考试答题、视频课程、考试记录、题库、题目评论、错题统计、我的收藏和用户信息管理模块;系统后台功能包括用户管理、题库管理、答题管理、学习视频管理以及系统管理模块。 摘…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议,它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备,该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…

线程池前置知识

并发和并行 并发是指在单核CPU上,多个线程占用不同的CPU时间片。线程在物理上还是串行执行的,但是由于每个线程占用的CPU时间片非常短(比如10ms),看起来就像是多个线程都在共同执行一样,这样的场景称作并发…

Spring对事务的支持

一、事务 事务防止进行操作时,数据库里面的数据丢失。 二、Spring事务注解方式 注解方式:在配置文件中配置事务管理器,利用注解,管理事务。 实例 银行转账:一个账户向另一个账户转账。 1)先在数据库my…

UE4/UE5像素流送云推流|程序不稳定、弱网画面糊怎么办?

看到不少反馈说像素流送技术在实际的应用中,存在一些问题,比如程序崩溃、画面模糊等。本文将探讨这些问题,并介绍点量云流软件提供了哪些有效的解决方案。 常见的像素流送技术问题 画面质量问题: 当快速操作UE模型或初次启动像素…

LVS – NAT 模式集群构建

目录 1 环境准备 1.1 准备四台服务器 1.2 IP与网关均按照下图配置 1.3 网卡配置 1.4 real server 安装 web服务 1.5 安装ipvsadm 管理工具 2 使用ipvsadm管理LVS 2.1 创建集群指定使用的算法 2.2 添加真实服务器指定工作原理 2.3 查看是否正确创建集群 2.4 开启FORWARD路由转发…

专项测试——web测试

1、web测试的总体策略 2、web测试的范围 功能性能界面安全性兼容性DB文档 2.1 功能测试 功能测试主要从链接、表单、cookie、设计语言、数据库、文件上传等方面进行。 2.1.1 链接 2.1.2 表单 2.1.3 cookie cookie是什么? 服务器发送到用户浏览器并保存在用户本…

Lecture2——最优化问题建模

一,建模 1,重要性 实际上,我们并没有得到一个数学公式——通常问题是由某个领域的专家口头描述的。能够将问题转换成数学公式非常重要。建模并不是一件容易的事:有时,我们不仅想找到一个公式,还想找到一个…

Windows搭建nacos集群

Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 下载地址:Tags alibaba/nacos GitHub 链接:百度网盘 请输入提取码 提取码:8888 解压文件夹 目录说明&am…

Vue3中的常见组件通信之`$refs`、`$parent`

Vue3中的常见组件通信之$refs、$parent 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-mod…

webp2jpg网页在线图片格式转换源码

源码介绍 webp2jpg-免费在线图片格式转化器, 可将jpeg、jpg、png、gif、 webp、svg、ico、bmp文件转化为jpeg、png、webp、webp动画、gif文件。 无需上传文件,本地即可完成转换! 源码特点: 无需上传,使用浏览器自身进行转换批量转换输出we…

set与map的详细封装步骤

目录 一.set与map在STL中的源码 二.修改红黑树 1.插入与查找时的比较方式 2.插入时的返回值 3.补充成员函数 三.封装set与map 1.迭代器的实现 2.函数接口 3.map中的operator[] 四.完整代码 set.h map.h RBTree.h 一.set与map在STL中的源码 想要简单实现set与map 需…

【x264】变换量化模块的简单分析

【x264】变换量化模块的简单分析 1. 变换量化1.1 变换(transform)1.2 量化(quant) 2. 编码入口(x264_macroblock_encode)2.1 内部编码(macroblock_encode_internal)2.1.1 SKIP模式2.…

多源最短路径算法 -- 弗洛伊德(Floyd)算法

1. 简介 Floyd算法,全名为Floyd-Warshall算法,亦称弗洛伊德算法或佛洛依德算法,是一种用于寻找给定加权图中所有顶点对之间的最短路径的算法。这种算法以1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德的名字命名。 2. 核心思…