对于自行实现的很多服务,很多人喜欢用一个专门的监控进程来监控自己的服务,为了防止监控进程也崩掉,甚至使用了经典的双进程监控。不说别的,光编写调试这个双进程就够我喝一壶的啦,对于我这样专门写bug的家伙来讲,更是一件揪心的差事。就算有一天,我不再写bug了,可以操作系统的关卡你又过不了了,难关重重。这些监控程序,不管是单进程还是双进程,其根本肯定是一个big loop,而且这个big loop中几乎都要有一个sleep,否则CPU飙升,却不见得能给真正的服务,净给了这个big loop,就算没有sleep,你的cpu核心超级多,也不在乎钱,你可以专门买一个cpu来运行你这个monitor的big loop,然而在这次检测和下次检测之间的微小空隙里面还是会有很多事情可以发生的。比如下列的双进程序列:
- p1:while(true) {:t0
- status=monitor(p2):t1
- if(status == 0) {
- start(p2);
- }
- }:t2
- p2:while(true) {:t0’
- status=monitor(p1):t1’
- if(status == 0) {
- start(p1);
- }
- }:t2’