首页 > 其他分享 >GPDB中Latch等待与唤醒实现机制

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

时间:2023-10-25 21:32:50浏览次数:37  
标签:等待 epoll GPDB WL WaitEventSet 管道 事件 Latch 唤醒

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

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

1、WaitEventSet的结构

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

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

WL_LATCH_SET:等待latch被set

WL_POSTMASTER_DEATH:等待postmaster die

WL_SOCKET_READABLE:等待socket可读

WL_SOCKET_WRITEABLE:等待socket可写

WL_EXIT_ON_PM_DEATH:postmaster死了后立即退出。AddWaitEventToSet函数中可以看到若事件WL_EXIT_ON_PM_DEATH则立即改成WL_POSTMASTER_DEATH,也就是说在postmaster进程挂了后可以探测到,并退出。

epoll_fd为epoll实例的文件描述符。

latch:如果事件有WL_LATCH_SET,则该latch为需要等待latch。通过is_set来实现等待。

epoll_ret_event[]数组:epoll_wait将发生的事件集合从内核复制到该数组中。

2)WaitEvent表示注册的事件,pos表示该事件位于events[]数组的第几个;fd为事件相关的socket fd,也就是监听这个fd上的事件;events即为需要监听的事件。

3)WaitEvent使用的函数顺序为:

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的等待与唤醒呢?

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

1)fork出一个子进程时,子进程会将父进程继承的管道关闭掉。然后自己重新创建一个管道。得到2个fd。pipefd[0]用于读取写入管道的内容,pipefd[1]用于向管道写入。通过全局变量selfpipe_readfd和selfpipe_writefd分别表示读和写fd。当然,这是用于同一个进程不同线程之间进行管道通信。

2)将管道的selfpipe_readfd及epoll的EPOLLIN事件注册到epoll实例中,当主进程进入epoll_wait等待时,一旦监听到管道的selfpipe_readfd端可读,也就是管道中被写入了东西,就唤醒,退出等待。

3)receiveChunksUDPIFC用于接收segment发来的数据,当然这是UDPIFC模式下使用。若连接上没有数据,则将WL_LATCH_SET、WL_TIMEOUT注册到epoll实例中

4)WaitLatchOrSocket用于创建epoll实例并注册监听事件。

(1) 首先调用Create_WaitEventSet->epoll_create创建一个epoll实例

(2) WL_TIMEOUT时,timeout为MAIN_THREAD_COND_TIMEOUT_MS即250ms,也就是epoll_wait的超时时间是250ms。若无指定WL_TIMEOUT则timeout值为-1,表示epoll_wait阻塞等待,一直等到被唤醒。

(3) 指定WL_LATCH_SET时,WaitEventSet.latch被设置成ic_control_info.latch,并通过epoll_ctl监听数据的到来

(4) 本案例中,共注册3个WaitEvent,这里关注第一个,也就是selfpipe_readfd管道上的EPOLLERR、EPOLLHUP、EPOLLIN33个事件。接收数据的线程rxTreadFunc接收到数据后会向管道写1个字节数据,从而被epoll监听到,以退出epoll_wait。这样完成没数据到来时等待,有数据到来时就唤醒的功能:

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

标签:等待,epoll,GPDB,WL,WaitEventSet,管道,事件,Latch,唤醒
From: https://blog.51cto.com/yanzongshuai/8025535

相关文章

  • nRF52840 SYSTEM OFF模式下唤醒的唤醒方式
    参考spec上的说明,唤醒源有5个。分别是:1.GPIO外设发出的DETECT信号2.LPCOMP模块发出的ANADETECT信号3.NFC模块发出的SENSE信号4.USB模块VBUSpin出现有效电压时5.给复位管脚一个信号供参考示例在如下工程中,NCS示例有待再发现\nRF5_SDK_17.1.0\examples\peripheral......
  • 《面试1v1》CountDownLatch 和 CyclicBarrier
    我是javapub,一名Markdown程序员从......
  • 关于低功耗模式下RTC唤醒
    1、关于RTC唤醒失败解决方法问题原因:若使用RTC进行唤醒唤醒不成功,闹钟中断标志没有被置位。原因可能是唤醒信号有毛刺,EXTI系统唤醒,但RTC来不及产生中断标志。解决方法:RTC闹钟中断中判断的标志由RTC_IT_ALR,更改为EXTI_Line17中断标志,需要在中断函数中清17中断线标志。 2、关于......
  • CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?
    一、CyclicBarrier和CountDownLatch有什么区别?两者最核心的区别:CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程二、Semaphore(信号量)Sema......
  • Java并发工具类CountDownLatch(倒计数器)
    CountDownLatch,倒计数器,有两个常见的应用场景:场景1:协调子线程结束动作:等待所有子线程运行结束CountDownLatch允许一个或多个线程等待其他线程完成操作。例如,我们很多人喜欢玩的王者荣耀,开黑的时候,得等所有人都上线之后,才能开打。CountDownLatch模仿这个场景:创建大乔、兰陵王、安......
  • Win11系统如何设置电脑睡眠唤醒时需要输入密码?
       ......
  • 网络唤醒后,计算机无法关机,任然被唤醒。
    在使用openwrt网络唤醒功能后,唤醒计算机后,关机休眠等操作后,会被再次唤醒。将网线从计算机网口拔出,再次关机操作后,等待完全关机,插上网线没有被唤醒。那么是网卡设置有问题,对网络中的唤醒进行识别。计算机管理-->网络适配器--找到唤醒的网卡,点击右键属性--电源管理。 全部勾......
  • CountDownLatch、CyclicBarrier、Semaphore面试讲解
    @TOC<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">这三个也是面试常问的,作为线程通信的方法1.CountDownLatch(CDL)主要是用于一个线程等待其他完成后才继续执行。主要方法:await()、countDown()CountDownLatchcdl=newCountDownLatch(2);//第一......
  • JUC工具类CountDownLatch、CyclicBarrier、Semaphore介绍
    CountDownLatch:它是一种同步工具,用于控制一个或多个线程等待其他线程完成操作后再继续执行。它的作用是让某个线程等待一组操作执行完成,再继续执行自己的任务。CountDownLatch内部有一个计数器,当计数器的值为0时,等待的线程将会被唤醒。通过CountDownLatch的构造函数可以指定计......
  • CH32V203的USBFS在主机和设备下的低功耗唤醒注意事项
    1.如果使用WFE睡眠,醒来后无需重新打开外设时钟;2.如果使用STOP模式睡眠,醒来后需要重新打开外设时钟。 USBFS_RCC_Init();3.STANDBY需要进入之前设置成IO(PB6.PB7)为外部事件,醒来之后设备复位(待机模式唤醒后复位),重新枚举USB。具体配置如下:voidSleep_WakeUp_Deal(){EXTI_Init......