Skip to content

Commit eea0f76

Browse files
committed
add image for sem
1 parent dee5fb5 commit eea0f76

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

semaphore.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,111 @@ func semroot(addr *uint32) *semaRoot {
4444
}
4545
```
4646

47+
```
48+
┌─────┬─────┬─────┬─────┬─────┬────────────────────────┬─────┐
49+
│ 0 │ 1 │ 2 │ 3 │ 4 │ ..... │ 250 │
50+
└─────┴─────┴─────┴─────┴─────┴────────────────────────┴─────┘
51+
│ │
52+
│ │
53+
└──┐ └─┐
54+
│ │
55+
│ │
56+
▼ ▼
57+
┌─────────┐ ┌─────────┐
58+
│ struct │ │ struct │
59+
├─────────┴─────────┐ ├─────────┴─────────┐
60+
│ root semaRoot │──┐ │ root semaRoot │──┐
61+
├───────────────────┤ │ ├───────────────────┤ │
62+
│ pad │ │ │ pad │ │
63+
└───────────────────┘ │ └───────────────────┘ │
64+
│ │
65+
┌────────────────┘ ┌────────────────┘
66+
│ │
67+
│ │
68+
▼ ▼
69+
┌──────────┐ ┌──────────┐
70+
│ semaRoot │ │ semaRoot │
71+
├──────────┴────────┐ ├──────────┴────────┐
72+
│ lock mutex │ │ lock mutex │
73+
├───────────────────┤ ├───────────────────┤
74+
│ treap *sudog │ │ treap *sudog │
75+
├───────────────────┤ ├───────────────────┤
76+
│ nwait uint32 │ │ nwait uint32 │
77+
└───────────────────┘ └───────────────────┘
78+
```
79+
80+
treap 结构:
81+
82+
```
83+
┌──────────┐
84+
┌─┬─▶│ sudog │
85+
│ │ ├──────────┴────────────┐
86+
┌─────────────────────┼─┼──│ prev *sudog │
87+
│ │ │ ├───────────────────────┤
88+
│ │ │ │ next *sudog │────┐
89+
│ │ │ ├───────────────────────┤ │
90+
│ │ │ │ parent *sudog │ │
91+
│ │ │ ├───────────────────────┤ │
92+
│ │ │ │ elem unsafe.Pointer │ │
93+
│ │ │ ├───────────────────────┤ │
94+
│ │ │ │ ticket uint32 │ │
95+
│ │ │ └───────────────────────┘ │
96+
│ │ │ │
97+
│ │ │ │
98+
│ │ │ │
99+
│ │ │ │
100+
│ │ │ │
101+
│ │ │ │
102+
▼ │ │ ▼
103+
┌──────────┐ │ │ ┌──────────┐
104+
│ sudog │ │ │ │ sudog │
105+
├──────────┴────────────┐ │ │ ├──────────┴────────────┐
106+
│ prev *sudog │ │ │ │ prev *sudog │
107+
├───────────────────────┤ │ │ ├───────────────────────┤
108+
│ next *sudog │ │ │ │ next *sudog │
109+
├───────────────────────┤ │ │ ├───────────────────────┤
110+
│ parent *sudog │───┘ └─────────────────────────│ parent *sudog │
111+
├───────────────────────┤ ├───────────────────────┤
112+
│ elem unsafe.Pointer │ │ elem unsafe.Pointer │
113+
├───────────────────────┤ ├───────────────────────┤
114+
│ ticket uint32 │ │ ticket uint32 │
115+
└───────────────────────┘ └───────────────────────┘
116+
```
117+
118+
```
119+
┌──────────┐ ┌──────────┐ ┌──────────┐
120+
│ sudog │ ┌─────▶│ sudog │ ┌─────▶│ sudog │
121+
├──────────┴────────────┐ │ ├──────────┴────────────┐ │ ├──────────┴────────────┐
122+
│ waitlink *sudog │─────┘ │ waitlink *sudog │──────┘ │ waitlink *sudog │
123+
├───────────────────────┤ ├───────────────────────┤ ├───────────────────────┤
124+
│ waittail *sudog │ │ waittail *sudog │ │ waittail *sudog │
125+
└───────────────────────┘ └───────────────────────┘ └───────────────────────┘
126+
```
127+
128+
```
129+
┌──────────┐
130+
│ sudog │
131+
├──────────┴────────────┐
132+
│ waitlink *sudog │
133+
├───────────────────────┤
134+
│ waittail *sudog │───────────────────────────────────────────────────────────┐
135+
└───────────────────────┘ │
136+
┌──────────┐ │
137+
│ sudog │ │
138+
├──────────┴────────────┐ │
139+
│ waitlink *sudog │ │
140+
├───────────────────────┤ │
141+
│ waittail *sudog │─────────────────────────┤
142+
└───────────────────────┘ ▼
143+
┌──────────┐
144+
│ sudog │
145+
├──────────┴────────────┐
146+
│ waitlink *sudog │
147+
├───────────────────────┤
148+
│ waittail *sudog │
149+
└───────────────────────┘
150+
```
151+
47152
## 对外封装
48153

49154
在 sema.go 里实现的内容,用 `go:linkname` 导出给 sync、poll 库来使用,也是在链接期做了些手脚:

0 commit comments

Comments
 (0)