spinlock内部一定要使用内存屏障技术 内存屏障总结 应用开发用到的锁/信号量等粗粒度同步机制的内部实现 肯定会用到内存屏障 例如自旋锁 -> 需要结合一个具体的实现仔细看一下 都在自己的缓存中,lock_val = 0 core 0 尝试获取,将lock_val的值写为1。接着执行关键代码 底层MESI协议开始起作用 但是有一定延迟 接着,core 1尝试获取,发现自己缓存中lock_val的值仍然为0, 2024-08-27 嵌入式-开发 #内存屏障
CPU乱序执行-内存屏障 参考博客 HPC(高性能计算第一篇):一文彻底搞懂并发编程与内存屏障(完结篇) 为什么CPU会乱序执行 前后两条指令没有依赖;但是前一条指令访存地址不在L1 cache中,而后一条指令的访存地址在L1 cache中,因此可以先执行第二条指令,等待第一条指令将访存单元加载到L1 cache中再执行第1条指令。有些CPU是这样做的 但是==X64==架构保证写 2024-08-27
Linux - 开发可以的debug手段 一次真实的内存泄漏检测参考链接 Linux如何查找内存泄露和内存占用过大? 观察步骤 pidstat观察某个进程的内存使用统计【随时间变化】 还可以观察io/cpu/上下文切换等信息 pmap -x <pid>显示程序的虚拟内存分布及虚拟内存映射情况,得到泄漏内存大小约为4K 查到可能是由于malloc或mmap系统调用分配内存导致的 使用strace跟踪系统 2024-08-26 嵌入式-开发
构造函数-析构函数的调用时机 VS 异常 一般地 这两个函数==由编译器保证调用== 构造函数在创建对象时调用 析构函数在对象离开作用域时调用 即使在作用域内发生异常(throw),对象的析构函数仍然能确保调用 RAII思想的重要基础 CPP异常机制 try -> throw() -> catch() 开发人员可以手动使用throw来触发异常 某些std库函数也具有throw异 2024-08-25 cpp基础
回溯法 常用剪枝技巧经典题目 698. 划分为k个相等的子集 思路 共有k个桶 每个球都要选择划分到哪一个桶,并进行回溯 重要剪枝:如果当前桶与上一个桶的和相同,则跳过当前桶 2024-08-25 刷题记录
记忆化搜索 常见的记忆化key方案常用技巧 得先想出递归的完整方案 将递归的参数引入记忆化搜索中 记忆化搜索key压缩技术 经典题目 3154. 到达第 K 级台阶的方案数 想到了递归方案 -> 但是边界条件的处理不适合转化为记忆化 想到的递归没有带返回值 但是没有想出如何进行递归化搜索 边界条件处理的逻辑 还是子问题的逻辑没有想好 3144. 分割字符频率相等的最少子字符串 记忆化递归的 2024-08-22 刷题记录