Linux vs. OpenBSD: 一个简单的套接字测试引发的性能差异

2025-08-16

一个简单的C程序,创建线程并打开256个套接字,在Linux和OpenBSD系统上展现出惊人的性能差异。在Linux上,运行时间在17到26毫秒之间波动;而在OpenBSD上,运行时间却低至2到6毫秒。更令人惊讶的是,OpenBSD在初始测试中甚至因为“太多打开的文件”而报错,这暗示了系统资源管理方面的差异。文章作者表示,这与网络代码无关,并期待找到一个Linux系统能够在该测试中胜过OpenBSD。

阅读更多

500英里邮件传输限制:一个有趣的实验

2025-07-09

一个关于大学校长无法发送超过500英里邮件的有趣故事,引发了作者对网络连接和邮件传输距离的实验。通过编写简单的网络连接代码并测试不同大学的服务器,作者发现实际的连接距离受限于服务器位置和网络基础设施,而非物理距离。实验最终揭示了云计算和邮件服务器的地理分布对邮件传输的影响,500英里限制更多的是一个巧合而非物理定律。

阅读更多
开发

X11 DPI缩放:不可能完成的任务?

2025-06-25

作者挑战了X11不支持DPI缩放的普遍说法,通过OpenGL和X服务器的配置事件,成功在不同尺寸和分辨率的屏幕上绘制了一个大小始终为两英寸的圆形。过程中,作者巧妙地利用X服务器提供的屏幕物理尺寸信息,动态调整OpenGL渲染的半径,最终实现了跨屏幕的精确缩放。虽然过程中遇到了一些误差,例如电视屏幕尺寸的偏差,但最终证明了在X11下实现DPI缩放并非不可能。

阅读更多
开发 DPI缩放

网络协议中的管道化陷阱:SMTP 的教训

2025-06-20

本文探讨了网络协议中“管道化”(pipelining)技术的风险。在一些文本协议(如SMTP)中,客户端可能发送多个请求而无需等待响应。然而,服务器端实现不当可能导致问题。例如,服务器可能依赖于隐式状态机,导致在处理多个同时到达的请求时出现混乱,从而错误地接受或拒绝邮件。文章分析了这种潜在问题的根源,并引用RFC 2920中关于管道化死锁的讨论,提醒开发者需谨慎处理管道化,避免因状态管理不当或缓冲区问题导致错误。

阅读更多
开发 管道化

Go语言中io.Reader接口的效率优化:一场与间接层和类型断言的较量

2025-05-19

在Go语言中,许多函数使用io.Reader接口作为输入,这允许数据流式传输,避免全部加载到内存。但当已有字节数据时,直接使用这些字节会更有效率。本文作者在使用libavif和libheif解码图像时遇到了这个问题。由于简单起见,他使用了这些库的简单内存接口,但发现Go的image.Decode函数会对io.Reader进行类型检查,寻找Peek函数,如果没有则用bufio.Reader包装,导致无法直接使用bytes.Reader中的字节。作者通过类型断言和unsafe.Pointer,绕过了bufio.Reader和bytes.Reader的限制,实现了零拷贝,但同时也指出了Go标准库中类型检查和接口设计的一些问题,以及由此带来的“隐式API”的困扰。

阅读更多
开发 io.Reader

OpenBSD下ASUS笔记本风扇控制驱动开发记

2025-05-11

作者在OpenBSD系统下,为了控制ASUS笔记本的动态风扇速度,不得不编写一个ASUS ACPI WMI驱动程序。这篇文章详细记录了开发过程中的挑战和解决方法,包括处理ACPI和WMI的字节序问题,使用acpidump和iasl工具分析系统ACPI代码,以及最终成功实现风扇速度控制的过程。过程中作者还对比了Linux和FreeBSD的驱动程序编写方式,并对OpenBSD的代码组织方式表达了赞赏。

阅读更多
开发 驱动开发

OpenBSD系统调用write()的底层实现探秘

2025-03-29

本文深入探讨了OpenBSD操作系统中`write()`系统调用的底层实现机制。从用户空间的`write()`调用开始,层层深入,追踪数据在内核空间的流转过程,详细阐述了从系统调用到最终数据写入NVMe硬盘的完整路径。文章揭示了内核中一系列函数调用,包括`mi_syscall`、`sys_write`、`dofilewritev`、`vn_write`、`ffs_write`、`uiomove`、`bdwrite`、`syncer`、`bwrite`、`ufs_strategy`、`spec_strategy`、`sdstrategy`以及最终的NVMe驱动程序,展现了数据在不同抽象层次间的转换与传递,以及缓存机制、DMA传输等关键技术细节。

阅读更多
开发