Skip to content

Commit e5a5066

Browse files
committed
feat: init
1 parent bef0860 commit e5a5066

File tree

5 files changed

+172
-33
lines changed

5 files changed

+172
-33
lines changed

01语言/1go/21锁.md

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#
2+
3+
## 实现方式
4+
基于信号量来实现
5+
6+
## 信号量
7+
### runtime_Semacquire:协程阻塞与休眠​
8+
```go
9+
// 阻塞当前协程,直到信号量 s 被释放
10+
// lifo 控制唤醒顺序(true 表示后进先出,用于自旋优化)
11+
// skipframes 表示堆栈跟踪跳过的帧数
12+
func runtime_Semacquire(s *uint32, lifo bool, skipframes int)
13+
```
14+
#### 核心逻辑
15+
- 快速检查​​:先尝试原子操作减少信号量值,若成功则直接返回(无需阻塞)`atomic.Xadd(s, -1) >= 0`
16+
- 加入等待队列​​:创建 sudog 结构体,表示当前等待的协程,将 sudog 加入与信号量关联的队列。
17+
- 进入休眠​​:调用操作系统原语让出 CPU,进入阻塞状态,Linux​​:通过 futex(FUTEX_WAIT_PRIVATE, ...) 系统调用休眠。
18+
19+
### runtime_Semrelease:协程唤醒与调度​
20+
```go
21+
// 释放信号量,唤醒一个或多个等待协程
22+
// handoff 表示是否强制转移锁所有权(用于饥饿模式)
23+
// skipframes 表示堆栈跟踪跳过的帧数
24+
func runtime_Semrelease(s *uint32, handoff bool, skipframes int)
25+
```
26+
#### 核心逻辑​
27+
- 原子增加信号量​​:`atomic.Xadd(s, 1)`
28+
- 唤醒等待者:从队列中取出一个 sudog,调用操作系统原语解除阻塞,比如:linux futex(FUTEX_WAKE_PRIVATE, 1) 唤醒一个协程.
29+
- 调度转移
30+
31+
### sudog
32+
```go
33+
type sudog struct {
34+
g *g // 关联的协程
35+
next *sudog // 队列中的下一个元素
36+
prev *sudog // 队列中的上一个元素
37+
elem unsafe.Pointer // 信号量指针
38+
releasetime int64 // 协程被唤醒的时间戳
39+
}
40+
```
41+
42+
## sync.Mutex
43+
### 通俗理解
44+
- 把锁想象成公共厕所​​
45+
- 假设有一个公共厕所(共享资源),很多人(goroutine)想用。但厕所一次只能进一个人。sync.Mutex 就是这个厕所的“管理员”,而 sema 是管理员手里的 ​​“叫号器”​​。
46+
- 叫号器(sema)的作用​​:不是直接管理厕所的门锁,而是管理 ​​排队等待的人​​,不然会不断轮询检查锁状态。
47+
48+
## 一、sync.Mutex核心设计
49+
50+
```go
51+
type Mutex struct {
52+
state int32 // 状态字段
53+
sema uint32 // 是一个信号量(semaphore),用于协程阻塞和唤醒。
54+
}
55+
56+
const (
57+
mutexLocked = 1 << iota // 1 (二进制 001)
58+
mutexWoken // 2 (二进制 010)
59+
mutexStarving // 4 (二进制 100)
60+
)
61+
func (m *Mutex) Lock() {
62+
// 快速路径失败后进入慢路径
63+
if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
64+
return
65+
}
66+
runtime_SemacquireMutex(&m.sema, queueLifo, 1)
67+
}
68+
```
69+
70+
### sema 的核心作用​​
71+
通过操作系统的 ​​睡眠/唤醒原语​​(如 futex)管理协程的阻塞和恢复。
72+
​​关键步骤​​:
73+
​​休眠​​:协程加入队列 → 调用 futex(FUTEX_WAIT) 进入内核态休眠。
74+
​​唤醒​​:释放锁时调用 futex(FUTEX_WAKE) 通知队列中的协程。
75+
76+
77+
1. **状态表示**
78+
- 32位 `state` 字段:低3位表示锁状态,高位记录等待的goroutine数量。
79+
- 状态位:
80+
- `mutexLocked`(第0位):锁是否被持有
81+
- `mutexWoken`(第1位):是否有唤醒的goroutine
82+
- `mutexStarving`(第2位):是否处于饥饿模式
83+
84+
2. **两种模式**
85+
| 模式 | 特点 | 触发条件 |
86+
| ------------ | ----------------------------------------------------- | -------------------- |
87+
| **正常模式** | 允许新goroutine插队竞争,支持自旋优化 | 默认模式 |
88+
| **饥饿模式** | 禁止插队,锁直接交给等待队列队首goroutine(完全公平) | 等待时间 >1ms 时触发 |
89+
90+
## 二、关键流程
91+
1. **加锁(Lock)**
92+
- **快速路径**:直接CAS抢锁(无竞争时)
93+
- **慢速路径**:自旋尝试 → 加入等待队列 → 根据模式竞争/获取锁
94+
95+
2. **解锁(Unlock)**
96+
- **快速路径**:无等待者时直接释放
97+
- **慢速路径**:唤醒等待者,处理模式切换
98+
99+
## 三、性能优化
100+
1. **自旋机制**
101+
- 触发条件:多核CPU + 非饥饿模式 + 短临界区
102+
- 自旋次数:最多4次(约30个CPU时钟周期)
103+
104+
2. **信号量控制**
105+
- 使用 `sema` 字段配合 `runtime_SemacquireMutex`/`runtime_Semrelease` 实现阻塞唤醒
106+
107+
108+
## atomic
109+
原子操作的底层实现依赖于CPU提供的原子指令,不同架构的CPU有不同的实现方式。

