- 博客(43)
- 收藏
- 关注
原创 怎么设计一个高效的任务调度器,避免任务饥饿
总结来说,我会结合线程本地队列 + 全局队列 + 工作窃取,加入优先级老化机制、动态调度策略和高效的数据结构,来实现一个高吞吐、低延迟、无饥饿的任务调度器。存在几个问题:1、多队列 + 工作窃取是什么?多队列是一个线程一个任务队列,线程执行的时候优先从本地队列获取任务,如果本地队列空,会从其他线程 的队列里偷任务执行,偷任务就是工作窃取;2、这么多个任务队列,提交任务的时候,往哪个队列内提交?通过哈希、轮询、负载最小选择一个队列放任务;1)轮询分发。
2025-09-12 17:51:17
216
原创 解释一下C++中内存屏障和它的作用——多线程编程
内存屏障是一种编译器或CPU指令,用来防止编译器或CPU对内存操作指令进行重排(reordering)。因此内存屏障分为两种编译器内存屏障:限制编译器对指令的重排;CPU内存屏障:限制处理器对指令的重排(也叫“指令屏障”)。
2025-09-12 16:17:12
113
原创 多态相关知识
在 C++ 中,“多态(Polymorphism)”是一种面向对象编程的核心特性,它允许相同的接口在不同的对象上表现出不同的行为。// 调用 Dog 的 speak,而不是 Animal 的。多态(Polymorphism) 是指在不同类的对象上对同一个函数调用,表现出不同的行为(即不同的实现)。运行时多态 在运行时根据对象的实际类型决定调用哪个函数 虚函数、继承、多态指针/引用。通过继承 + 虚函数实现,在运行时根据实际对象类型调用对应的方法。virtual void speak() { // 虚函数。
2025-09-12 15:20:54
109
原创 如何实现一个自定义的STL容器类,需要注意哪些方面
MyVector(const MyVector& other) 和MyVector(MyVector&& other) noexcept有什么区别,other不都是传进来的引用吗,都是不拷贝一份?const MyVector& other只是不拷贝一份形参,但实现内容会深拷贝一份返回给新对象,且不能修改原值 MyVector&&reference 表示“容器中元素的引用类型”,通常是 T&,用于读写元素。other 是可以修改原值的 因此它可以将原值修改为空,并且接管原值指向的内存。
2025-09-12 14:43:43
60
原创 异常安全性
不泄露资源(比如内存、文件句柄)不破坏对象的状态要么操作成功,要么对象状态不变(强异常安全)“程序在发生异常时,保证对象状态合法、资源不泄漏、逻辑不乱套” —— 这就是异常安全。✅ 二、C++ 中的异常安全级别(标准分法)C++ 有三种常见的异常安全级别:级别 名称 保证内容 示例✅ 1 基本保证不泄漏资源,对象保持合法状态 push_back() 失败,但 vector 不崩溃✅ 2 强保证要么操作成功,要么对象状态完全不变类似事务操作。
2025-09-11 21:32:52
111
原创 new和malloc的区别
7、如果只分配内存,不调用构造函数,这个类对象未完成构造,虚函数指针,成员变量未初始化,对象不完整;调用new的时候会分配内存+调用构造函数,对应的释放内存时使用delete,清理内存+调用析构函数。调用malloc时只分配内存,不调用构造函数,对应的释放内存时使用free,只清理内存不调析构函数。如果构造类,要使用malloc,那还需要手动调用一次构造函数,或者手动调用new来调用构造函数;另外malloc返回的是void* 类型,需要强制类型转换,需要指定大小。new操作符是可以被重载的。
2025-09-11 20:37:41
124
原创 SFINAE
SFINAE 是模板参数替换失败时不报错,而是忽略该模板的一种规则让我们可以写出“如果满足条件就启用这个模板,否则忽略它”的代码主要用在复杂的模板重载和类型特征检测中。
2025-09-11 19:53:13
192
原创 operator关键字
你理解得很准确,关于隐式类型转换,只有单参数(或者带默认参数可以看成单参数)的构造函数才能用来做隐式转换,多参数构造函数是不能用于隐式转换的。这里,C(int, int=5) 看起来是两个参数,但第二个参数有默认值,等同于单参数构造函数,允许隐式转换。A(int x) { /* 构造 */ } // 用来实现 int -> A 的转换。// 隐式转换,用 A(int) 构造函数把 int 转成 A。这里 A(int) 构造函数只有一个参数,刚好可以用来实现 int → A 的转换。
2025-09-11 11:52:42
363
原创 右值引用和移动语义
(如 std::string, std::vector, 自定义管理资源的类)→ 有资源,移动语义才有意义。🧠 堆内存(heap memory) 比如通过 new, malloc, 或 std::string, std::vector 分配的内存。右值传递也一样,接管指针地址,是 新对象和旧对象的“指针变量地址”不同,但它们的“指针变量的值”(即指向的堆地址)是一样的。先在堆上分配内存,复制一份老对象的数据,再让新对象的指针指向这块内存,新老对象指针指向的不是同一块内存;// 移动构造,而不是复制!
2025-09-11 11:13:55
600
原创 C++11的特性以及举例说明应用场景
1、STL库提供很多函数soft、find、2、容器vectorlistde_queuemap4、迭代器iteroter指向容器的指针,用来遍历容器5、范式编程6、lamda表达式(函数对象)7、智能指针unique_ptrshare_ptrweak_ptr自动管理指针对象和内存8、锁lock_guard9、原子编程 autimic。
2025-09-10 23:25:02
412
原创 定位core程序崩溃问题
一般core有可能是数组越界,空指针,非法访问内存 ,子线程未结束主线程提前退出,多个线程访问同一资源未加锁,变量未初始化,使用未赋值的变量等问题,打印日志,分析函数;操作系统检测到程序运行时出现了非法或危险的行为,然后发出一个信号(signal),终止该程序的运行。2)用gdb工具查看core文件,core文件的信号量和调用栈,在哪个函数内崩溃;作用:快速查看当前帧的所有局部变量,是否有异常值(如空指针、意外 0 值等)4)定位到具体函数内,查看崩溃的那一行,发生了什么,查看rax寄存器的值。
2025-09-10 18:00:27
271
原创 虚函数及虚函数表
虚函数表是不是存放在一个固定的地方,不管有多少对象,虚函数表都是在哪,虚函数指针去找它的地址,不同对象有不同的虚函数指针,指针的内容指向都一样?
2025-09-10 17:45:20
77
原创 缓存未命中
❌ 随机访问容器(如 unordered_map) 哈希表节点可能分散,跳来跳去访问内存。❌ 频繁访问大量数据 比如一个 10GB 数组,超出缓存容量(一般几十KB ~ MB)❌ 跨线程竞争同一缓存行(称为 false sharing) 多线程操作挨得太近的数据。❌ 数据访问不连续 比如访问数组跳着取(a[i*10])导致预取失败。❌ 使用指针结构(如链表)遍历 每个节点不连续,CPU 无法预取。✅ 6. 结构体压缩布局(小对象数组压缩)❌ 示例:跳跃访问数组(坏的局部性)✅ 2. 结构体内存对齐优化。
2025-09-10 14:31:05
149
原创 智能指针原理及类型
3、推荐优先使用 unique_ptr,共享才用 shared_ptr,循环引用时配合 weak_ptr。智能指针是一个类模板,含构造函数和析构函数,share_ptr还包含引用计数 是在堆内分配内存。2、C++ 智能指针是用来自动管理内存资源,避免内存泄露,自动申请和释放资源的对象;会引起循环引用 导致引用计数不能降为0 最终无法析构。则weak_ptr不影响析构 不增加引用技术。make_ptr让其只需分配一次内存,在堆内。
2025-09-10 14:21:39
118
原创 怎么避免内存碎片化
内存分配可视化工具:massif, gperftools, Visual Studio 的诊断工具。任务管理器/Valgrind/Heaptrack:查看占用内存 vs 实际使用量。8、使用定制分配器(Allocator)替代默认 new/delete。9、使用专用分配器替换默认分配器(适合大型项目)Linux 上 pmap 查看进程内存分布。自己记录 new/delete 情况。
2025-09-09 16:44:06
176
原创 线程优化——避免死锁
线程B占着资源2,想拿资源1。两个线程不断检测资源是否可用,一直切换状态,但从不真正获取到资源。线程没卡死在等待,而是一直在忙着做“无用功”,比如反复尝试获取资源但总失败,或者陷入死循环。假死(Livelock)/卡死:线程陷入无限循环、资源争用,表现为 CPU 占用低或无响应。程序不动了,所有相关线程都被堵住了,CPU 占用可能不高,因为它们都在等。多个线程相互“等着对方释放资源”,结果谁也不放手,大家都卡在那里了。死锁(Deadlock):多个线程互相等待资源,永远无法继续执行。
2025-09-08 17:47:00
264
原创 高内存占用怎么优化
懒加载(英文:Lazy Loading),是一种按需加载资源的优化技术,常用于提升网页或应用的性能。使用了过大的 STL 容器 合理控制容器大小,及时清理,使用 shrink_to_fit()某个组件不会在应用一开始就加载,而是在真正需要的时候(比如路由切换、用户操作)才去加载它。未释放资源(内存泄漏) 使用智能指针、内存分析工具(如 Valgrind)检测。内存拷贝过多 使用移动语义(std::move),避免不必要的深拷贝。内存碎片化 使用内存池、对象复用技术。检查内存分配量、分配频率、释放时机。
2025-09-08 17:11:44
297
原创 内存池优化
内存池是一种预分配内存块并循环复用的技术,用于减少频繁 new/delete 带来的系统开销和内存碎片。系统调用(如 malloc/free)开销大,频繁分配释放性能低。STL 容器(如 std::list)可自定义分配器实现内存池。✅ 2. 内存池是什么?为什么能优化内存性能?内存池可以从大块内存中切分出小块,统一管理。适合对象生命周期相似、频繁创建/销毁的场景。游戏服务器、数据库连接管理器、网络包缓存。
2025-09-08 16:53:49
104
原创 数据库——连接池管理+减少事务持有时间
🔹 连接管理 使用连接池(如 MySQL 的连接池)减少频繁连接/断开的开销 减少事务持有时间,避免锁表。其实“池化”本质上就是“有限资源复用管理”的通用设计模式,连接池、线程池、对象池都属于这类模式。
2025-09-08 16:30:48
114
原创 数据库优化——缓存优化
假设你有个接口返回“热门用户排行榜”,这数据查询成本比较高且更新不频繁。使用缓存(如 Redis)保存热点数据,减少数据库访问压力。使用结果缓存、Query Cache(适合读多写少的场景)Redis没数据时从MySQL查,再写回Redis。Redis设置过期时间,定期刷新。请求时先从 Redis 取数据。
2025-09-08 16:09:15
138
原创 数据库优化——表结构优化
选择合适的数据类型(如用 INT 而不是 BIGINT)尽量避免 NULL 字段(会降低某些引擎性能)垂直/水平分表,减少单表数据量。垂直水平分表,减少单表数量。
2025-09-08 16:00:50
136
原创 数据库优化——索引优化
每建立一个索引,数据库在执行 INSERT、UPDATE、DELETE 时,都需要维护这些索引(更新索引数据结构)。经常在 WHERE、JOIN、ORDER BY、GROUP BY 中用到的字段,建索引可以加速查询。最左前缀原则:查询中使用联合索引,必须从最左边的字段开始用,才能利用索引。因此,应根据实际查询需求,有针对性地建立必要的索引,避免无用或重复索引。支持的查询类型 等值查询 + 范围查询 + 排序查询 只支持等值查询。联合索引是多个字段组成的索引,比如 (a, b, c)。WHERE b =?
2025-09-08 15:53:55
174
原创 数据库优化——查询优化
WHERE 条件中使用索引字段,并避免函数包装(如 WHERE YEAR(time))使用 EXPLAIN 分析 SQL 执行计划,查看是否走了索引。减少 JOIN,或确保 JOIN 的字段建立索引。数据库自动决定什么时候用索引,用户不用手动指定。索引数据存储在数据库文件里,但会部分加载到内存。索引是数据库的“目录”,帮助快速定位数据。避免 SELECT *,只查需要的列。
2025-09-08 15:47:10
86
原创 数据库优化
内存池是一种预分配内存块并循环复用的技术,用于减少频繁 new/delete 带来的系统开销和内存碎片。使用了过大的 STL 容器 合理控制容器大小,及时清理,使用 shrink_to_fit()高性能系统开发中常见的四个关键方向:数据库优化、内存优化、线程优化、以及内存池。未释放资源(内存泄漏) 使用智能指针、内存分析工具(如 Valgrind)检测。高竞争导致低效率 减少共享资源、使用无锁结构(如 std::atomic)内存拷贝过多 使用移动语义(std::move),避免不必要的深拷贝。
2025-09-08 12:07:54
299
原创 Docker相关问题
ConfigMap 用于普通配置,Secret 用于密码、证书等敏感信息,容器通过环境变量或挂载文件的方式使用,方便动态更新和管理。Deployment 是管理 Pod 副本的控制器,负责声明式创建、更新和扩展 Pod,实现滚动升级和回滚。Deployment 会创建新的 ReplicaSet 来部署新版本的 Pod,按照设置的策略逐步替换旧版本 Pod,保证服务的可用性。容器是镜像的一个可运行实例,是镜像的一个轻量级、隔离的运行环境。简单来说,镜像是静态的,容器是动态的。检查网络连通性和 DNS 解析。
2025-09-05 15:18:15
419
原创 面试八股文
你知道std::map和std::unordered_map的底层实现吗?你如何理解C++11中的移动语义?std::vector和std::list的区别?你如何优化代码减少缓存未命中?你能说说在Linux下调试C++程序的常用方法和工具吗?如果你发现程序在某个函数频繁崩溃,你会如何定位问题?如果你的程序存在内存泄漏,你通常会如何定位和解决?你如何进行C++程序的性能分析?你在实际项目中是如何避免死锁的?请讲讲虚函数的机制,虚函数表是怎么实现的?你在项目中如何设计一个线程安全的单例模式?
2025-09-04 15:50:10
147
原创 UML用例图
参考该博客https://blog.csdn.net/fengfeng0328/article/details/100051580。
2023-07-07 15:00:09
113
原创 安全相关知识
Spoofing 就是伪装,比如我用别人的ID发言就是Identity Spoofing, 我想到用变化IP的办法就是IP Spoofing.Information Disclosure 就是信息的泄漏,比如他们的那串数字图片就没有任何保护,图片上的信息轻易的就被别人得到了。Repudiation 就是拒绝承认,比如我进行了这些攻击,他们并不知道是我做的,也没有证据是我做的,我就可以不承认。Tampering 就是篡改,比如我用别人ID发言的手段就是篡改了合法包,而他们的server端没有相应的检查措施。
2023-07-04 16:20:47
274
原创 软件设计知识
卫语句(guard clauses)是一种改善嵌套代码的优化代码。将经过多级嵌套的代码使用卫语句优化之后,代码嵌套层数可以降低,因此改使用卫语句能降低代码的复杂程度。卫语句是通过对原条件进行逻辑分析,将某些要害(guard)条件优先作判断,从而简化程序的流程走向,因此称为卫语句。版权声明:本文为CSDN博主「暗诺星刻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。将密码以明文的形式直接写到代码中,就是密码硬编码。卫语句往往用于对 if 条件嵌套代码的优化。
2023-07-04 16:02:18
393
原创 UML类图
表示一种弱的‘拥有’关系,即has-a的关系,体现的是整体对象包含成员对象,但成员对象不是整体对象的一部分,成员对象可以脱离整体对象独立存在,两个对象具有各自的生命周期。一些类的属性对象类型为该类本身,这种特殊的关联关系为自关联,在链表中非常常见,单向链表Node中会维护一个它的前驱Node,双向链表Node中会维护一个它的前驱Node和一个它的后继Node。双向关联就是双方各自持有对方类型的成员变量 ,都可以调用对方的公共属性和方法。类的关联关系是单向的,单向关联用带箭头的实线表示。单向关联(实线箭头)
2023-07-04 11:45:12
112
原创 Linux文件权限学习
其中,“r”表示可读,“w”表示可写,“x”表示可执行,“-”则无权限;每个文件都会将它的权限与属性记录到文件系统的inode中,不过我们使用的目录树却是使用文件名来记录,因此每个文件名都会链接到一个inode,这个属性记录的就是有多少的不同的文件名链接到相同的inode号码;后面与上(1)相同,3个一组表示对应的权限,“-”则无权限(若是“l”则表示链接文件,“b”表示设备文件里可供存储的周边设备,“c”表示设备文件里的串行端口设备,例如键盘、鼠标);【r-x】:其他人权限,101,十进制为5。
2023-06-28 16:46:17
119
原创 算法学习记录
动态规划的核心思想是:将问题分解成子问题,f(0)、f(1)等子问题的最优解可以求出,那f2的问题就可以分解成f0和f1的子问题,当前状态有两种选择方式,列出两种方式,加上条件,一般从0、1、2最小子问题开始求,滚雪球逐渐向后推,和递推很像。·································2、初始值 边界值。动态规划最重要两个点:1、当前状态和前一个状态的关系:通过0、1、2递推。
2023-05-10 10:23:45
311
原创 安装telnet及配置cmake
1、具体安装步骤参考https://blog.csdn.net/xiejunna/article/details/79671902https://www.csdn.net/tags/MtjaIg2sMjE0NTgtYmxvZwO0O0OO0O0O.html2>telnet下的退出是ctrl+]3>客户端连接服务段方法:Telnet 127.0.0.1 60002、配置cmake编写CMakeFiles.txtcmake . 在当前目录下寻找CMakeFiles.txtCma
2022-05-30 21:05:13
171
原创 mysql数据库的常见问题
1、具体安装过程见https://blog.csdn.net/Aykl119/article/details/1222235822、安装时,报这个错:mysql-community-libs-compat-5.7.37-1.el7.x86_64.rpm 的公钥尚未安装失败的软件包是:mysql-community-libs-compat-5.7.37-1.el7.x86_64GPG 密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql解决方法:rpm -
2022-05-30 21:01:23
802
原创 redis的安装
1、不同服务器的客户端如何聊天:让各个服务之间两两建立连接,这个设计十分不好,连接之间容易出现问题,相当于在服务器之间进行广播,大大提高了耦合度,不利于增加减少服务器,太过于复杂。2、引入服务器中间件设备,为了降低服务器之间的耦合,消息队列,每增加一台服务器,只需要和消息队列建立连接即可。Redis:消息队列 ,基于内存存储数据,键值对存储的缓存数据库 Kafka 轻量级 解耦合3、选择基于发布式订阅的redis消息队列安装步骤可以参考:https://blog.csdn.net/qq_506
2022-05-30 20:57:57
100
原创 mudou库安装遇到的问题
安装时如果cmake版本低于3.5会报如下错误,找了很久才找到这个问题所在:版本识别不到CMP0057,此时重新安装cmake版本。cmake -version:查看当前版本,一般自动下载的是2.8版本卸载原cmake版本:sudo yum autoremove cmake重新安装3.11版本cmake:1)wget https://cmake.org/files/v3.13/cmake-3.13.0-Linux-x86_64.tar.gz2)tar -xzvf cmake-3.13.0-L
2022-05-30 20:51:23
474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人