解说GaussDB DWS Roach进程fork状态管理
我们清楚Roach的备份管理采用多进程模式,但是每个进程都是有多个线程组成的,每个线程都有两个状态管理变量,一个是线程状态,另一个是fork进程状态。线程状态管理相对好理解,那什么是fork进程管理?有什么作用,为什么要引入它。
首先我们可以看到它有四个状态位,FORK_NOT_IN_PROGRESS,ABOUT_TO_FORK, READY_TO_FORK, FORK_DONE,即没有在fork进程,即将fork进程,准备fork进程和fork进程结束四个标志状态位。从字面意思来看就是等待进程的创建,进程创建完成后,所有线程才可以进行其它活动。
其次从代码分析,可以看出来,主进程在创建一个线程的时候fork state置为FORK_NOT_IN_PROGRESS,主进程在准备创建线程前将主进程的所有线程的fork state设置为ABOUT_TO_FORK,即告知所有线程,我马上要进行fork进程,而其它线程在工作时会调用wait4Fork检查fork state标志位,若发现标志位是ABOUT_TO_FORK,则将自己置为READY_TO_FORK,进而进入while等待循环中,直到自己的状态位变为FORK_NOT_IN_PROGRESS或者FORK_DONE,才进行后续的工作(当然肯定是包含logger线程)。
最后我们再次看主进程fork进程的代码,主进程fork之前设置所有线程的fork标志位为ABOUT_TO_FORK,进程fork后将所有线程的标志位置为FORK_NOT_IN_PROGRESS,也就是说主进程fork线程完成后所有线程都可以继续正常工作了。
举个栗子:
Logger线程的日志队列当前满了,此时主进程fork子进程,创建进程时若打印log,则直接回卡主,愿意就是向日子队列写日志时候发现日志队列满了,刚好在fork进程必然,就需要等待在wait4Fork。
- 点赞
- 收藏
- 关注作者
评论(0)