01语言/1go/9GPM.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@ M代表一个工作线程,在M上有一个P和G,P是绑定到M上的,G是
8282

8383
---
8484

85+
## 抢占机制的核心流程
86+
- sysmon 监控 goroutine 的运行时间 。
87+
- 检测到超时后,发送抢占信号 。
88+
- 线程(M)接收信号,暂停当前 goroutine 的执行 。
89+
- 保存 goroutine 的执行上下文 。
90+
- 调度器将 goroutine 放入队列,线程切换到其他 goroutine 。
91+
- 抢占后的 goroutine 会在后续被重新调度执行 。
92+
93+
8594
## **GMP设计优势**
8695
| 特性 | 说明 | 收益 |
8796
| ----------------- | ------------------------------------- | ------------------ |

07分布式系统/12熔断.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,15 @@
33
## ​目标​​
44
当依赖服务异常(如超时、错误率上升)时,快速失败并避免级联故障。
55
## ​​场景​​
6-
微服务调用、第三方API依赖、防止服务雪崩。
6+
微服务调用、第三方API依赖、防止服务雪崩。
7+
8+
9+
10+
## go
11+
- [hystrix-go](https://github.com/afex/hystrix-go)
12+
### 核心功能
13+
14+
- ​熔断器(Circuit Breaker)​​:在依赖服务连续失败时自动熔断,避免持续重试加剧故障。
15+
- ​服务降级(Fallback)​​:在熔断或超时后执行预设的降级逻辑,保证核心流程可用。
16+
- ​隔离策略​​:通过线程池或信号量隔离资源,防止单个依赖拖垮整个系统。
17+
- ​实时监控​​:统计请求成功率、延迟等指标,支持动态调整熔断阈值。

13区块链/以太坊.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,9 +261,15 @@ async function processReceiptLogs(transactionReceipt){
261261
"type": "0x2"
262262
}
263263
}
264-
265264
```
266265
266+
267+
#### ​type
268+
- 0x0 Legacy 传统交易(EIP-155 前)
269+
- 0x1 EIP-2930 支持访问列表(Access List)的交易
270+
- ​0x2​​ ​​EIP-1559​​ ​​动态 Gas 定价交易(Base Fee + Priority Fee)
271+
272+
267273
### ETH启动脚本
268274
269275
```shell

16架构/7设计模式.md

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
11
## 设计模式
22

