windows守护进程与进程同步

在一些服务器应用中,守护进程经常被用到,用于与主进程交互或同步数据等。例如,一些应用需要非常频繁地操作数据,为了减小数据库服务器的压力,有时会在内存中对数据库表进行映射,通常的操作都是在内存中进行,然后用一定的策略将内存中的数据库同步到数据库中存储。这样的架构可以提升性能,可以说是用内存空间换时间,特别对于大型应用很有效。但是,这样也存在一定的风险,毕竟不能完全保证服务器一直稳定地运行,当这个用于管理的数据服务器突然宕机,或者停电之类的突发情况,内存数据还没来得及同步到数据库中就消失了,会造成部分数据丢失。我们不能因此而停止优化的脚步,因为即使是实时写数据库的策略在停电的情况下也会导致数据丢失,我们能做的就是在数据丢失率和性能之间找到一个平衡点。所以,这里讨论的是采用缓存策略的服务器架构下,采用守护进程来减小服务器宕机导致的数据丢失率。对于停电情况不讨论,因为你可以加装一个备用发电机或蓄电池之类的东西,这不在程序的可控范围。

说到守护进程,很多人一定会想到Unix系统的Daemon进程或者windows的服务,这些都是很好的解决方案。这里要讨论的是实施简便的一般守护进程,类似于Unix的Daemon进程,不是windows服务。

我们假设有这样的需求:主服务程序启动时启动守护进程,当服务器程序宕机的时候,守护进程有两套解决方案:1、守护进程将主服务程序在内存中的数据进行写数据库操作,保存数据。2、守护进程一直运行,等待主服务进程启动,以便让主服务程序再次接管那片内存,从而不丢失数据。很明显,这里要用到共享内存。

对于方案一,一般流程可以如下:

1、启动主进程,检查是否是唯一例程,如果不是则退出

2、启动守护进程,等待守护进程初始化

3、守护进程检查是否唯一例程,如果不是则关闭已运行的例程后退出。否则初始化,给主进程发送初始化成功的同步消息,等待主进程共享内存初始化

4、主进程继续初始化共享内存,发送共享内存初始化成功的同步信息

5、守护进程获取共享内存句柄,等待主进程退出

6、主进程继续初始化其他东西,并正常运行

7、主进程如果正常退出,则将共享内存中的数据存储并清空。

8、守护进程检测到主进程退出,则判断共享内存中是否有需要保存的数据,如果有则保存,退出。

对于方案二,一般流程可以如下:

1、启动主进程,检查是否唯一例程,如果不是则退出

2、检查守护进程是否存在,如果存在则获取共享内存句柄,保存共享内存数据,清空共享内存。否则跳至7

3、启动守护进程,等待守护进程初始化

4、守护进程初始化,给主进程发送初始化成功的同步消息,等待主进程共享内存初始化

5、主进程初始化共享内存,发送共享内存初始化成功同步消息

6、守护进程获取共享内存句柄,运行不退出。

7、主进程继续初始化其他东西,并正常运行

这个方案中,守护进程主要起到保护共享内存句柄的作用

在windows中可以用于进程间同步的有很多内核对象,如Event、Mutex、进程句柄等。

共享内存中可以保持数据库数据的一个映射,并用一个标记是否修改、是更新还是插入操作等。当然,共享内存也可以用其他的数据结构表示不同的操作,看需要确定。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值