多线程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> ...
计算机语言
未读构造时有无()的区别 当有()时,会将申请到的成员变量的空间初始化,没有时则不会
1234567891011121314151617#include <iostream>#include <stdio.h>using namespace std;class foo {public: //foo() { cout << "foo's constructor" << endl; } //~foo() { cout << "foo's destructor" << endl; } int a;};int main() { char buf[sizeof(foo)]; foo* a = new (buf) foo;//不会将申请到的int空间初始化 char buf2[sizeof(foo)]; foo* b = new (buf2) foo();//则会将申请到的int空间初始化为0。 pr ...
计算机语言
未读brpc-http:proto的使用官方文档:https://brpc.apache.org/zh/docs/client/access-grpc/issues:https://github.com/apache/brpc/issues/1647
他实际上会先解析http的头部的 Content-Type 字段当Content-Type 中的值为,application/x-protobuf,application/proto,application/grpc 时,他将以protobuf来解析http的包体而其他情况将会 将其以其他情况解析(默认json)源码片段
12345678910111213141516171819202122232425262728293031323334if (ct.starts_with("grpc")) { if (ct.size() == (size_t)4 || ct[4] == ';') { if (is_grpc_ct) ...
code-server 安卓手机termux环境搭建在这里是使用的termux这个app。如果手机没有root会有一些限制,比如说无法挂载磁盘,无法访问手机文件。但是跑一些服务是完全没有问题的。
先把termux下载好
安装ssh查看ip
12345678910111213141516# 安装ssh相关依赖 pkg install opensslpkg install openssh# 创建ssh密钥ssh-keygen -Assh-keygen# 设置密码passwd# 查看用户名和ipwhoamiifconfig# 开启ssh服务sshd
code-server安装官方文档https://coder.com/docs/code-server/latest/termux
1234567891011121314151617# 先在电脑上用 ssh连接上手机 (在电脑端链接手机敲太难受了)ssh username@ip -p 8022# 安装相关依赖pkg install -y tur-repo python python3pkg install -y code-servertermu ...
ngnix引用自大佬的博客:https://www.cnblogs.com/hanease/p/15890509.html
基本命令1234nginx -t 检查配置文件是否有语法错误nginx -s reload 热加载,重新加载配置文件nginx -s stop 快速关闭nginx -s quit 等待工作进程处理完成后关闭
默认配置123456789101112131415161718192021222324252627282930313233343536373839# 工作进程的数量worker_processes 1;events { worker_connections 1024; # 每个工作进程连接数}http { include mime.types; default_type application/octet-stream; # 日志格式 log_format access '$remote_addr - ...









