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。这样完成没数据到来时等待,有数据到来时就唤醒的功能:

目录
相关文章
Go语言学习 - RPC篇:深入gRPC-Gateway-探索常用数据类型
今天,我们先迈出第一步:探索RPC服务中的数据类型。掌握常见的数据类型,灵活地运用到接口设计中,能帮助我们快速地提供优雅的接口类服务。
167 0
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)(上)
史上最全干货!Kubernetes 原理+实战总结(全文6万字,90张图,100个知识点)
47628 30
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
1144 0
ClkLog 实践中的挑战:如何设计和实施有效的埋点指标
前端数据埋点要怎么做才能获取到有用的数据并对运营产生积极的作用,对于首次实施埋点及数据分析的工程师来说确实是个难点。网上很多文章讲的都是方法论和理论知识,真正实践的内容比较少,我们从一个案例来描述一下埋点要如何做。
ClkLog 实践中的挑战:如何设计和实施有效的埋点指标
【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)
【uniapp】sigmob广告加载失败:-5005、500422没有imei的解决办法(原创可用)
288 1
|
12月前
|
【Java】已解决java.util.ConcurrentModificationException异常
【Java】已解决java.util.ConcurrentModificationException异常
514 0
隐私计算实训营第7讲:隐语SCQL的架构详细拆解丨隐私计算实训营 第1期
SCQL是安全协作查询语言,让不信任的多方能在保护隐私的前提下进行联合数据分析。它假设参与者半诚实,支持多方(N>=2)合作,且具备SQL语法支持和性能优化。SCQL提供类似SQL的用户界面,通过CCL机制允许数据所有者控制数据使用权限。系统基于SPU的MPC框架运行,适用于多个应用场景。
300 0
Java基础之方法
Java基础讲解了方法作为代码逻辑封装的单元,存在于类中。方法通过方法名、参数列表和返回类型定义,可重用且能执行特定任务。方法重载允许同一类中同名但参数不同的方法,而方法重写在继承时用于子类定制父类方法。方法签名包括方法名和参数列表,是识别方法的依据。了解这些概念对于初级面试至关重要。
67 0
安谋科技(Arm China)别再平:Arm Neoverse 软件生态介绍
2023年8月15日,系列课程第二节《Arm Neoverse 软件生态介绍》正式上线,由安谋科技(Arm China)高级软件经理别再平主讲,内容涵盖:Arm Neoverse 介绍,Arm Neoverse 软件生态系统,Arm Neoverse 软件迁移。
安谋科技(Arm China)别再平:Arm Neoverse 软件生态介绍
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问