FreeRTOS简单使用迁移迁移真的遇到好多坑,最多的还是中断优先级的问题,优先级太高的中断会破坏FreeRTOS的调度,所以与FreeRTOS调度相关的中断优先级必须高于其他中断
配置在 Cortex-M 架构中,优先级数值越小,优先级越高。FreeRTOS的配置主要集中在FreeRTOSConfig.h文件中,但是感觉最重要的配置是
1234567891011121314/* configKERNEL_INTERRUPT_PRIORITY sets the priority of the tick and context * switch performing interrupts. Not supported by all FreeRTOS ports. See * https://www.freertos.org/RTOS-Cortex-M3-M4.html for information specific to * ARM Cortex-M devices. */#define configKERNEL_INTERRUPT_PRIORITY (15 &l ...
Linux常用命令,比如free strace netstat iostat top等
free:显示内存使用情况。
strace:跟踪系统调用。
netstat:显示网络连接。
iostat:显示CPU和I/O设备使用情况。
top:显示系统运行情况。
Linux子进程,fork的返回值,多线程下fork的风险和规避,子进程内存何时复制
fork:创建子进程,返回值为0表示子进程,正数表示父进程。
多线程下fork的风险:子进程只复制调用fork的线程,可能导致死锁。
规避方法:使用pthread_atfork注册处理函数。
子进程内存复制:写时复制(Copy-On-Write)。
Linux的负载 (uptime 命令查看的东东)uptime:显示系统运行时间、登录用户数、系统负载。
系统负载:表示系统的繁忙程度,通常为1分钟、5分钟、15分钟的平均负载。
性能问题定位(brpc文档有讲)使用perf、strace、gdb等工具定位性能问题。
perf:性能分析工具,分析CPU使用情况。
strace:跟踪系统调用,分析程序行为。
gdb:调试工具,分析 ...
C++多态、重载、覆写
多态:通过基类指针调用派生类方法。
重载:同名函数不同参数。
覆写:派生类重写基类虚函数。
STL的常用容器vector、list、deque、set、map、unordered_map等。
vector:动态数组,支持随机访问。
list:双向链表,支持快速插入、删除。
deque:双端队列,支持快速插入、删除。
set:有序集合,支持快速查找。
map:有序键值对集合,支持快速查找。
unordered_map:无序键值对集合,支持快速查找。
迭代器失效,如何遍历删除
迭代器失效:容器修改导致迭代器失效。
遍历删除:使用erase方法,更新迭代器。
特化与偏特化,简单了解如何使用元编程(比如使用特化和偏特化实现递归)
特化:为特定类型提供模板实现。
偏特化:为部分类型提供模板实现。
虚函数表,多继承下虚函数表指针
虚函数表:存储虚函数指针的表。
多继承:每个基类有一个虚函数表指针。
析构和构造顺序
构造顺序:基类先构造,派生类后构造。
析构顺序:派生类先析构,基类后析构。
智能指针std::unique_ptr、std::shared_pt ...
分布式负载均衡算法轮询、加权轮询、最小连接数、一致性哈希等。
轮询:按顺序将请求分配给每个服务器。
加权轮询:根据服务器权重分配请求。
最小连接数:将请求分配给连接数最少的服务器。
一致性哈希:根据请求的哈希值分配服务器,减少节点变动影响。
分布式事务算法,比如Raft, Paxos
Raft:一致性算法,易于理解和实现。
特点:通过选举、日志复制、日志提交保证一致性。
适用场景:分布式系统中的一致性问题。
Paxos:一致性算法,复杂但性能好。
特点:通过提议、投票、提交保证一致性。
适用场景:分布式系统中的一致性问题。
Hash环与分布式缓存
一致性哈希:解决节点动态变化的问题,减少数据迁移。
特点:将数据分配到多个节点,节点变动时只影响部分数据。
适用场景:分布式缓存、分布式存储。
分布式缓存:将缓存分布到多个节点,提高性能和可用性。
特点:数据分布在多个节点,支持高并发访问。
适用场景:高并发、高性能的应用,如电商系统。
利特尔法则,及其应用利特尔法则:L = λW,用于分析排队系统。
L:系统中的平均数量。
λ:平均到达率。
W:平 ...
多线程Linux中锁的种类(自旋锁 临界区 递归锁 悲观锁 乐观锁等)
自旋锁:忙等待锁,适用于锁持有时间短的场景。
临界区:保护共享资源的代码块,防止并发访问。
递归锁:允许同一线程多次加锁,防止死锁。
悲观锁:假设会发生冲突,操作前加锁。
乐观锁:假设不会发生冲突,提交时检查冲突。
条件变量 虚假唤醒
条件变量:用于线程间同步,等待特定条件满足。
虚假唤醒:线程被唤醒但条件未满足,需重新检查条件。
CAS与无锁数据结构(主要是无锁单向链表和ringbuffer)
CAS:比较并交换,用于实现无锁数据结构。
无锁单向链表:使用CAS操作实现,避免锁竞争。
RingBuffer:环形缓冲区,用于高效数据传输,避免锁竞争。
线程和协程的区别
线程:操作系统调度,开销较大,适用于并发任务。
协程:用户态调度,开销较小,适用于高并发任务。
双缓冲 (Double Buffering)使用两个缓冲区交替工作,提高数据处理效率。
特点:一个缓冲区用于读操作,另一个缓冲区用于写操作。
适用场景:图形渲染、数据流处理。
内存屏障防止编译器和CPU重排序,保证内存操作顺序。
特点 ...
开源框架或组件消息队列Kafka、RabbitMQ、ActiveMQ等。
Kafka:高吞吐量、分布式消息队列。
RabbitMQ:支持多种协议、灵活的消息队列。
ActiveMQ:支持JMS、持久化的消息队列。
BRPC百度开源的RPC框架。
特点:高性能、易用、支持多种协议。
适用场景:分布式系统、微服务架构。
Redis内存数据库,支持多种数据结构。
特点:高性能、支持持久化、丰富的数据结构。
适用场景:缓存、消息队列、排行榜。
Nginx高性能HTTP服务器和反向代理服务器。
特点:高并发、低内存占用、模块化设计。
适用场景:Web服务器、反向代理、负载均衡。
Zookeeper分布式协调服务。
特点:高可用、强一致性、支持临时节点。
适用场景:分布式锁、配置管理、服务发现。
应用场景如何构建一个秒杀系统高并发处理、限流、缓存、异步处理等。
高并发处理:使用负载均衡、分布式缓存、数据库分库分表。
限流:使用令牌桶、漏桶算法,防止系统过载。
缓存:使用Redis缓存热点数据,减轻数据库压力。
异步处理:使用消息队列、异步任务,减少请求 ...
数据库MySQL常用的存储引擎,如何根据应用场景选择
InnoDB:支持事务、外键,适用于高可靠性需求的应用。
特点:支持ACID事务、行级锁、外键约束。
ACID是衡量事务的四个特性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
适用场景:需要高并发、数据一致性的应用,如金融系统。
MyISAM:不支持事务,适用于读多写少的应用。
特点:不支持事务、表级锁、存储空间小。
适用场景:读操作多于写操作的应用,如数据仓库。
Memory:数据存储在内存中,适用于需要快速访问的数据。
特点:数据存储在内存中,访问速度快,断电数据丢失。
适用场景:需要快速访问的数据,如缓存表、临时数据。
乐观锁和悲观锁乐观锁:假设不会发生冲突,提交时检查冲突。
实现方式:版本号机制、时间戳机制。
适用场景:读多写少的场景,冲突概率低。
悲观锁:假设会发生冲突,操作前加锁。
实现方式:数据库锁机制(行锁、表锁)。
适用场景:写操作多的场景,冲突概率高。
MySQL多版本控制(MVCC)通过保存数 ...
数据结构和算法红黑树(map)一种自平衡二叉搜索树,保证插入、删除、查找操作的时间复杂度为O(log n)。
特点:每个节点有红黑两种颜色,根节点为黑色,红色节点的子节点为黑色,任意节点到叶子节点的路径上黑色节点数量相同。
适用场景:需要快速查找、插入、删除操作的应用,如关联容器map、set。
Hash表的实现(能手写)通过数组和链表实现,解决冲突的方法有链地址法、开放地址法。
链地址法:每个数组元素是一个链表,冲突时将元素插入链表。
开放地址法:冲突时寻找下一个空闲位置,常用方法有线性探测、二次探测、双重散列。
树的遍历(深度优先和宽度优先)
深度优先:前序、中序、后序遍历。
前序遍历:根节点 -> 左子树 -> 右子树。
中序遍历:左子树 -> 根节点 -> 右子树。
后序遍历:左子树 -> 右子树 -> 根节点。
宽度优先:层次遍历。
层次遍历:按层次从上到下、从左到右遍历节点。
跳跃表的实现一种随机化的数据结构,支持快速查找、插入、删除操作。
特点:在有序链表的基础上增加多级索引,索引层数随机生成。
适用场景 ...
网络UDP和TCP的区别UDP(用户数据报协议) 是无连接的,不保证数据包的顺序和完整性,适用于实时应用。UDP的特点:
无连接:不需要建立连接即可发送数据。
不可靠:不保证数据包的顺序和完整性,可能丢包。
速度快:由于没有连接建立和确认机制,传输速度较快。
适用场景:实时视频、音频传输,在线游戏等。
TCP(传输控制协议) 是面向连接的,保证数据包的顺序和完整性,适用于需要可靠传输的应用。TCP的特点:
面向连接:在传输数据前需要建立连接(三次握手)。
可靠传输:通过确认机制、重传机制保证数据包的顺序和完整性。
流量控制和拥塞控制:通过滑动窗口、拥塞控制算法防止网络拥塞。
适用场景:文件传输、邮件、网页浏览等。
三次握手和四次挥手三次握手:建立TCP连接的过程,确保双方都准备好进行通信。
客户端发送SYN包(同步序列编号)请求建立连接。
服务器收到SYN包,回复SYN-ACK包(确认同步序列编号)。
客户端收到SYN-ACK包,发送ACK包(确认序列编号),连接建立。
四次挥手:断开TCP连接的过程,确保双方都同意断开连接。
客户端发送FIN包(结束标志)请求断 ...
多态内存资源文章说得很详细(虽然我还是不怎么懂,做个笔记吧)https://github.com/MeouSker77/Cpp17/blob/master/markdown/src/ch29.md
多态分配器这玩意最直接的用法就是控制容器的内存,打个比方在我使用vector容器时一般情况下会这么用
1234567891011121314#include<iostream>#include <vector>using namespace std;class node{public: node(){ cout << "build node!" <<endl; }};int main(){ vector<node> arr; arr.resize(10); return 0;}
不难发现这个这个类构造了10个对象,但是众所周知vector 存储元素的实际位置是在堆上,并且vector在资源不足时会自动进行扩容以 ...
惊群效应惊群问题
惊群问题是计算机科学中,当许多进程等待一个事件,事件发生后这些进程被唤醒,但只有一个进程能获得CPU执行权,其他进程又得被阻塞,这造成了严重的系统上下文切换代价。
解决办法
不希望把所有进程都唤醒,就采用定点唤醒某一个进程的做法
比如说C++在std::condition_variable满足条件,线程唤起时,其实际上并不会唤起所有等待的线程,而是随机唤起一个正在等待的线程。这样做的达到的结果跟唤起所有线程一起争抢锁资源的结果一样,但是可以很大程度上避免系统上下报文的切换
尽量避免进程上下文切换。
采用合适的任务分配策略,减少正在等待线程的数量
参考资料 https://zh.wikipedia.org/wiki/%E6%83%8A%E7%BE%A4%E9%97%AE%E9%A2%98
拓展资料nginx是如何解决惊群效应的https://segmentfault.com/a/1190000044210775
虚假唤醒https://zhuanlan.zhihu.com/p/652823880https://www.cnblogs.com/angdh/p/18267978https://cloud.tencent.com/developer/article/1557403
应用层引起的虚假唤起这种虚假唤起是由不合理的代码逻辑引起的,具体看代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <condition_variable>#include <iostream>#include <thread>#include <queue>#include <string>using namespace std::chrono_literals;std::condition_variable cv;std::mutex mtx;std::queue<std::string> ...









