GPDB中Latch等待与唤醒实现机制

简介: GPDB中Latch等待与唤醒实现机制

GPDB中Latch等待与唤醒实现机制GreenPlum/PostgreSQL中有很多Latch以帮助多进程以及主线程与从线程之间协作。那么Latch是如何实现的呢?Latch可以在多进程之间以及主线程和从线程之间实现等待与唤醒,WaitEventSet是实现这项功能的关键结构。本文我们聊聊WaitEventSet的实现以及一个用法。


1、WaitEventSet的结构


1WaitEventSet用于管理注册的事件,nevens表示注册的事件个数,nevents_space表示该Set最多可以管理事件个数,比如WaitLatchOrSocket函数中这个变量值为3,仅可以管理事件WL_LATCH_SETWL_POSTMASTER_DEATHWL_EXIT_ON_PM_DEATH。可以设置的事件包括以下几种:

  • WL_LATCH_SET:等待latchset
  • WL_POSTMASTER_DEATH:等待postmaster die
  • WL_SOCKET_READABLE:等待socket可读
  • WL_SOCKET_WRITEABLE:等待socket可写
  • WL_EXIT_ON_PM_DEATHpostmaster死了后立即退出。AddWaitEventToSet函数中可以看到若事件WL_EXIT_ON_PM_DEATH则立即改成WL_POSTMASTER_DEATH,也就是说在postmaster进程挂了后可以探测到,并退出。

epoll_fdepoll实例的文件描述符。latch:如果事件有WL_LATCH_SET,则该latch为需要等待latch。通过is_set来实现等待。epoll_ret_event[]数组:epoll_wait将发生的事件集合从内核复制到该数组中。2WaitEvent表示注册的事件,pos表示该事件位于events[]数组的第几个;fd为事件相关的socket fd,也就是监听这个fd上的事件;events即为需要监听的事件。3WaitEvent使用的函数顺序为:

  • CreateWaitEventSet
  • AddWaitEventToSet
  • WaitEventSetWait
  • FreeWaitEventSet

下面依次介绍下这几个函数是干什么的。


2、CreateWaitEventSet


WaitEventSet使用前当然需要先创建,这件事就由函数CreateWaitEventSet来完成。该函数在当前内存上下文中为n个事件(个数为函数入参)申请内存空间,并进行初始化。GPDB中使用epoll来实现事件的等待与唤醒,该函数也会调用epoll_create来打开一个epoll文件描述符,创建一个epoll实例。


3、AddWaitEventToSet


添加事件到WaitEventSet中。并调用epoll_ctl函数将想要监听的文件描述符添加到epoll实例中。

4、WaitEventSetWait


等待注册的事件发生。调用epoll_wait函数来监听epoll上注册的事件。如果没有任何IO事件,则一直被阻塞,直到有IO事件发生。


5、FreeWaitEventSet


关闭epoll文件描述符,释放WaitEventSet


6、以master motion接收端receiveChunksUDPIFC为例


epoll如何与管道协作,来实现WaitEventSet的等待与唤醒呢?


1fork出一个子进程时,子进程会将父进程继承的管道关闭掉。然后自己重新创建一个管道。得到2fdpipefd[0]用于读取写入管道的内容,pipefd[1]用于向管道写入。通过全局变量selfpipe_readfdselfpipe_writefd分别表示读和写fd。当然,这是用于同一个进程不同线程之间进行管道通信。2)将管道的selfpipe_readfdepollEPOLLIN事件注册到epoll实例中,当主进程进入epoll_wait等待时,一旦监听到管道的selfpipe_readfd端可读,也就是管道中被写入了东西,就唤醒,退出等待。3receiveChunksUDPIFC用于接收segment发来的数据,当然这是UDPIFC模式下使用。若连接上没有数据,则将WL_LATCH_SETWL_TIMEOUT注册到epoll实例中4WaitLatchOrSocket用于创建epoll实例并注册监听事件。(1)首先调用Create_WaitEventSet->epoll_create创建一个epoll实例(2)WL_TIMEOUT时,timeoutMAIN_THREAD_COND_TIMEOUT_MS250ms,也就是epoll_wait的超时时间是250ms。若无指定WL_TIMEOUTtimeout值为-1,表示epoll_wait阻塞等待,一直等到被唤醒。(3)指定WL_LATCH_SET时,WaitEventSet.latch被设置成ic_control_info.latch,并通过epoll_ctl监听数据的到来(4)本案例中,共注册3WaitEvent,这里关注第一个,也就是selfpipe_readfd管道上的EPOLLERREPOLLHUPEPOLLIN33个事件。接收数据的线程rxTreadFunc接收到数据后会向管道写1个字节数据,从而被epoll监听到,以退出epoll_wait。这样完成没数据到来时等待,有数据到来时就唤醒的功能:

