聊聊Postgres中的IPC之SI Message Queue (4)

对于resetState设置为真的进程,函数ReceiveSharedInvalidMessages会调用resetFunction抛弃其所有的Cache元组。否则,ReceiveSharedInvalidMessages将从消息队列中读取每条无效消息并调用invalFunction对消息进行处理。如果该进程是根据SIGUSR1信号调用该函数,那么还将调用SICleanupQueue函数将这个信号传给比它进度慢的进程。

4.其他

在PMsignal.c中,包含后台进程向Postmaster发送信号的相关函数。在实现中,后台进程是这样通知Postmaster的:

1) 首先在共享内存中开辟一个数组PMSignalFlags(PMsignal.c),数组中的每一位对应一个信号。

2) 然后如果后台进程希望向Postmaster发送一个信号,那么后台首先将信号在数组PMSignalFlags中相应的元素置1 (逻辑真),然后调用kill函数向Postmaster发送SIGUSR1信号。

3) 当Postmaster收到SIGUSR1后首先检测共享存储中PMSignalFlags,确认具体的信号是什么。同时将信号在数组PMSignalFlags中相应的元素置0 (逻辑假)然后作出相应反应。

每一个后台进程都有一个结构PGPROC存储在共享内存中。Procarray.c在共享内存中分配ProcArrayStruct类型的数组procArray,统一管理这些PGPROC结构。PGPROC结构中包含很多的信息,Procarray.c中的函数主要处理 PGPROC中的 pid、databaseld、roleld、xmin、xid、subxids 等字段。这些函数的功能或是统计事务的信息,或是通过databaseId统计有多少个pid (也就是多少个后台进程)与指定数据库相连接等统计信息。

IPC负责的清除工作有两个方面:一个是与共享内存相关的清除,另一个是与各个后台进程相关的清除工作。与共享内存相关的淸除并不是将共享内存丢弃,而是重新设置共享内存。清除工作的流程可以描述如下:首先在申请资源的时候,系统会同时为该资源注册一个清除函数,当要求做清除操作时,系统将会调用对应的淸除函数。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgxx.html