解说GaussDB DWS Roach进程fork状态管理

举报
亚中风风寒 发表于 2021/10/14 11:40:50 2021/10/14
【摘要】 我们清楚Roach的备份管理采用多进程模式,但是每个进程都是有多个线程组成的,每个线程都有两个状态管理变量,一个是线程状态,另一个是fork进程状态。线程状态管理相对好理解,那什么是fork进程管理?有什么作用,为什么要引入它。首先我们可以看到它有四个状态位,FORK_NOT_IN_PROGRESS,ABOUT_TO_FORK, READY_TO_FORK, FORK_DONE,即没有在fo...

我们清楚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。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。