限流算法之漏桶、令牌桶
漏桶算法
把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。
可以看出,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。
1 |
|
令牌桶算法
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。
把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。
可以看出,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。
1 | #include <iostream> |
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。
在 Linux 内核中,0 号进程(也称为 idle 进程)是系统中唯一一个没有被正常进程显式创建的进程,它是在内核启动时创建的,负责消耗 CPU 时间,以保证系统不会浪费 CPU 资源。
1 号进程(也称为 init 进程)是 Linux 系统启动后第一个被创建的进程,它是所有进程的祖先进程。init 进程负责启动系统上其他进程和服务,并在系统关闭时关闭这些进程和服务。
2 号进程(也称为 kthreadd 进程)是一个守护进程,它是内核中的一个主要线程。它是内核线程的创建者,也是唯一的内核线程,其主要职责是协调内核中的各种子系统,如内存管理、进程管理、文件系统等。
需要注意的是,0 号进程、1 号进程和 2 号进程是内核级别的进程,它们不同于普通进程,不会被用户显式创建、销毁或操纵。
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。
缓存方案主要用于缓存用户定义的热点数据,用户可以通过缓存来获取数据,从而降低数据库的压力。
内存访问速度远大于磁盘访问速度,mysql缓存的数据跟业务无关,缓存的是最近操作的数据。mysql作为项目的主要数据库,缓存数据库只是辅助功能。
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最右边 节点的值。
假设二叉树中至少有一个节点。
完全二叉树的特点,即除了最后一层外,每一层都是满的,并且最后一层上的节点都集中在该层最左边的若干位置上。所以,如果我们按照层次遍历这个完全二叉树,最后遍历到的节点即为底层最右节点。
1 | #include <iostream> |
自旋锁是最基本的一种无锁技术,采用基于 CAS(Compare-and-Swap)的操作,尝试获取锁,失败时采用轮询的方式等待资源,避免线程被阻塞,不需要系统调用,从而减少上下文切换和性能损耗。
原子操作使用 CPU 提供的原子性指令,属于硬件层面的,实现数据的原子性访问和修改,避免使用锁导致的线程阻塞和竞争,同时也避免了死锁的发生。
加锁区执行速度快的情况下可以使用该锁。
atomic提供的常见方法:
C++11标准中提供了 std::atomic 模板类,用于实现原子操作,可用于实现 CAS 操作,从而实现无锁编程。
在非并发条件下,实现一个栈的Push操作,通常有如下操作:
系统梳理软件开发中常用的设计模式,深入解析策略模式、观察者模式、责任链模式等核心模式的实现原理与应用场景,提供完整的C++代码示例,帮助开发者掌握设计模式在实际项目中的灵活运用。
双指针相关题型
几个数之和系列