系统调用:比你想象中更昂贵

2025-09-20
系统调用:比你想象中更昂贵

本文深入探讨了Linux系统调用背后的性能开销,它不仅仅是简单的内核函数调用。系统调用会中断CPU的微架构优化,例如指令流水线和分支预测,导致性能损失远大于代码层面体现的开销。文章分析了内核代码,解释了各种软件和硬件层面缓解措施对性能的影响,并提出了多种优化策略,例如使用vDSO,缓存值,优化I/O,批量操作以及将工作推入内核等,以减少系统调用的次数,从而提升软件性能。

阅读更多
开发

编写CPU友好的代码:硬件感知编程指南

2025-03-23
编写CPU友好的代码:硬件感知编程指南

本文以快餐店的点餐流程为类比,解释了指令流水线、内存缓存和预测执行三个关键的CPU架构概念。作者指出,理解这些机制并编写与之协同工作的代码(硬件感知编程)能显著提升软件性能。文章深入探讨了如何通过代码调整优化程序,例如循环展开以利用超标量执行,以及优化数据结构布局和访问模式以充分利用缓存,从而提升程序效率。最终,作者强调了编写高效代码的关键在于:先编写清晰可维护的代码,再通过分析确定性能瓶颈,最后运用硬件感知的编程原则针对瓶颈进行优化。

阅读更多

Unix 拼写检查器:如何在 64kB RAM 中运行

2025-01-19
Unix 拼写检查器:如何在 64kB RAM 中运行

在 70 年代,Unix 的拼写检查器如何在只有 64kB RAM 的 PDP-11 计算机上运行?这篇文章讲述了 Douglas McIlroy 如何通过巧妙的数据结构和压缩技术解决这一难题。他首先使用布隆过滤器进行快速查找,但随着字典大小的增加,他转向了一种创新的哈希压缩方案。通过分析哈希值的差值符合几何分布,并利用 Golomb 编码,他实现了接近理论极限的压缩率,最终在内存和速度之间取得了平衡。这是一个关于如何在资源受限环境下进行巧妙工程设计的经典案例。

阅读更多
开发

Linux上下文切换内部机制:进程状态与内存

2025-01-02
Linux上下文切换内部机制:进程状态与内存

本文深入探讨了Linux内核如何表示进程及其状态,重点介绍了task_struct和mm_struct这两个关键数据结构。task_struct负责进程的执行状态,包括进程状态、CPU时间跟踪和调度信息;mm_struct则管理进程的内存状态,涵盖页表、内存段边界以及体系结构相关的内存状态。文章详细解释了这些结构的各个字段,并阐述了它们在上下文切换过程中的作用,为理解Linux内核的底层机制提供了深入的见解。

阅读更多
开发

完美聚类算法不存在:不可能三角的困境

2024-12-26
完美聚类算法不存在:不可能三角的困境

本文探讨了聚类算法的“不可能三角”问题。作者类比CAP定理,指出任何聚类算法都必须在规模不变性、丰富性和一致性三个理想特性中做出权衡,不可能同时满足所有三个。文章详细解释了这三个特性的含义,并以k-means等算法为例说明它们如何牺牲其中一个特性。最终,作者建议开发者在选择聚类算法时,应根据具体应用场景权衡利弊,选择最适合的算法,而不是追求不存在的完美算法。

阅读更多

揭秘fork系统调用的魔力

2024-12-01
揭秘fork系统调用的魔力

本文深入探讨了Unix-like系统中fork系统调用的工作原理。fork看似神奇地在一个if语句中返回两个值,实际上是内核复制了父进程,包括代码、内存和寄存器,创建了一个几乎相同的子进程。内核分别设置父进程和子进程的返回值,父进程收到子进程的pid,子进程收到0。文章通过汇编代码示例和xv6、Linux内核的fork实现,揭示了这一机制的底层逻辑。

阅读更多
未分类

Python式的空值检查

2024-11-14
Python式的空值检查

本文探讨了Python中检查序列空值的惯用法——利用序列的真值性(例如,if not mylist),并解释了为什么这种方式比使用len()函数更Pythonic。作者认为,一些程序员认为这种方式不明确或可读性差的观点源于代码风格和工程实践的不足,例如变量命名不佳、缺少文档字符串和类型提示、缺乏单元测试以及输入验证不足等。文章强调,清晰的变量命名、完善的函数文档和类型提示、以及良好的工程实践能够消除这种感知上的歧义,并使代码更易于理解和维护。虽然len()并非错误,但Pythonic的风格更简洁高效。文章还建议使用is运算符来检查None值,并提倡采用类型提示和静态类型检查、用户输入验证以及单元测试等最佳实践来提高代码质量。

阅读更多
未分类 空值检查

每个开发者都应该了解的GPU计算知识

2024-11-05
每个开发者都应该了解的GPU计算知识

本文介绍了GPU架构和计算的基础知识,对比了CPU和GPU的设计目标和性能差异,并详细解释了GPU的计算架构、内存架构、执行模型、CUDA内核和线程块、资源分配以及占用率等概念。文章指出,GPU的设计目标是高吞吐量,CPU则注重低延迟;GPU通过大规模并行性和高效的线程调度来实现高性能,并通过动态资源分配来最大化资源利用率。文章还提供了一些深入学习GPU的资源。

阅读更多
未分类

CPython 虚拟机的设计与实现

2024-09-01
CPython 虚拟机的设计与实现

本文深入探讨了 CPython 虚拟机,从字节码和虚拟机的基础知识开始,逐步讲解了CPython字节码指令格式、字节码打包格式,并结合代码示例进行了详细解释。文章重点介绍了 CPython 虚拟机内部结构,特别是栈帧的概念和作用,以及使用计算跳转而非 switch case 语句来实现更高效的字节码求值循环。最后,文章通过一个简单的 Python 程序演示了 CPython 虚拟机如何执行代码,包括指令的读取、函数调用的处理以及栈帧的变化等细节。

阅读更多
未分类

CPython函数调用性能优化分析

2024-08-09
CPython函数调用性能优化分析

文章分析了CPython最新版本中函数调用的性能改进。通过三个基准测试,文章展示了CPython在执行简单指令、调用内置函数以及调用Python函数方面的性能提升。这些改进主要归功于超级指令、字节码指令特化、内置函数优化以及Python函数内联执行等优化措施。

阅读更多
未分类 函数调用

深入解析同步多线程的工作原理

2024-07-28
深入解析同步多线程的工作原理

文章详细解释了同步多线程(SMT,例如英特尔的超线程技术)的工作原理。SMT通过复制处理器架构状态,允许单个物理核心同时处理来自两个线程的指令,从而提高资源利用率。文章深入探讨了SMT在处理器前端和后端(包括指令获取、解码、乱序执行、资源分配和调度等方面)的微架构实现。此外,文章还分析了SMT对性能的影响,指出在某些情况下,SMT可能导致资源竞争而降低性能,而在其他情况下,例如线程协作良好,则可以提高性能。最后,文章还提到了与SMT相关的安全漏洞问题。

阅读更多
未分类 同步多线程 SMT