跳转至

技术博客

回文十进制数

Tip

如果把某个数的各个数字按相反的顺序排列,得到的数和原来的数相同,则这个数就是“回文数”。譬如 123454321 就是一个回文数。

问题: 求用十进制、二进制、八进制表示都是回文数的所有数字中,大于十进制数 10 的最小值。

Go 切片中删除元素的两种方法对比

在 Go 语言中,切片是一个非常常用的数据结构。当我们需要从切片中删除某个元素时,通常有两种实现方法:

  1. 使用 append 方法删除元素。
  2. 使用替换删除法。

本文将对这两种方法进行对比,分析各自的优缺点,并帮助你根据具体需求选择合适的实现方式。

使用 Shell 脚本管理 OpenVPN 守护进程

这篇技术博客涵盖了使用 Shell 脚本管理 OpenVPN 守护进程的完整过程,解释了每个关键步骤,并提供了代码示例。如果你有任何问题或想要进一步探讨,欢迎留言讨论!

GC 垃圾回收算法

垃圾回收(Garbage Collection,简称 GC)是自动内存管理的核心机制。本文将深入介绍 GC 的评价标准以及经典的标记-清除算法。

评价标准

评价 GC 算法的性能时,我们采用以下 4 个标准:

标准 说明
吞吐量 单位时间内的处理能力,即 GC 不占用的时间比例
最大暂停时间 GC 执行时程序暂停的最长时间,影响用户体验
堆使用效率 堆空间的有效利用率,避免内存碎片
访问的局部性 相关对象在内存中的邻近程度,影响 CPU 缓存命中率

GC 标记 - 清除算法(Mark Sweep GC)

GC 标记 - 清除算法由标记阶段和清除阶段构成。标记阶段是把所有活动对象都做上标记的阶段。清除阶段是把那些没有标记的对象,也就是非活动对象回收的阶段。通过这两个阶段,就可以令不能利用的内存空间重新得到利用。

执行 GC 前堆的状态

B-Tree 与崩溃恢复

B-Tree 是一种非常优秀的数据结构,适用于数据库和文件系统等场景。本文将从以下几个角度解析 B-Tree 的特点与实现。

B-Tree 作为平衡的 n 叉树

高度平衡的树

许多实用的二叉树(如 AVL 树或红黑树)被称为**高度平衡树**,即树的高度(从根到叶的深度)被限制为 \(O(\log(N))\),因此查找操作的复杂度为 \(O(\log(N))\)

B-Tree 同样是一种高度平衡的树,其所有叶节点的高度相同,这确保了其良好的查找性能。

B-Tree 数据结构

可能是以前没有接触过类似的数据结构设计,反复阅读了几遍依然有些不太理解。今天,我决定从读者的角度一步一步介绍我对这个数据结构的理解。

一个节点应该包含以下几个部分:

| type | nkeys |  pointers  |   offsets  | key-values | unused |
|  2B  |   2B  | nkeys * 8B | nkeys * 2B |     ...    |        |

每个 key-value 对的格式如下:

| klen | vlen | key | val |
|  2B  |  2B  | ... | ... |

从头开始构建你自己的数据库

数据库有三个核心概念:持久性索引并发性

  1. 持久性:如何避免数据丢失或损坏,并能够从崩溃中恢复;
  2. 索引:如何高效查询和处理数据;
  3. 并发性:如何通过事务处理多个客户端的请求。

用不到 100 行 Go 语言构建自己的容器

原文地址:https://www.infoq.com/articles/build-a-container-golang/

2013 年 3 月 Docker 的开源发布引发了软件开发行业打包和部署现代应用程序方式的重大转变。在 Docker 发布之后,许多相互竞争、相互补充和相互支持的容器技术也随之诞生,这导致了围绕这一领域的许多炒作和一些幻灭。本系列文章旨在揭示其中的一些困惑,并解释容器在企业中的实际使用情况。

本系列文章首先介绍了容器背后的核心技术以及开发人员目前的使用情况,然后探讨了在企业中部署容器所面临的核心挑战,例如将容器化集成到持续集成和持续交付管道中,以及加强监控以支持不断变化的工作负载和潜在的瞬时性。本系列最后展望了容器化的未来,并讨论了 unikernels 目前在前沿组织中发挥的作用。

使用 Go 实现 BitTorrent 客户端

原文地址:https://blog.jse.li/posts/torrent/

BitTorrent 是一个通过网络下载和分发文件的协议。与传统的客户端/服务器关系相比,下载者连接到中央服务器(例如:在 Netflix 上观看电影,或加载您正在阅读的网页),BitTorrent 网络中的参与者(称为对等点)下载彼此之间的文件片段——这就是它成为点对点协议的原因。我们将研究其工作原理,并构建我们自己的客户端,该客户端可以找到同行并在它们之间交换数据。