指数补偿的定义:通过反馈,以指数的速度找到一个合适某个计算过程的因子
指数补偿指的是,在执行事件时,通过反馈,逐渐降低某个过程的速率,从而最终找到一个合适的速率(来处理事件)。指数补偿通常用于网络和传输协议,比如在进行网络连接时,如果第一次请求失败,那么可以等待 t_1 之后重试,如果再次请求还是失败,那么等待 t_2 之后重试。。。重试可以一直继续下去,或者等待次数或等待时间超过特定值为止。等待的时间 t_n 可以是随机选择,也可以随着重试的次数而逐渐加大,诸如此类。
维基百科的解释==》Exponential backoff
在《UNIX 环境高级编程,第二版》(APUE,2E) 16.4 节提供了一个带重试的 socket 连接程序, 如果连接失败, 那么程序就睡眠一段时间再尝试, 每失败一次睡眠的时间就延长一些
#include "apue.h" #includesocket.h> #define MAXSLEEP 128 int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen) { int nsec; for (nsec = 1; nsec < MAXSLEEP; nsec <<=1) { if (connect(sockfd, addr, alen) == 0) { / connect accepted. return 0; } if (nsec <= MAXSLEEP/2) sleep(nsec); } return -1; }
nsec<<=1是指数补偿体现;而if (nsec <= MAXSLEEP/2)则是截断的指数补偿概念