谁能解释下C语言哨兵的原理,为什么加入哨兵后就能判断是否越界?最好用代码举例解释!

谁能解释下C语言哨兵的原理,为什么加入哨兵后就能判断是否越界?最好用代码举例解释!,第1张

所谓“哨兵”就是用一个特殊值来作为数组的边界,使用“哨兵”可以少用一条判断语句,所以可以提高程序的效率。

比如从整数数组arr中,查找有没有整数num。

应用:假设一个乱序数组,需要查找一个元素是否在该数组中,这时需要用到顺序查找,也就是遍历数组。

一般情况下我们会写下如下代码:

int Sequential_Search(int *a,int n,int key)

{

//数组从1开始

int i

for(int i=1i<=ni++)

{

if(a[i]==key)

return i

}

return 0//查找失败

}

有的数据结构书上,会运用哨兵元素,改成这样的代码:

int Sequential_Search2(int *a int n,int key)

{

int i=0

a[0]=key//哨兵

i=n

while(a[i]!=key)

{

i--

}

return i//返回0就是查找失败

}

int array[] = {1,2}只定义了两个元素,而这里array[2] = 3所以奔溃,数组一旦定义申请了内存大小,就不允许改变,除过使用动态数组。

哨兵值主要用来做遍历,比如STL中的vector,end返回指向最后一个值的下一个内存地址,这样通过测试是否指向该指针,就可以判断是否遍历结束,尤其在给函数传一个数组指针时候,这时候sizeof只能得到指针长度,得不到数组的长度,利用哨兵值,可以很容易判断长度

Sentinel(哨兵)进程的作用:

1.监控(Monitoring): sentinel会不断地检查你的Master和Slave是否运作正常

2.提醒(Notification):当被监控的某个Redis节点出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知

3.自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移 *** 作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master;当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断

客观下线 (Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的服务器下线判断。(一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)

https://www.cnblogs.com/JJY-/articles/12066861.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7952411.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存