目录
相关文章
|
编解码
MATLAB | 科研绘图第十七期双Y轴图
MATLAB | 科研绘图第十七期双Y轴图
235 0
|
存储 JSON Go
Go语言学习 - RPC篇:深入gRPC-Gateway-探索常用数据类型
今天,我们先迈出第一步:探索RPC服务中的数据类型。掌握常见的数据类型,灵活地运用到接口设计中,能帮助我们快速地提供优雅的接口类服务。
258 0
|
数据采集 人工智能 文字识别
如何绕过Captcha并使用OCR技术抓取数据
在现代网页数据抓取中,Captcha作为一种防止爬虫和恶意访问的措施,广泛应用于各种网站。本文介绍如何使用OCR技术绕过文字Captcha,并通过代理IP技术提高爬虫的隐蔽性。具体实现包括下载Captcha图片、使用Tesseract OCR识别文字、通过代理IP抓取目标数据。示例代码展示了如何抓取大众点评的商家信息。
492 0
如何绕过Captcha并使用OCR技术抓取数据
|
存储 NoSQL 算法
Go 分布式令牌桶限流 + 兜底保障
Go 分布式令牌桶限流 + 兜底保障
|
存储 网络协议 大数据
一文读懂RDMA: Remote Direct Memory Access(远程直接内存访问)
该文档详细介绍了RDMA(远程直接内存访问)技术的基本原理、主要特点及其编程接口。RDMA通过硬件直接在应用程序间搬移数据,绕过操作系统协议栈,显著提升网络通信效率,尤其适用于高性能计算和大数据处理等场景。文档还提供了RDMA编程接口的概述及示例代码,帮助开发者更好地理解和应用这一技术。
|
自然语言处理 索引
Elasticsearch 常用查询语句大全
【7月更文挑战第8天】Elasticsearch 常用查询语句大全
|
Java
【Java】已解决java.util.ConcurrentModificationException异常
【Java】已解决java.util.ConcurrentModificationException异常
1072 0
|
SQL 安全 数据挖掘
隐私计算实训营第7讲:隐语SCQL的架构详细拆解丨隐私计算实训营 第1期
SCQL是安全协作查询语言,让不信任的多方能在保护隐私的前提下进行联合数据分析。它假设参与者半诚实,支持多方(N>=2)合作,且具备SQL语法支持和性能优化。SCQL提供类似SQL的用户界面,通过CCL机制允许数据所有者控制数据使用权限。系统基于SPU的MPC框架运行,适用于多个应用场景。
466 0
|
Java 数据安全/隐私保护
Java基础之方法
Java基础讲解了方法作为代码逻辑封装的单元,存在于类中。方法通过方法名、参数列表和返回类型定义,可重用且能执行特定任务。方法重载允许同一类中同名但参数不同的方法,而方法重写在继承时用于子类定制父类方法。方法签名包括方法名和参数列表,是识别方法的依据。了解这些概念对于初级面试至关重要。
118 0
|
JavaScript
深入理解 uni-app 页面生命周期(二):onReady()
深入理解 uni-app 页面生命周期(二):onReady()
906 0