前端的节流和防抖
5月 16, 2021
工作中排查数据问题发现了前端按钮可能会触发两次点击的情况,这个问题除了要在后端做幂等以外,正好最近我也在做一些前端的工作,也就专门研究了下前端的解决方案。本来要解决的是防抖问题,但是查了些资料发现一般都是防抖和节流一起,它们解决方案相似但又不完全相同,下面就分别介绍下方便对比使用。 防抖(debounce)# 问题描述# 防抖很容易理解,有时如果鼠标连按,那么在很短的时间内就会触发两次点击,从而触 …
操作系统的设备管理
4月 28, 2021
计算机除了 CPU、内存、硬盘,还需要各种设备才能实现对计算机的操作。本文讨论计算机是如何管理设备的输入输出的。 设备控制器# 设备控制器接收 CPU 发来的命令,去控制 I/O 设备工作,使 CPU 从繁杂缓慢的设备控制事务中解放出来。当 CPU 要操作 I/O 设备时,首先要启动这个设备,一方面将启动命令发送给设备控制器,另一方面通过地址线将 I/O 设备的地址发给设备控制器,设备控制器对收到 …
操作系统的文件系统
4月 22, 2021
文件是操作系统进行存储时使用最多的抽象之一,在 Linux 中,一切皆文件。本文以 Linux 为例,介绍下文件系统中的基础概念。 数据结构# 每个文件实质上是一个有名字的字符序列,序列的内容为文件数据(file data),而序列的长度、序列的修改时间等描述文件数据的属性等其他信息称为文件元数据(file metadata)。 块(block)# 通常来说,文件系统将文件数据保存在存储设备中,操 …
“结点”还是“节点”?
4月 8, 2021
“结点” 还是 “节点” ?# 刷题时,总会遇到“节点”和“结点”的词汇混用,非常困惑,查了一下,一般认为: 节点是一个实体,它具有处理的能力,比如网络上的一台计算机。 结点是一个交叉点、一个标记,算法中的点一般都称为结点,数据集合中的每一个数据元素都用中间标有元素值的方框来表示,我们称它为结点。 所以我们在看《算法导论》的时候,大部分是结点。在讨论服务架构的时候,一般就是节点了,英文里好像都 …
实现限流的几种方案
4月 4, 2021
限流是服务在高并发的情况下,通过限制处理请求的速率,以达到保证服务不过载的目的,实现高可用和稳定性的目标。限流的方案一般有计数法、滑动窗口、漏桶、令牌桶几种,其中各有各的特点,通常需要根据场景采用不同的方案。 计数法# 相对于滑动窗口,计数法也叫固定窗口。就是说接口在固定时间内的访问次数不能超过多少个,在实现的时候,假设限流为每分钟 100 个请求,设置一个开始时间 start …
Go 程序是怎样跑起来的? R
3月 31, 2021
Go 程序是怎么跑起来的?面对问题我第一反应是,Go 是静态编译型语言,和 C 语言一样,就是编译、链接那一套,尤其是最近对着 Go 的一些资料看感觉又学习了一遍编译原理。编译原理的内容本身就很深,本文仅以我暂时理解到的视角进行总结,参考资料列在了最下面。 编译器总览# 典型的编译器(Compiler)如 LLVM 分为编译器前端、优化器和编译器后端。其中,前端专注于词法分析、解析语法和语义分析, …
Go 语言的垃圾回收机制概览
3月 22, 2021
之前已经看过了 常见的垃圾回收算法,有了一定的基础,现在再来了解下 Go 语言的垃圾回收机制。 三色抽象# Go 语言如今已经演变成增量式的垃圾回收策略,即不是一口气运行 GC,而是和 Mutator 交替运行的,因此不会长时间妨碍到 Mutator 的运行。Go 语言增量式回收是基于“标记-清除”算法的一种优化思路,具体的实现是三色标记法。 简单来说,三色标记算法将程序中的对象分成白色、黑色和灰 …
Go 语言的内存管理机制概览
3月 9, 2021
程序中的数据和变量在运行时会被分配到程序所在的虚拟内存中,内存空间包含两个重要的区域:堆(heap)和栈(stack),函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存由编译器进行管理。 用户程序(Mutator)通过内存分配器(Allocator)在堆上申请的内存,垃圾回收器(Collector)负责回收堆上的内存空间。可以说内存分配器和垃圾回收器共同管理着 Go 语言的堆内存。 …
常见的垃圾回收算法 R
2月 28, 2021
本来想直接看下 Go 的垃圾回收机制,但是发现自己现在对内存管理和垃圾回收的了解都比较少,所以只能先来研究下常见的垃圾回收算法了,本篇即是《垃圾回收的算法与实现》的学习笔记,目标是能够描述清楚各种 GC 算法的复杂度、优缺点。 基础概念# GC(Garbage Collection)# 即垃圾回收,是管理堆中已分配对象的机制。 对象(Object)# 对象在 GC 里的概念是:应用程序使用的数据的 …
Go 语言中的拷贝和传值
2月 25, 2021
同很多其他语言如 Python、JavaScript 一样,在 Go 中涉及到复制数据的场景也需要注意深拷贝和浅拷贝的问题。 深拷贝和浅拷贝# Go 的数据类型可以分为值类型和引用类型两种。值类型的变量和变量的数据都是存储在栈中,Int、Float、Bool、Array、Sturct、String 等都是值类型。引用类型的变量为一串地址,存储在栈中, …