<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[John_Snowww的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/John_Snowww</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; John_Snowww]]></copyright><item><title><![CDATA[CMU15445(2023fall) Project #1 - Buffer Pool Manager优化分析]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/152562476</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/152562476</guid><author>John_Snowww</author><pubDate>Sun, 05 Oct 2025 20:31:30 +0800</pubDate><description><![CDATA[本文探讨了数据库系统中磁盘I/O性能优化的方法。针对传统同步I/O存在的阻塞问题，提出了三种优化策略：1）采用异步写入机制，避免主线程等待；2）引入线程池提高并发处理能力；3）设计写请求队列维护页面写入顺序。]]></description><category></category></item><item><title><![CDATA[C++漫游指南——字符串篇与内存分配篇]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/147636906</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/147636906</guid><author>John_Snowww</author><pubDate>Wed, 30 Apr 2025 17:36:29 +0800</pubDate><description><![CDATA[一问彻底搞懂char []、char*和string的区别。同时深入分析内存分配的底层逻辑，讨论new和malloc再到智能指针的演化过程。走过路过不要错过~]]></description><category></category></item><item><title><![CDATA[用火焰图(Flame Graph)分析程序性能——以bustub为例]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/147224232</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/147224232</guid><author>John_Snowww</author><pubDate>Mon, 14 Apr 2025 16:55:20 +0800</pubDate><description><![CDATA[在计算机科学和软件开发中，perf是一种性能分析工具，通常用于分析程序的性能瓶颈、CPU 使用情况、内存管理等。它是 Linux 操作系统中非常强大的工具，通常用于性能调优和故障排查。具体来说，perf监控硬件事件：例如 CPU 的缓存命中率、分支预测命中率、指令执行等硬件级别的事件。收集软件性能数据：例如函数的调用次数、执行时间等。性能分析和优化：通过分析程序的执行路径、调用堆栈、时间消耗等，帮助开发者找到性能瓶颈。分析系统负载和资源使用情况：例如 CPU、内存和磁盘的使用情况。]]></description><category></category></item><item><title><![CDATA[CMU15445(2023fall) Project #4 - Concurrency Control踩坑历程]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145955385</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145955385</guid><author>John_Snowww</author><pubDate>Sat, 01 Mar 2025 23:15:05 +0800</pubDate><description><![CDATA[我个人认为是需要的，别的不说，单从UndoLogs的可读性来讲为Insert操作生成UndoLog就是必要的，但是根据lab的测试点来说并不推荐这种做法。用那张图上的内容来说，A1、B1等元素只是版本链最后一个有效的UndoLog，它们包含的UndoLink会指向一个空的内容，如下图。老规矩，是时候展示我的匠心图例了。version_info_我觉得是十分精妙的，利用了每个page_id的唯一性(由Project 02的bufferpool分配)，越过table_heap直接管理每个page的版本链信息。]]></description><category></category></item><item><title><![CDATA[CMU15445(2023fall) Project #3 - Query Execution(下)详细分析]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145954934</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145954934</guid><author>John_Snowww</author><pubDate>Sat, 01 Mar 2025 22:50:13 +0800</pubDate><description><![CDATA[当查询中包含多个等值条件时，哈希连接仍然能够高效执行，原因是哈希连接擅长处理等值连接，并且可以通过构建复合哈希键来处理多个条件。HashJoinPlanNode 作为哈希连接的计划节点，允许数据库在遇到等值连接条件时使用哈希连接算法，构建哈希表并进行高效的连接操作。在查询中出现多个等值条件时，哈希连接依然能够通过处理这些条件的哈希值，利用哈希表快速查找匹配的元组。]]></description><category></category></item><item><title><![CDATA[CMU15445(2023fall) Project #3 - Query Execution(上)详细分析]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145940002</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145940002</guid><author>John_Snowww</author><pubDate>Fri, 28 Feb 2025 23:30:07 +0800</pubDate><description><![CDATA[要准确体会executor的执行过程，进行调试是相当重要的。但是Lab 03的测试方法不同于以前，是利用sqllogictest来执行slt文件。搞得我一直以为调试要从sqllogictest下手，但这样配置显然是有问题的去群里问了也没有得到想要的答案。反复看了几遍handout才发现有可能是通过bustub-shell进行调试，试了一下还真是。会了如何进行调试之后，我们就可以着手先分析各种sql语句的执行过程了。]]></description><category></category></item><item><title><![CDATA[CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145939524</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145939524</guid><author>John_Snowww</author><pubDate>Fri, 28 Feb 2025 23:05:23 +0800</pubDate><description><![CDATA[在缓冲池管理器中，FetchPage和NewPage函数返回已经锁定的页面指针。这个锁定机制确保页面在没有任何读取和写入时不会被驱逐。为了表示页面在内存中不再需要，程序员必须手动调用UnpinPage。然而，如果程序员忘记调用UnpinPage，页面将永远不会被驱逐出缓冲池。由于缓冲池实际上只有较少的帧，这将导致更多的页面在磁盘和内存之间交换。这样不仅会影响性能，而且这个bug很难被发现。]]></description><category></category></item><item><title><![CDATA[CMU15445(2024fall) Project #1 - Buffer Pool Manager踩坑大全]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145908700</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145908700</guid><author>John_Snowww</author><pubDate>Thu, 27 Feb 2025 19:01:07 +0800</pubDate><description><![CDATA[有一说一2023fall的BPM实现起来要比2024fall的流畅不少。2024fall版本的函数拆分粒度太高了，乍一看完全不知道每个函数到底是充当一种什么样的角色，更像是将一份优化过后的代码。相反2023fall的函数设计则较为合理，而且也专门将page guard拆分成了一个单独的task完成。接下来分析2024fall版本的BPM。]]></description><category></category></item><item><title><![CDATA[CMU15445(2024 fall) Project #0 - C++ Primer]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145907270</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145907270</guid><author>John_Snowww</author><pubDate>Thu, 27 Feb 2025 16:44:09 +0800</pubDate><description><![CDATA[其实Lab 0有个重点贯穿始终——无符号整形的处理，一定要注意无符号整形不会小于0这个特点]]></description><category></category></item><item><title><![CDATA[CMU15445(2023fall) Project #0 - C++ Primer前置知识学习]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145890740</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145890740</guid><author>John_Snowww</author><pubDate>Wed, 26 Feb 2025 23:24:30 +0800</pubDate><description><![CDATA[const_cast用来移除const限定符，使得可以修改指向的内容，或者用于访问原本被声明为const的数据。用于指针类型之间的强制转换，允许将指针转换为完全不同类型的指针，按新的类型去解释数据。这种转换是非常低级且不安全的，可能会引发未定义行为，必须小心使用六、几种整形类总结最后，把几个整数类型都理清楚一下。这里重点调int、int8、int8_t、size_tint通常是 4 字节（32 位），但这取决于平台（例如，某些 64 位平台上的 int 可能为 8 字节）。符号。]]></description><category></category></item><item><title><![CDATA[WSL2下，向github进行push时出现timeout的问题]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/145243536</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/145243536</guid><author>John_Snowww</author><pubDate>Wed, 26 Feb 2025 22:58:36 +0800</pubDate><description><![CDATA[主要表明你的 WSL2 环境无法通过 SSH 连接到 GitHub 的 22 端口。GitHub 在默认情况下使用 SSH 协议通过 22 端口进行通信，但有时候一些网络环境或者配置问题可能会导致无法连接。443 是 HTTPS 协议的标准端口，通常不受防火墙限制，因此是连接 GitHub 的理想选择。我开始还以为是网络波动，测试了多次之后才发现应该是22端口出问题了，重启电脑也没效果。]]></description><category></category></item><item><title><![CDATA[Visual Studio的解决方案管理器怎么从文件夹视图切换回原视图——最后一根稻草]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144413022</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144413022</guid><author>John_Snowww</author><pubDate>Thu, 12 Dec 2024 00:03:24 +0800</pubDate><description><![CDATA[这种状态下的vs基本就只能运行当前的文件，其他cpp文件都是无法运行的。可以看到尽管这里启动项选择的是“当前文档”，但点击运行就会出现“这两天笔者发现自己的vs2019出现了个奇怪的bug，只有第一次创建项目的解决方案的视图是正常的，如下图。在网上看了诸多方法无果， 因为很多文件选项这时都直接不见了，谈何通过属性进行修改呢？结果还真被我发现解决办法了——点击这里的“如果第二次再打开这个项目，那视图就会切换为文件夹视图。”，然后这块页面就会切换成下面这样。在解决方案和可用视图之间切换。，这就显得十分离谱了。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 5: Sharded Key/Value Service不完全指南]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144334072</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144334072</guid><author>John_Snowww</author><pubDate>Sun, 08 Dec 2024 23:18:45 +0800</pubDate><description><![CDATA[A：在同一个group内，Leader通过将来自Clerk的command发送至raft进行一致性同步，接下来所有的Server都可以从raft peer中收到这个command，再将这个command应用至自己的状态机。但这样会忽略对旧Config的处理。在刚才的例子中，group100和group101发现自己的Config过时后，会跳过对Config3的处理，重新查询并处理Config4。我一开始就是选择的方案1，后面发现需要考虑的情况实在是太多了，不胜其烦，稍不留神就会出bug。]]></description><category></category></item><item><title><![CDATA[FaRM译文]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144253020</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144253020</guid><author>John_Snowww</author><pubDate>Wed, 04 Dec 2024 23:57:54 +0800</pubDate><description><![CDATA[具有强一致性和高可用性的事务简化了分布式系统的构建和推理。然而，之前的实现表现不 佳。这迫使系统设计人员要么完全避免使用事务，要么削弱一致性保证，或者提供需要程序 员自己划分数据的单机事务。在本文中，我们展示了在现代数据中心中无需妥协。我们展示 了一种称为FaRM的主存分布式计算平台能够提供具有严格可串行化、高性能、持久性和高 可用性的分布式事务。FaRM在90台机器上使用4.9 TB数据库实现了每秒1.4亿次TATP 事务的峰值吞吐量，并能在不到50毫秒内从故障中恢复。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 4: Fault-tolerant Key/Value Service踩坑之路]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144252697</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144252697</guid><author>John_Snowww</author><pubDate>Wed, 04 Dec 2024 23:29:49 +0800</pubDate><description><![CDATA[这次的Lab和Lab2确实有点类似，不同之处是Put和Append都不应向客户端返回值。这里不返回值指的是忽略Value，但是可以设置Err字段来确保操作的成功处理。令人辛酸的是貌似我踩完了这个Lab所有的坑，从最粗糙的方法一步步改进直到最后构架出一份几乎无懈可击的代码，可谓是筚路蓝缕下面来看具体的实验要求。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 3: Raft——Part 3D]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144226855</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144226855</guid><author>John_Snowww</author><pubDate>Tue, 03 Dec 2024 23:52:50 +0800</pubDate><description><![CDATA[在完成Lab之前，务必把论文多读几遍，力求完全理解Leader选举、log日志等过程。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 3: Raft——Part 3B&3C]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144226612</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144226612</guid><author>John_Snowww</author><pubDate>Tue, 03 Dec 2024 23:35:52 +0800</pubDate><description><![CDATA[在完成Lab之前，务必把论文多读几遍，力求完全理解Leader选举、log日志等过程。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 3: Raft——Part 3A]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144201615</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144201615</guid><author>John_Snowww</author><pubDate>Mon, 02 Dec 2024 23:57:27 +0800</pubDate><description><![CDATA[在完成Lab之前，务必把论文多读几遍，力求完全理解Leader选举、log日志等过程。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 2: Key/Value Server]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144201411</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144201411</guid><author>John_Snowww</author><pubDate>Mon, 02 Dec 2024 23:47:45 +0800</pubDate><description><![CDATA[故事里能毁坏的只有风景谁也摧毁不了我们的梦境弦月旁的流星划过了天际我许下 的愿望 该向谁 去说明——我是如此相信完整代码见：还是那句话，尽量只是参考思路而不是照抄先阅读几遍实验说明的Introduction部分，Lab的核心就在下面这段话：客户端可以向键值服务器发送三种不同的RPC：Put(key, value)、Append(key, arg)和Get(key)。服务器维护一个内存中的键值对映射。键和值都是字符串。]]></description><category></category></item><item><title><![CDATA[6.824/6.5840 Lab 1: MapReduce]]></title><link>https://blog.youkuaiyun.com/John_Snowww/article/details/144161565</link><guid>https://blog.youkuaiyun.com/John_Snowww/article/details/144161565</guid><author>John_Snowww</author><pubDate>Sat, 30 Nov 2024 22:18:34 +0800</pubDate><description><![CDATA[尽管使用普通文件存储中间键值对也可以实现，但使用 JSON 文件提供了更高的可读性、调试性、跨语言兼容性和实现简单性。JSON 格式的标准化和广泛支持，使得它成为 MapReduce 中间键值对存储的一个理想选择。8、worker 的 map 任务可以使用 ihash(key) 函数（在 worker.go 中）为给定键选择 Reduce 任务。这里属于一个小难点，要用合适的方法将中间键写入NBUCKET个文件中，否则多次遍历intermediate会导致处理任务的用时激增。]]></description><category></category></item></channel></rss>