<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[CD200309的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/CD200309</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; CD200309]]></copyright><item><title><![CDATA[C++20(jthread)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/158498820</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/158498820</guid><author>CD200309</author><pubDate>Sun, 01 Mar 2026 13:34:44 +0800</pubDate><description><![CDATA[本章参考和 MSVC 示例。类表示。它与具有相同的通用行为，除了jthread在析构时会自动加入，并且可以在某些情况下被取消/停止。与传统的 std::thread 的不同。]]></description><category></category></item><item><title><![CDATA[C++20(范围)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/157731571</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/157731571</guid><author>CD200309</author><pubDate>Mon, 09 Feb 2026 16:38:53 +0800</pubDate><description><![CDATA[标准库的容器，可是拥有和非拥有数据(stringview....)自定的对象内实现了 begin/end原生数组生成器生成的序列简单说：任何包含 begin/end 支持范围 for 的对象都是一个范围。]]></description><category></category></item><item><title><![CDATA[C++20(三路比较运算符)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/157732240</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/157732240</guid><author>CD200309</author><pubDate>Thu, 05 Feb 2026 11:03:39 +0800</pubDate><description><![CDATA[>= <= 这些比较符，而 C++ 20 提供了 <=> 三路比较运算符，又称 宇宙飞船运算符，他同时兼具了上述的所有比较符的逻辑，统一了接口，不必写冗余的代码。如果自己写了 <=> 或者强制编译器生成默认的 <=> ，该类就可以使用传统的比较方式了，但 <=> 生成默认的要求所有的成员变量都支持 <=>，并按声明顺序进行比较，既可写成类成员函数也可写成非成员函数。weak_ordering：弱序比较，不严格的比较，如按自己的规则进行比较，string 忽略大小写比较等。unordered：不可比较。]]></description><category></category></item><item><title><![CDATA[C++20(协程)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/157548774</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/157548774</guid><author>CD200309</author><pubDate>Wed, 04 Feb 2026 15:36:01 +0800</pubDate><description><![CDATA[先看看线程：线程是 CPU 调度的基本单位，属于内核，保存上下文需要切换到内核态，成本较高，线程是抢占式的，任何一个线程都可能会被随时切换，线程阻塞会一直等直到唤醒。协程：粒度比线程更细，协程属于用户态，上下文的保存在用户态完成，成本较低不需要状态转换，协程是协作式的，协程的挂起由另一个协程恢复，协程阻塞不会影响其他的协程，多个协程可以跑在一个线程上。]]></description><category></category></item><item><title><![CDATA[C++20(模块化)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/157473226</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/157473226</guid><author>CD200309</author><pubDate>Fri, 30 Jan 2026 15:06:51 +0800</pubDate><description><![CDATA[先看一张图片：main1.cc main2.cc main3.cc 包含 fun.h 在预处理的时候都会展开一次，增加编译时间，假设头文件有 m 份，源文件有 n 份，总共编译时间为 m*n ，这也是传统的C++包含头文件带来的效率问题，右边 main1.cc 同时包含 2 个头文件，里面都有同一变量，导致冲突。为了解决上述重复包含头文件和冲突等问题，在 C++ 20 引入了模块化。]]></description><category></category></item><item><title><![CDATA[C++20(概念和约束)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/157399251</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/157399251</guid><author>CD200309</author><pubDate>Wed, 28 Jan 2026 11:28:05 +0800</pubDate><description><![CDATA[类模板、函数模板（包括泛型lambda）和其他模板化函数（通常是类模板的成员）可能与一个约束相关联﻿，该约束指定了对模板参数的要求，可用于选择最合适的函数重载和模板特化。这种需求的命名集合称为概念﻿。每个概念都是一个谓词，在编译时计算，并成为模板接口的一部分，用作约束：说人话，就是给模板添加一种约束，让不符合的条件的错误信息更直观看懂，且编码方式统一。类型萃取：模板特化等....这些方式千奇百怪，有了概念之后遵守统一的语法格式更方便编码和调试。]]></description><category></category></item><item><title><![CDATA[C++17(新特性)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/153624086</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/153624086</guid><author>CD200309</author><pubDate>Fri, 31 Oct 2025 18:45:35 +0800</pubDate><description><![CDATA[C++为了区分同名变量通过域作用限定符来访问不同的对象，也就是对象被封到命名空间李了，如果命名空间嵌套的太深了，太冗余了，C++ 17 给了一套新的定义方式。// C++ 17 之前{}// C++ 17int a = 10;]]></description><category></category></item><item><title><![CDATA[TCP(滑动窗口/拥塞窗口补充)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/153788038</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/153788038</guid><author>CD200309</author><pubDate>Thu, 23 Oct 2025 23:40:12 +0800</pubDate><description><![CDATA[方案，如果对端已经收到所有的报文或者刚连接什么也没发，也就是发送的报文全部都 ACK 了，则无论多大的包都直接发送，否则如果还有的报文没有 ACK，后续写的数据会积攒起来，如果积攒超过 MSS 则会打包发过去，或者前面发的所有包都 ACK 了也会直接发出去。对端通告窗口大小为 1，2，3.... 这种很小的窗口，发送端就只能发送很小的数据，但基于网络协议栈进行封包，TCP/IP最少报头都是 20 + 20，不携带选项，在携带这么少的数据，也就是 MSS，开销比较大。1. ACK丢包：发送 1，2，3。]]></description><category></category></item><item><title><![CDATA[C++11新特性补充]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/152232451</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/152232451</guid><author>CD200309</author><pubDate>Thu, 09 Oct 2025 22:08:41 +0800</pubDate><description><![CDATA[1. 先来谈谈 volatile：防止编译器对代码进行优化(代码编译后生成指令，编译器可能因为效率的原因对指令进行重新排序，也就是调换位置)，并保证他修饰的对象在内存中是可见的，因为 CPU 高速缓存(L1 L2 L3)会通过预加载机制读取一定范围的物理地址，如缓存数据和指令，如果某个对象用 const 修饰，编译器则会认为这个对象不会被改，后续访问就去缓存直接读取，volatile 则就保证了禁止去缓存，转而去内存读取数据。]]></description><category></category></item><item><title><![CDATA[Redis(基础数据类型/String)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/151588087</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/151588087</guid><author>CD200309</author><pubDate>Wed, 17 Sep 2025 21:26:27 +0800</pubDate><description><![CDATA[比如：0 ~ 30 秒内只能获取一次，通过 setnx ex，存在则设置，不存在则出错，并设置过期时间。比如：用户身份校验，浏览器传入 cookie/sessionid，Redis 缓存并查询。通过上述的 incr/incrby 等来实现。使用类型必须匹配，且保证不会溢出最大范围。]]></description><category></category></item><item><title><![CDATA[Redis(哨兵)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/151410595</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/151410595</guid><author>CD200309</author><pubDate>Thu, 11 Sep 2025 18:44:38 +0800</pubDate><description><![CDATA[前章讲到主从结构下，主节点挂了是需要手动让某个从节点变成主节点，或者修复原来的主节点，人为干涉肯定是不现实的，所以 Redis 引入了哨兵机制。顾名思义：建立在主从结构之上，用来管理主从节点由于自身的的异常情况而避免人为干涉，变成了自动解决。当这些哨兵发现主节点挂了会统计个数，并判断 达没达到 认为主节点真正挂了的阈值，防止误判。然后调整从节点和挂了的主节点和客户端连接的 Redis 服务之间的关系即可。]]></description><category></category></item><item><title><![CDATA[Redis(集群)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/151455163</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/151455163</guid><author>CD200309</author><pubDate>Thu, 11 Sep 2025 18:44:05 +0800</pubDate><description><![CDATA[都知道 Redis 是跑在内存中的，既然在内存，能存储的数据是有限的，如果存储的数据太大，就必须引入更多的 Redis 服务来进行分摊数据，所以 Redis 中集群模式就是来解决这类问题的。]]></description><category></category></item><item><title><![CDATA[Redis(缓存)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/151371709</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/151371709</guid><author>CD200309</author><pubDate>Tue, 09 Sep 2025 22:40:05 +0800</pubDate><description><![CDATA[1. 生活上的例子比如有一个行李箱和一个手机，每次把手机放到行李箱在拿出来肯定很麻烦，如果放到裤兜里就会方便很多，所以裤兜算作行李箱的一个缓存，不仅仅是裤兜，甚至可以一直拿在手上等其他有存储介质的东西。说白了缓存就是用来提高效率的，比如 内存 作为 CPU 和 外设 的缓存，和接下来要讲的 Redis 作为 MySQL 的缓存，MySQL 和磁盘打交道，磁盘是外设 I/O 效率慢，并且是随机寻址就更慢了，而 Redis 工作在内存，用来缓存 MySQL 的部分数据来分摊压力再合适不过了。]]></description><category></category></item><item><title><![CDATA[Redis(主从复制)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/151332318</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/151332318</guid><author>CD200309</author><pubDate>Tue, 09 Sep 2025 20:42:18 +0800</pubDate><description><![CDATA[顾名思义：部署多台 Redis 服务器，并选择一个为主 Redis 服务器，其他为从 Redis 服务器。从节点的数据必须从主节点同步过来从节点只能读，主节点可读可写某个从节点挂了，不影响从其他节点读取数据和写数据主节点挂了，不能写数据，从节点读的数据可能是旧的引入主从模式在读的场景下能提高硬件资源数量和可用性，比如某个服务挂了，依旧能从其他节点读数据，但主节点挂了就不会更新新的数据了。]]></description><category></category></item><item><title><![CDATA[仿TCmalloc内存分配器]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149862110</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149862110</guid><author>CD200309</author><pubDate>Sun, 03 Aug 2025 23:16:35 +0800</pubDate><description><![CDATA[什么是内存池前面几章讲过，这里就不在多说了。]]></description><category></category></item><item><title><![CDATA[图(遍历/最小生成树/单/多源最短路径)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149812277</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149812277</guid><author>CD200309</author><pubDate>Sat, 02 Aug 2025 16:40:12 +0800</pubDate><description><![CDATA[Dijkstra 是很快的算法，但不能针对负权值，这个算法则可以针对，因为采用的是暴力遍历的方式求最短路径，从源点出发，每次选择任意连接的顶点即可，不需要选择从源点到某个点的最小路径，当所有的点选完之后则再次选择所有的边，因为可能带负权，执行 n - 1次，但如果出现了负权回路则会永远选不出最短路径。比如：A 出 B D C，在出 B，此时 B 不能再出 A ，A已经出过要标记一下，也不能再出 C，所以 C入的时候就要标记，所以不管是出过的顶点还是待出的顶点都要标记为不能再次入或者出。]]></description><category></category></item><item><title><![CDATA[ptmalloc(glibc-2.12.1)源码解析2]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149604148</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149604148</guid><author>CD200309</author><pubDate>Fri, 25 Jul 2025 17:50:15 +0800</pubDate><description><![CDATA[bins[NBINS * 2 - 2]：bins 数组，前面说的逻辑结构是 128 个，实际物理是 128 * 2 - 2，前面说过一个 bin 的哨兵节点需要 2 个指针，这里把 2 个指针拆开放到下标里，也就是两两下标为一组。stat_lock_direct/stat_lock_loop/stat_lock_wait：表示线程的直接获取锁的数量/自选等待锁的数量/阻塞等待锁的数量。max_n_mmaps：表示当前进程已经调用 mmap 且取最大值，不能超过 n_mmaps_max。]]></description><category></category></item><item><title><![CDATA[ptmalloc(glibc-2.12.1)源码解析1]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149482445</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149482445</guid><author>CD200309</author><pubDate>Thu, 24 Jul 2025 14:31:52 +0800</pubDate><description><![CDATA[chunk2mem(p)：根据已分配的 chunk 的起始地址得到用户实际用的其实地址，本质是跳过前 2 个固定字段的大小，后4个字段在已分配的 chunk 中无效，直接给用户复用，也就是给用户返回的是 fd 字段的起始地址。MINSIZE：进行按最小的 chunk 对齐，比如传入 1 字节，至少对齐到 1+16(最小的 chunk 大小) -> 32(按最小的 chunk 对齐)，大于最小的一样按照最小的 chunk 对齐。]]></description><category></category></item><item><title><![CDATA[Linux(内存分配算法)]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149496765</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149496765</guid><author>CD200309</author><pubDate>Mon, 21 Jul 2025 11:03:39 +0800</pubDate><description><![CDATA[最小分配出去的内存块是1页，即4k，所以如果申请小于1页的需求，也至少分配1页出去，可能导致大量的内存浪费用不上，如果分配的是完整的页，即计算后的大小命中某个下标，则直接分配出去，否则如果没能命中，则尝试找更大的连续的页，然后进行切割，剩余挂到对应的下标里，或者一个也没有则尝试合并小的页成一个大的页进行分配然后尝试切割，否则说明该数组不能满足需求则直接分配失败。首先伙伴算法管理的内存块是以页为单位的和物理内存一样，每个下标管理的是以 2^n 个页的内存块，比如：1页，2页，4页，8页.....。]]></description><category></category></item><item><title><![CDATA[ptmalloc(glibc-2.12.1)整体结构]]></title><link>https://blog.youkuaiyun.com/CD200309/article/details/149479399</link><guid>https://blog.youkuaiyun.com/CD200309/article/details/149479399</guid><author>CD200309</author><pubDate>Sun, 20 Jul 2025 14:12:52 +0800</pubDate><description><![CDATA[先说说生活上的例子：比如在学校，每个月又或者每个星期或者每天家里人都会给生活费来维持在学校的生活开销。那么一次要多少，隔多少天要一次？这些情况都会带来不一样的效果和影响。比如一天要一次和一个星期要一次：每天都要一点，每天都会给家里人通信，想必时间久了家里人都会觉得太麻烦了。每隔星期要一点，一次要多点，这样就会家里人就不会觉得太麻烦了。家里人可能很忙，不能每天抽空按时给生活费。]]></description><category></category></item></channel></rss>