真没什么逻辑

其他

《Go语言设计与实现》纸质书诚邀读者评论

幅高清彩色图片,出版社在再三权衡(成本)之后,最终还是采用了全彩印刷,这在技术图书中并不常见——虽然价格比我预想得高一些,但是出版社已经对成本控了又控,实在是不能再低了(最终
2021年10月19日
其他

谈谈 Kubernetes 的问题和局限性

https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/kep/42-podgroup-coscheduling[^14]:
2021年4月20日
其他

为什么早期的 Windows 需要整理碎片

的文件系统不需要整理碎片?如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。推荐阅读034
2021年4月6日
其他

为什么 HugePages 可以提升数据库性能

却可以在以下几个方面降低内存页面的管理开销:更大的内存页能够减少内存中的页表层级,这不仅可以降低页表的内存占用,也能降低从虚拟内存到物理内存转换的性能损耗;更大的内存页意味着更高的缓存命中率,CPU
2020年11月10日
其他

为什么 NUMA 会影响程序的延迟

的本地内存[^9]:将缓存池中的数据按照块或者索引智能地分配到不同节点上;为正常的查询线程保留默认的分配策略,内存还是会优先分配本地节点上;将简单的查询线程重新调度到能够访问本地内存的节点上;除了
2020年10月27日
其他

为什么 CPU 访问硬盘很慢

作为外部存储。不过作为具有机械结构的外部存储设备,它虽然结构非常成熟并且具有较大的容量,但是它在受到震动时很容易受到外界的干扰。总结硬盘是计算机上的外部存储设备,它可以持久存储大量数据,然而
2020年8月11日
其他

为什么 Linux 默认页大小是 4KB

上的写时拷贝机制,在多个进程共享同一块内存时,当其中的一个进程修改了共享的虚拟内存会触发内存页的拷贝,这时操作系统的内存页越小,写时拷贝带来的额外开销也就越小。总结就像我们在上面提到的,4KB
2020年6月2日
其他

为什么 Linux 系统调用会消耗较多资源

函数触发的,作为应用程序我们能做的事情非常有限,很多功能都需要依赖操作系统提供的服务。多数编程语言的函数调用只需要分配新的栈空间、向寄存器写入参数并执行
2020年5月26日
其他

为什么集群需要 Overlay 网络

网络其实并不是一门新技术,它是指构建在另一个网络上的计算机网络[^1],这是一种网络虚拟化技术的形式,近年来云计算虚拟化技术的演进促进了网络虚拟化技术的应用[^2]。overlay-network图
2020年5月19日
其他

为什么 IPv6 难以取代 IPv4

地址的分配中,我们能看到资源从充足到稀缺,人对于资源使用态度的转变,从最开始粗糙的分配方式到后来细粒度的管控,充足的资源总是会被滥用,只有当资源真正变得稀缺时,我们才开始精打细算。总结IPv4
2020年5月12日
其他

MAC 地址为什么不需要全球唯一

地址解析协议在局域网中我们一般会使用集线器(Hub)或者交换机(Switch)来连接不同的网络设备。因为在集线器连接的局域网中,所有的数据帧都会被广播给局域网内的全部主机,所以使用相同的
2020年5月7日
其他

为什么 Linux 需要虚拟内存

虚拟内存的缺页中断因为主内存的空间是有限的,当主内存中不包含可以使用的空间时,操作系统会从选择合适的物理内存页驱逐回磁盘,为新的内存页让出位置,选择待驱逐页的过程在操作系统中叫做页面替换(Page
2020年4月14日
其他

为什么 0.1 + 0.2 = 0.300000004

float,然而在很长一段时间中,作者都将编程中的浮点数和数学中的小数看做同一个东西,不过当我们重新审视它们时,会发现这两个概念的不同之处。编程中的浮点数的精度往往都是有限的,单精度的浮点数使用
2020年4月7日
自由知乎 自由微博
其他

​圣杯与银弹 · 没用的设计模式

设计模式是软件工程中听起来非常深奥,也非常高端的一个词汇,似乎有了设计模式,我们的代码和项目就能自然的变得非常合理并且易于扩展和维护,然而事情并没有这么简单,软件工程中没有银弹。我们在今天谈论设计模式时,往往与
2020年3月31日
其他

Go 语言垃圾收集器的原理

直接将新的对象涂成黑色。标记辅助为了保证用户程序分配内存的速度不会超出后台任务的标记速度,运行时还引入了标记辅助技术,它遵循一条非常简单并且朴实的原则,分配多少内存就需要完成多少标记任务。每一个
2020年3月24日
其他

为什么 TCP 协议有 TIME_WAIT 状态

从协议栈中移除?如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。相关文章为什么
2020年3月17日
其他

Go 内存分配器的设计与实现

语言运行时分配内存的过程和开销,所以分别处理大对象和小对象有利于提高内存分配器的性能。多级缓存内存分配器不仅会区别对待大小不同的对象,还会将内存分成不同的级别分别管理,TCMalloc
2020年3月12日
其他

为什么 TCP 协议有粘包问题

协议也没有那么深入的理解,相信很多人学习编程的过程都是自底向上的,所以作者认为这是一个值得回答的问题,我们应该传递正确的知识,而不是负面的和居高临下的情绪。面向字节流TCP
2020年3月10日
其他

如何管理自己的时间资产

和番茄工作法,这些方法可能不适用于所有人,但是这些工具是作者在过去几年逐渐摸索出来的方式,在未来的一段时间内这一系统还会不断改进,也希望作者的这些经历和体验能够对各位读者有一些帮助。
2020年3月5日
其他

HTTPS 的 7 次握手以及 9 倍时延

Protocol)已经成为互联网上最常用的应用层协议,然而其本身只是用于传输超文本的网络协议,不会提供任何安全上的保证,使用明文在互联网上传输数据包使得窃听和中间人攻击成为可能,通过
2020年3月3日
其他

为什么 4G/5G 的直播延时依然很高

决定了关键帧的间隔,也决定了客户端在找到第一个可以播放的关键帧的时间,进而影响流媒体直播的延迟,这种秒级别的延迟对于视频直播业务来说影响还是比较明显的,GOP
2020年2月25日
其他

Go 语言网络轮询器的实现原理

系统调用时,应用程序会从用户态陷入内核态,内核会检查文件描述符是否可读;当文件描述符中存在数据时,操作系统内核会将准备好的数据拷贝给应用程序并将控制权交回。blocking-io-mode图
2020年2月20日
其他

为什么 TCP/IP 协议会拆分数据

如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。
2020年2月18日
其他

谈元编程与表达能力

在这篇文章中,作者会介绍不同的编程语言如何增强自身的表达能力,在写这篇文章的时候其实就已经想到这可能不是一篇有着较多受众和读者的文章。不过作者仍然想跟各位读者分享一下对不同编程语言的理解,同时也对自己的知识体系进行简单的总结。metaprogramming当我们刚刚开始学习和了解编程这门手艺或者说技巧时,一切的知识与概念看起来都非常有趣,随着学习的深入和对语言的逐渐了解,我们可能会发现原来看起来无所不能的编程语言成为了我们的限制,尤其是在我们想要使用一些元编程技巧的时候,你会发现有时候语言限制了我们的能力,我们只能一遍一遍地写重复的代码来解决本可以轻松搞定的问题。元编程元编程(Metaprogramming)是计算机编程中一个非常重要、有趣的概念,维基百科
2020年2月13日
其他

调度系统设计精要

系统设计精要是一系列深入研究系统设计方法的系列文章,文中不仅会分析系统设计的理论,还会分析多个实际场景下的具体实现。这是一个季更或者半年更的系列,如果你有想要了解的问题,可以在文章下面留言。调度是一个非常广泛的概念,很多领域都会使用调度这个术语,在计算机科学中,调度就是一种将任务(Work)分配给资源的方法[^1]。任务可能是虚拟的计算任务,例如线程、进程或者数据流,这些任务会被调度到硬件资源上执行,例如:处理器
2020年2月2日
其他

为什么 Go 语言没有泛型?

https://github.com/golang/proposal/blob/master/design/15292/2010-06-type-functions.mdGeneralized
2020年1月21日
其他

八个字节的 UDP 如何传输数据

上面提到的这种各司其职的设计源于网络通讯协议的分层结构。抽象是计算机科学中的基础概念,通过定义良好的接口、构建抽象层,我们可以减少同时需要关注的问题,让每一层都能聚焦到需要处理的问题上。TCP/IP
2020年1月14日
其他

为什么 TCP 会被 UDP 取代

使用三次握手建立连接应该是全世界所有工程师都十分了解的知识点,三次握手的主要目的是避免历史错误连接的建立并让通信的双方确定初始序列号[^12],然而三次握手的成本相当高,在不丢包的情况下,它需要建立
2020年1月7日
其他

身份证上的 ID 能保证唯一性么?

冲突或者乱序,从而失去其唯一性;这个算法中涉及的时间戳、数据中心标识符、机器标识符都没有办法解决唯一性的问题,哪怕这三者完全相等,最终还是有冲突的可能,我们仍然需要使用无其他意义的序列号来保证
2019年12月10日
其他

为什么基础服务不应该高可用

我们在这篇文章中分析了『为什么基础服务不应该高可用』这一问题,这一个乍听起来没什么道理的观点还是非常值得我们去深入思考和探索的,简单总结一下,基础服务不需要保证高可用的几个原因:
2019年12月3日
其他

技术文章配图指南

作者在最开始画图时都会使用不同的配色方案,但是大多数的配色如果长时间使用并且每天接触确实会有一定的审美疲劳,这时就会选择进行更换,你可以在通过下面的链接在历史的博客中查看作者使用过的配色方案:
2019年11月28日
其他

为什么使用 MD5 存储密码非常危险

当我们将验证用户密码的成本提高几个数量级时,攻击者的成本其实也相应的提升了几个数量级,只要我们让攻击者的攻击成本大于硬件的限制,同时保证正常请求的耗时在合理范围内,我们就能够保证用户密码的相对安全。
2019年11月26日
其他

为什么 DNS 使用 UDP 协议

如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。
2019年11月19日
其他

为什么你应该使用 Git 进行版本控制

虽然在实现上所有的节点都是等同的,但是在实际操作中我们还可能会有一个或者多个主仓库帮助多个开发者同步代码,各个节点之间的关系更像一个可以分叉的树形结构,与中心化的版本控制系统相比,通过分布式的模型:
2019年11月12日
其他

为什么 TCP 建立连接需要三次握手

很多人尝试回答或者思考这个问题的时候其实关注点都放在了三次握手中的三次上面,这确实很重要,但是如果重新审视这个问题,我们对于『什么是连接』真的清楚?只有知道连接的定义,我们才能去尝试回答为什么
2019年11月6日
其他

为什么使用通信来共享内存

在收到这条消息之后就可以根据该消息进行一些计算任务;从这个过程来看,消息在被发送前只由发送方进行访问,在发送之后仅可被唯一的接受者访问,所以从这个设计上来看我们就避免了线程竞争。
2019年10月29日
其他

为什么 Redis 选择单线程模型

引入了多线程,我们就必须要同时引入并发控制来保证在多个线程同时访问数据时程序行为的正确性,这就需要工程师额外维护并发控制的相关代码,例如,我们会需要在可能被并发读写的变量上增加互斥锁:
2019年10月21日
其他

Go 语言反射的实现原理

语言反射的三大法则,这能够帮助我们更好地理解反射的作用。从接口值可反射出反射对象;从反射对象可反射出接口值;要修改反射对象,其值必须可设置;第一法则反射的第一条法则就是,我们能够将
2019年10月15日
其他

Go 语言调度器与 Goroutine

模型,包括它们各自的数据结构以及状态,除此之外我们还通过一些常见的场景介绍调度器的工作原理以及不同数据结构之间的协作关系,相信能够对各位读者理解调度器有一定的帮助。ReferenceThe
2019年10月10日
其他

如何写出优雅的 Golang 代码

其实还有其他的复杂度限制,例如循环复杂度(CyclomaticComplexity),这些复杂度的限制都是为了保证函数的简单和容易理解。组织方式如何对测试进行组织也是一个值得讨论的话题,Golang
2019年5月31日
其他

分布式事务的实现原理

后,如果长时间没有得到协调者的响应,在默认情况下,参与者会自动将超时的事务进行提交,不会像两阶段提交中被阻塞住;上述的图片非常清楚地说明了在不同阶段,协调者或者参与者的超时会造成什么样的行为。XA
2019年1月24日
其他

谈 Kubernetes 的架构设计与实现原理

管理器运行了一系列的控制器进程,这些进程会按照用户的期望状态在后台不断地调节整个集群中的对象,当服务的状态发生了改变,控制器就会发现这个改变并且开始向目标状态迁移。最后的
2018年11月26日