Skip to content

Commit

Permalink
update +_posts/Tech/Go/2019-09-14-golang垃圾回收.md _posts/Tech/Go/2022-0…
Browse files Browse the repository at this point in the history
…4-24-go之QA.md _posts/Tech/computerNetwork/2019-01-01-计算机网络复习.md
  • Loading branch information
mafulong committed Jan 20, 2025
1 parent a99f2fb commit b780b67
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 4 deletions.
1 change: 0 additions & 1 deletion _posts/Tech/Go/2019-09-14-golang垃圾回收.md
Original file line number Diff line number Diff line change
Expand Up @@ -625,4 +625,3 @@ struct CardTable {
- 需要时,增大 GOGC 的值,降低 GC 的运行频率。



74 changes: 73 additions & 1 deletion _posts/Tech/Go/2022-04-24-go之QA.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,76 @@ C++ 和 Go 在定义接口方式上的不同,也导致了底层实现上的不

## 版本更新

在 Go 1.22 中,`for` 循环中的迭代变量会被重新分配,每次循环迭代中都会创建一个新的变量。这种改动确保了闭包捕获的是**每次迭代中独立的变量副本**
在 Go 1.22 中,`for` 循环中的迭代变量会被重新分配,每次循环迭代中都会创建一个新的变量。这种改动确保了闭包捕获的是**每次迭代中独立的变量副本**



todo

## go内存分配



Go语言的内存分配算法主要依赖于**tcmalloc**的思想,并针对自身需求进行了优化

`tcmalloc`(Thread-Caching Malloc)是 Google 开发的一种高效的内存分配器,其核心思想是通过减少线程间的锁争用和优化内存分配的碎片管理,来提升多线程环境下的内存分配性能。以下是其关键设计思想和机制:

------

### 1. **线程本地缓存**

`tcmalloc` 的核心特点是为每个线程维护一个本地缓存(Thread Local Cache, TCache),用于管理小对象的分配和释放。

- **避免全局锁竞争**:线程在分配和释放内存时,优先从本地缓存中获取或释放,减少了访问全局堆的频率,降低了线程间的锁争用。
- **快速分配和释放**:本地缓存通过简单的数据结构(如链表或数组)管理内存块,操作非常高效。

------

### 2. **按大小分类的内存管理**

`tcmalloc` 将内存块分为多个**大小类别(Size Classes)**,并针对每个类别单独管理。

- **小对象**:小于某个阈值的对象(通常为32KB以下)分配到线程本地缓存,并按固定大小的块管理。
- **大对象**:大于阈值的对象直接从全局堆中分配,通常使用分页或直接映射(mmap)。
- **对齐优化**:内存块大小通常是固定的对齐单位(如8字节)的倍数,减少内存碎片并提高访问效率。

------

### 3. **页级管理**

`tcmalloc` 将内存划分为**页(Page)**,每页大小通常为 4KB 或 8KB,作为内存分配的基本单位。

- **Span**:多个连续的页组成一个 `Span`,用于管理同一大小类别的内存块。
- **Span 分配与回收**:当线程本地缓存需要新内存时,从全局堆中获取一个 `Span`;释放内存时,空闲的 `Span` 会被合并并归还到全局堆中。

------

### 4. **内存回收与共享**

`tcmalloc` 实现了高效的内存回收机制,以平衡线程本地缓存与全局堆之间的内存使用。

- **缓存溢出**:当线程本地缓存中的内存超出一定阈值时,部分空闲块会被归还到全局堆。
- **全局共享**:当某个线程需要分配内存且本地缓存不足时,可以从全局堆获取所需的 `Span`

------

### 5. **内存碎片优化**

`tcmalloc` 的设计尽量减少内存碎片,通过以下策略实现:

- **固定大小类别**:通过分类管理,减少小对象分配带来的碎片。
- **内存合并**:回收空闲 `Span` 时,尝试合并相邻的页。
- **延迟释放**:小对象的内存释放延迟归还到全局堆,提高内存重用率。

------

### 6. **线程安全与并发优化**

`tcmalloc` 使用细粒度锁或无锁算法(如原子操作)来管理全局堆,保证线程安全的同时尽量减少锁的开销。

------

### 总结

`tcmalloc` 的主要思想是**“线程本地缓存 + 按大小分类管理 + 高效的内存回收”**,通过分层的内存分配与回收机制,提升了多线程环境下的性能,同时减少了内存碎片。

Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ SSH之所以能够保证安全,原因在于它采用了公钥加密,这个

如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就不存在了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。那么SSH协议是怎样应对的呢?

#### 口令登录
**用户需确认**:客户端通常会提示用户确认这个公钥是否可信,用户需手动确认。

后续每次连接时,SSH 客户端会检查 `~/.ssh/known_hosts` 文件中的记录,验证远程主机的公钥是否匹配。这种机制通过主机密钥的比对,可以有效防止中间人攻击。


让用户手动确定是否同意,并给出diff。确认后会缓存,之后不会warning.

#### 公钥登录

Expand Down

0 comments on commit b780b67

Please sign in to comment.