3-
### 通用思想: 高内聚,低耦合
4-
5-
### 具体设计原则
6-
7-
- 单一职责: 把自己的事情管好
8-
- 开闭原则: `开放拓展`就是不影响原有的单元功能,反之`关闭修改`
9-
- 依赖反转: 类之间不依赖具体的细节,依赖抽象接口
10-
11-
```php
12-
interface Writer{
13-
public writer($key,$value=null);
14-
}
15-
class FileWriter implement Writer{
16-
public function write($key,$value=null){}
17-
}
18-
19-
class RedisWriter implement Writer{
20-
public function write($key,$value=null){}
21-
}
22-
class Cache{
23-
protected Writer $writer;
24-
// 依赖注入
25-
public function __contruct(Writer $writer){
26-
$this->wirter=$writer
27-
}
28-
// 依赖抽象,不依赖具体的实现,比如不依赖`FileWriter`的`write`
29-
public function set($key,$value=null){
30-
$this->file_writer->write($key,$value);
31-
}
32-
}
33-
```
3+
4+
## 一、创建型模式
5+
6+
| 模式 | 设计思想 | 使用场景 |
7+
| -------------- | -------------------------------------------- | ---------------------------------------------------- |
8+
| **单例模式** | 确保一个类仅有一个实例,并提供全局访问点 | 配置管理、线程池、数据库连接池等需全局唯一资源的场景 |
9+
| **工厂方法** | 定义创建对象的接口,但由子类决定实例化哪个类 | 需要灵活扩展对象类型(如不同数据库驱动、UI主题组件) |
10+
| **抽象工厂** | 提供一组相关或依赖对象的接口,无需指定具体类 | 跨平台UI库(如不同操作系统下的按钮、文本框家族) |
11+
| **建造者模式** | 分步构建复杂对象,分离构造过程与表示 | 创建包含多个组件的对象(如套餐组合、XML解析器) |
12+
| **原型模式** | 通过复制现有对象来创建新对象,避免重复初始化 | 对象创建成本高(如深拷贝复杂配置对象)、动态加载类 |
13+
14+
---
15+
16+
## 二、结构型模式
17+
18+
| 模式 | 设计思想 | 使用场景 |
19+
| -------------- | ------------------------------------------------------ | ---------------------------------------------------- |
20+
| **适配器模式** | 将不兼容的接口转换为客户端期望的接口 | 整合第三方库(如旧系统接口适配新系统) |
21+
| **装饰器模式** | 动态地为对象添加职责,通过组合替代继承 | 扩展对象功能(如Java IO流、Web请求处理链) |
22+
| **代理模式** | 为其他对象提供代理以控制访问(如延迟加载、权限校验) | 远程调用(RPC)、图片懒加载、AOP切面编程 |
23+
| **组合模式** | 以树形结构组合对象,使客户端统一处理单个对象和组合对象 | 文件系统、UI组件树(如窗口包含面板和按钮) |
24+
| **外观模式** | 提供统一接口简化子系统复杂调用流程 | 封装复杂子系统(如电商下单流程整合支付、库存、物流) |
25+
26+
---
27+
28+
## 三、行为型模式
29+
30+
| 模式 | 设计思想 | 使用场景 |
31+
| -------------- | -------------------------------------------------------- | --------------------------------------------------------------- |
32+
| **策略模式** | 定义算法族,使其可互换,独立于客户端变化 | 支付方式选择、排序算法切换(如按价格或销量排序商品) |
33+
| **观察者模式** | 定义对象间一对多依赖,一个对象状态变化时自动通知依赖对象 | 事件驱动系统(如用户登录后通知日志、邮件服务) |
34+
| **命令模式** | 将请求封装为对象,支持请求排队、日志记录、撤销/重做 | 文本编辑器操作撤销、任务队列(如异步任务调度) |
35+
| **模板方法** | 在父类定义算法骨架,子类实现特定步骤 | 框架流程固定但步骤可变(如JUnit测试生命周期、HTTP请求处理) |
36+
| **责任链模式** | 多个处理器依次处理请求,避免请求发送者与接收者耦合 | 审批流程(如报销多级审批)、Web过滤器链(如权限校验、日志记录) |
37+
| **状态模式** | 允许对象在内部状态改变时改变行为 | 游戏角色状态切换(如正常、中毒、眩晕)、订单状态流转 |

0 commit comments

Comments
 (0)