noblog 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  This package aims to generate static content from notion.so and provide a plugable component/theme market for you bloggers.
4
4
 
5
- the pattern would be like notablog, but more flexiable thanks to the mighty power of Astro
5
+ the pattern would be like notablog (see reference), but more flexiable thanks to the mighty power of Astro
6
6
 
7
7
  # Usage
8
+ yet still experimental and not complete
9
+
8
10
  ```
9
- npm install @humbornjo/noblog
11
+ npm install noblog
10
12
  npx noblog .
11
13
  ```
12
14
 
@@ -27,18 +27,20 @@ async function main() {
27
27
  try {
28
28
  await Promise.all(futures);
29
29
  for (const pageid of Object.keys(nob.MdCollection)) {
30
+ let fpath = sub_dir;
30
31
  if (pages.find(page => page.id === pageid))
31
- nob.SaveJelly(pageid, save_dir, nob.MdCollection[pageid]);
32
- else
33
- nob.SaveJelly(pageid, sub_dir, nob.MdCollection[pageid]);
32
+ fpath = save_dir;
33
+ const log = await nob.SaveJelly(pageid, fpath, nob.MdCollection[pageid]);
34
+ logger.info(log);
34
35
  }
36
+ console.log(`success: finish dump all files to "${save_dir}"`);
35
37
  }
36
38
  catch (error) {
37
39
  if (error instanceof Error) {
38
- console.log(`Failed to dump markdown: ${error.message}`);
40
+ console.log(`failed: consider running with "v=true" - ${error.message}`);
39
41
  }
40
42
  else {
41
- console.log('An unknown error occurred');
43
+ console.log('failed: an unknown error occurred');
42
44
  }
43
45
  }
44
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/cmds/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,IAAI,QAAQ,GAAG,oBAAoB,CAAA;AACnC,IAAI,OAAO,GAAG,KAAK,CAAA;AACnB,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAA;AACxB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE9C,SAAS,IAAI;IACX,MAAM,KAAK,GAAG,0BAA0B,CAAC;IACzC,MAAM,OAAO,GAAG,sBAAsB,CAAC;IAEvC,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC/B,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEtC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;gBACxC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;;gBAEzD,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/cmds/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,IAAI,QAAQ,GAAG,oBAAoB,CAAA;AACnC,IAAI,OAAO,GAAG,KAAK,CAAA;AACnB,MAAM,GAAG,GAAG,IAAI,MAAM,EAAE,CAAA;AACxB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAE9C,SAAS,IAAI;IACX,MAAM,KAAK,GAAG,0BAA0B,CAAC;IACzC,MAAM,OAAO,GAAG,sBAAsB,CAAC;IAEvC,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC/B,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAEtC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,IAAI,KAAK,GAAG,OAAO,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;gBACxC,KAAK,GAAG,QAAQ,CAAA;YAClB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sCAAsC,QAAQ,GAAG,CAAC,CAAA;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,4CAA4C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAA"}
@@ -1,3 +1,2 @@
1
- const Heading1 = "<h1>";
2
1
  export {};
3
2
  //# sourceMappingURL=default.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/lib/nosm/default.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAAG,MAAM,CAAA"}
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/lib/nosm/default.ts"],"names":[],"mappings":""}
@@ -1,2 +1,3 @@
1
+ // noblog style manager
1
2
  export {};
2
3
  //# sourceMappingURL=nosm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nosm.js","sourceRoot":"","sources":["../../../src/lib/nosm/nosm.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"nosm.js","sourceRoot":"","sources":["../../../src/lib/nosm/nosm.ts"],"names":[],"mappings":"AAAA,uBAAuB"}
@@ -242,7 +242,7 @@ $写屏障=插入屏障+删除屏障$
242
242
  可以理解到,如果`y`和`y`链路上的子对象没有被黑色对象引用,那么删除屏障实际上是活佛再世,抬了这些入土半截的对象一手,回收精度是偏低的。
243
243
 
244
244
 
245
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/4bf3ed8a-98c2-4da6-a69b-5cc4b3e582d6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=264ce37adb9c67deb1bf602067f2a9b9279ae0f302f71f572491b2c06e1f2101&X-Amz-SignedHeaders=host&x-id=GetObject)
245
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/4bf3ed8a-98c2-4da6-a69b-5cc4b3e582d6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=4898733c3d04b2e26384a303b44a25265aec033f072a3fe4c1c0c8017b47acc1&X-Amz-SignedHeaders=host&x-id=GetObject)
246
246
 
247
247
 
248
248
  那么混合写屏障呢?
@@ -41,7 +41,7 @@ To understand signal, we need to know its,
41
41
  ### **data structure**
42
42
 
43
43
 
44
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/262f41a6-16b5-45d4-9c27-3ac1a41da67c/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=7476280a06453e916fae7eed9b905bdde05ce4dc09ddda8d82f0b05a3bc53828&X-Amz-SignedHeaders=host&x-id=GetObject)
44
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/262f41a6-16b5-45d4-9c27-3ac1a41da67c/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=5262656c4ee017cfdf6c097dc550293574e52c10563aba4739cd088900f368a1&X-Amz-SignedHeaders=host&x-id=GetObject)
45
45
 
46
46
 
47
47
  Ok, if we don’t dive too deep, that’s it. An array of **bits**. If the bit is set, the according signal is received, otherwise not received. You can google the mapping between number and signal if you are interested.
@@ -129,25 +129,25 @@ $OM(2)$ step 1
129
129
 
130
130
 
131
131
 
132
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/acc0db25-6a8b-48a0-9f29-4ccbd8f8259f/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=3f538a9c5391ecc7b481743e32c8fb7e5c815009b1823e22ab3441d585fc8142&X-Amz-SignedHeaders=host&x-id=GetObject)
132
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/acc0db25-6a8b-48a0-9f29-4ccbd8f8259f/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=3880633858ecef2396af0d6910cf4d9a7b3015a12e1d45a7a1faa31857ad4ad5&X-Amz-SignedHeaders=host&x-id=GetObject)
133
133
 
134
134
 
135
135
  $OM(1)$ step 1,这里进入第一层迭代,以第一个忠诚节点为例
136
136
 
137
137
 
138
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7062a889-ed50-4cf0-9b5e-961afa8a4194/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=e19b196dd4341c3e1b8d1cc63efbd43a97fa10464c6271d9c7993245348de562&X-Amz-SignedHeaders=host&x-id=GetObject)
138
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7062a889-ed50-4cf0-9b5e-961afa8a4194/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=ba78bb8dbe6ec82b06b19aac9968dccb2702f07f8260fa85fd7535d49ee247f1&X-Amz-SignedHeaders=host&x-id=GetObject)
139
139
 
140
140
 
141
141
  $OM(1)$ step 2
142
142
 
143
143
 
144
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5228b720-4acc-40c8-8cdc-c53a7215daae/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=d17ed59225212aa07916cee2e512f86098fc70d8ae4ab2ff31281e33f51af522&X-Amz-SignedHeaders=host&x-id=GetObject)
144
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5228b720-4acc-40c8-8cdc-c53a7215daae/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=d88fb1b87a08f91dc2ad1ac39d557dfa2baf9b3b73a9f6c215bf873a963c61cf&X-Amz-SignedHeaders=host&x-id=GetObject)
145
145
 
146
146
 
147
147
  $OM(1)$ step 3
148
148
 
149
149
 
150
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/61fba768-14e2-4b99-8562-e18f6b2ca8c5/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=15409cdb1dfb99a450c86557585f080b3fe8034522f02acb8c2473ce4c554ce1&X-Amz-SignedHeaders=host&x-id=GetObject)
150
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/61fba768-14e2-4b99-8562-e18f6b2ca8c5/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=3df4f0e3f0923e886130c3e1ae9551b5312a8e3ed73571a61d70e00efee6c16b&X-Amz-SignedHeaders=host&x-id=GetObject)
151
151
 
152
152
 
153
153
  以此类推还有五次 $OM(1)$ 需要完成,对于忠诚节点为 commander 的情况来说,都是一样的,这里再过一遍叛徒是 commander 的情况
@@ -156,31 +156,31 @@ $OM(1)$ step 3
156
156
  $OM(1)$ step 1,这里进入第一层迭代,以叛徒为例,这里 $a,b,c,d,e$ 只是一个代数,它们可以等于任何一个决策。
157
157
 
158
158
 
159
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b241f8d4-bee5-400d-a11e-cb74f93658d9/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=40d1d12af3ed4d2f71e313f0db32f7be3a9feefa09c7d815c916ec1a46e65e66&X-Amz-SignedHeaders=host&x-id=GetObject)
159
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b241f8d4-bee5-400d-a11e-cb74f93658d9/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=dac98d631696a9a4972c4d0b3f644b58301fb1364e87169b561803d2b6cb61ff&X-Amz-SignedHeaders=host&x-id=GetObject)
160
160
 
161
161
 
162
162
  $OM(1)$ step 2
163
163
 
164
164
 
165
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/fc9f4ed5-b02c-4ada-bc4b-40f8f9fb94c5/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=9d7ab6146527a6a1711d2102aed24e6903647a37d046d176f0858868330ab402&X-Amz-SignedHeaders=host&x-id=GetObject)
165
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/fc9f4ed5-b02c-4ada-bc4b-40f8f9fb94c5/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=a03cdc7c982ef7b7920cb87afa850b7264631ed79c38fbfc9c2a3c7868c389c1&X-Amz-SignedHeaders=host&x-id=GetObject)
166
166
 
167
167
 
168
168
  $OM(1)$ step 3,就算有着叛徒,我们发现此时,所有节点的决策向量也是一样的。此时可能没有一个决策占了多数,所以我们姑且让没有达成一致时的默认决策为 $D$ 。
169
169
 
170
170
 
171
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/37b91780-4da9-42dd-b2b9-c648df767b72/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=ae8d50b38d909a0f52413255535a51ecdfcc151a4b7ec4d565e114e2d662acf5&X-Amz-SignedHeaders=host&x-id=GetObject)
171
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/37b91780-4da9-42dd-b2b9-c648df767b72/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=a805124cb1c12de57225d596a10efe65c7214b318ac9d3680e730623fc9c0b1c&X-Amz-SignedHeaders=host&x-id=GetObject)
172
172
 
173
173
 
174
174
  OK,回到主线,$OM(2)$ step2
175
175
 
176
176
 
177
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0cabd3a8-0dd5-4a81-ac07-c99df7ff0676/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=68d2cec2b771b05bccebc950bc454be04852d87c4f40dab3764f254eac1f3c59&X-Amz-SignedHeaders=host&x-id=GetObject)
177
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0cabd3a8-0dd5-4a81-ac07-c99df7ff0676/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=4ebecc5888dfcd5e35ab3ad49570125b406b9b5808a6bab3f09702b6aba4757f&X-Amz-SignedHeaders=host&x-id=GetObject)
178
178
 
179
179
 
180
180
  整理向量,得到最后的 $OM(2)$ step 3
181
181
 
182
182
 
183
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ea116a62-b669-4944-aaf0-6a2f766cd9e6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092415Z&X-Amz-Expires=3600&X-Amz-Signature=00c20643349a791593ec9cb885dea733663e0837fa79b764c1573861835bad42&X-Amz-SignedHeaders=host&x-id=GetObject)
183
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ea116a62-b669-4944-aaf0-6a2f766cd9e6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100307Z&X-Amz-Expires=3600&X-Amz-Signature=74ff2540f9746a0a45eef41bd0082d5e1e501010be9f7096eb87b2ee762302ac&X-Amz-SignedHeaders=host&x-id=GetObject)
184
184
 
185
185
 
186
186
  可以朴素地认为,算法的核心就是为了使忠诚节点的最终结果一致。
@@ -51,13 +51,13 @@ For more information about this error, try `rustc --explain E0596`.
51
51
  According to the hint from compiler, the key is trait `DerefMut`
52
52
 
53
53
 
54
- ![Screenshot_2023-09-06_at_10.55.17.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0fdecccd-4415-4ee2-8ab9-32baf08b345d/Screenshot_2023-09-06_at_10.55.17.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092428Z&X-Amz-Expires=3600&X-Amz-Signature=46cf1cfb1454b25b4018dbd583176e2ec3be87135ed1b4ba751c0a72639bcd2a&X-Amz-SignedHeaders=host&x-id=GetObject)
54
+ ![Screenshot_2023-09-06_at_10.55.17.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0fdecccd-4415-4ee2-8ab9-32baf08b345d/Screenshot_2023-09-06_at_10.55.17.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100314Z&X-Amz-Expires=3600&X-Amz-Signature=d701a0b3c058f39d87bca3243d321dbca7d5ee019d0b0a51476f40c165ae914c&X-Amz-SignedHeaders=host&x-id=GetObject)
55
55
 
56
56
 
57
57
  Yyyyyyyyyyes, Arc only implements `Deref` rather than `DerefMut`[.](http://derefmut.so/) So only the method that called by `&self` can be adjusted. That’s why Mutex has to be wrapped outside the target value to complete the chain-style dereference: **`Arc`** `-Deref→` **`Mutex`** `-DerefMut→` **`value`**
58
58
 
59
59
 
60
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/6d3b11fc-4fbb-4157-b6e0-8de32cb9113e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092428Z&X-Amz-Expires=3600&X-Amz-Signature=b28e01afd626ef338ea2f278928decf773eff05a9c2d65a0434aaf2343e3c52f&X-Amz-SignedHeaders=host&x-id=GetObject)
60
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/6d3b11fc-4fbb-4157-b6e0-8de32cb9113e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100314Z&X-Amz-Expires=3600&X-Amz-Signature=b32cddfd0235c9b0c93b65606d150e0a6ae6694e7b4489e59bc09db2cddf2b4f&X-Amz-SignedHeaders=host&x-id=GetObject)
61
61
 
62
62
 
63
63
 
@@ -46,7 +46,7 @@ Go 程序的执行由两层组成:Go Program,Runtime,即用户程序和运
46
46
  一个展现了全景式的关系如下图:
47
47
 
48
48
 
49
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/9ab2a8a7-c9ab-4d95-8a5f-2219890d8784/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092513Z&X-Amz-Expires=3600&X-Amz-Signature=e29ad2c98a463ef6656bb0ed29f07323d9bed5a19da4ea33fc531e194c0526da&X-Amz-SignedHeaders=host&x-id=GetObject)
49
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/9ab2a8a7-c9ab-4d95-8a5f-2219890d8784/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100406Z&X-Amz-Expires=3600&X-Amz-Signature=a91d76ae484ccf8ff9926069bbfe9c029cd08fd393fd28c74f5db8021d4ef743&X-Amz-SignedHeaders=host&x-id=GetObject)
50
50
 
51
51
 
52
52
  ## 为什么要 scheduler
@@ -91,7 +91,7 @@ Go scheduler 的目标:
91
91
  > For scheduling goroutines onto kernel threads.
92
92
 
93
93
 
94
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ead3479c-69e8-4caa-a37b-cfabf272a625/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092513Z&X-Amz-Expires=3600&X-Amz-Signature=5049fd229a2bb02ab3c55b6d3a5818d1da5a4aa10ec298cd284f2bd6a763c0e3&X-Amz-SignedHeaders=host&x-id=GetObject)
94
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ead3479c-69e8-4caa-a37b-cfabf272a625/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100406Z&X-Amz-Expires=3600&X-Amz-Signature=605013b7b491e5c2d78bdb0a96c907762655f50e728f169c29e8f9b19ac71f2b&X-Amz-SignedHeaders=host&x-id=GetObject)
95
95
 
96
96
 
97
97
  Go scheduler 的核心思想是:
@@ -115,7 +115,7 @@ Go scheduler 的核心思想是:
115
115
  Go scheduler 会启动一个后台线程 sysmon,用来检测长时间(超过 10 ms)运行的 goroutine,将其调度到 global runqueues。这是一个全局的 runqueue,优先级比较低,以示惩罚。
116
116
 
117
117
 
118
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5ddecc44-7681-48da-a481-6b21198552cb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092513Z&X-Amz-Expires=3600&X-Amz-Signature=70a3c0490da55365b19641dbf4c41d91cd43d3ca16f5a4a9d536829b5303e22b&X-Amz-SignedHeaders=host&x-id=GetObject)
118
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5ddecc44-7681-48da-a481-6b21198552cb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100406Z&X-Amz-Expires=3600&X-Amz-Signature=91f4a2dc5fd5a5951630c903027d35c9a34046cb49985236ecdbb30694135e27&X-Amz-SignedHeaders=host&x-id=GetObject)
119
119
 
120
120
 
121
121
  # M:N model
@@ -149,7 +149,7 @@ go程序初始化时,会先
149
149
  `newproc`用于创建运行`main func`的goroutine,循环调用`schedule`函数直到函数结束。
150
150
 
151
151
 
152
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/a2d5d40c-be21-4ffa-a0d4-66e4535ca5ee/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092513Z&X-Amz-Expires=3600&X-Amz-Signature=713919677720eb13ecc6c8162b8f0b427dc261d74f25be1407af3da4a868d4b9&X-Amz-SignedHeaders=host&x-id=GetObject)
152
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/a2d5d40c-be21-4ffa-a0d4-66e4535ca5ee/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100407Z&X-Amz-Expires=3600&X-Amz-Signature=6be3390101a64860c3b13edcac578e48fd47858352966d136adf4cf9c36384bc&X-Amz-SignedHeaders=host&x-id=GetObject)
153
153
 
154
154
 
155
155
  # schedt
@@ -79,7 +79,7 @@ type waitq struct {
79
79
  例如,创建一个容量为 6 的,元素为 int 型的 channel 数据结构如下 :
80
80
 
81
81
 
82
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/df15b4b7-c1b1-4089-9a9c-c6dc82c5da45/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092503Z&X-Amz-Expires=3600&X-Amz-Signature=55e7b584e9be3e4fda8adfe26a31807518786ce954a54a6fb89bf8ccce7ffead&X-Amz-SignedHeaders=host&x-id=GetObject)
82
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/df15b4b7-c1b1-4089-9a9c-c6dc82c5da45/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=a317618180295b301397c086e900d92421ec52e3957c03069a0b9ec45e221627&X-Amz-SignedHeaders=host&x-id=GetObject)
83
83
 
84
84
 
85
85
  # 创建
@@ -171,7 +171,7 @@ func makechan(t *chantype, size int64) *hchan {
171
171
 
172
172
 
173
173
 
174
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/034476d0-c971-492d-9c67-68a78c85762c/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092506Z&X-Amz-Expires=3600&X-Amz-Signature=ecb7bc75dd71e11c6e487155e92b09a5efc402c263cb8bc0f26377e917585ed0&X-Amz-SignedHeaders=host&x-id=GetObject)
174
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/034476d0-c971-492d-9c67-68a78c85762c/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100357Z&X-Amz-Expires=3600&X-Amz-Signature=4a4416215f7a5d06b1ccaca18089a9a4eef2a7c3da34bd38f4cb56aa74b32857&X-Amz-SignedHeaders=host&x-id=GetObject)
175
175
 
176
176
 
177
177
 
@@ -448,7 +448,7 @@ func main() {
448
448
 
449
449
 
450
450
 
451
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0dbfef9b-0ea7-417d-8d48-6a617073f94b/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092508Z&X-Amz-Expires=3600&X-Amz-Signature=0c0f07731a82e3b3500b963f77d797ebd69e86bef79b880fa4dfab41556ad203&X-Amz-SignedHeaders=host&x-id=GetObject)
451
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0dbfef9b-0ea7-417d-8d48-6a617073f94b/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100401Z&X-Amz-Expires=3600&X-Amz-Signature=6efe919bba1aa8072dc08e2be448427da7cd06c9f76e41ddac2a10fd24465052&X-Amz-SignedHeaders=host&x-id=GetObject)
452
452
 
453
453
 
454
454
 
@@ -460,7 +460,7 @@ func main() {
460
460
  在程序的 17 行之前,chan 的整体数据结构如下:
461
461
 
462
462
 
463
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/27d40d58-20fa-4b18-b65e-a99e462a91df/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092503Z&X-Amz-Expires=3600&X-Amz-Signature=0f086122eebd4f3bb0399088a7bba8eb5b927c3ee38728ff555bb35802e81d83&X-Amz-SignedHeaders=host&x-id=GetObject)
463
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/27d40d58-20fa-4b18-b65e-a99e462a91df/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=ba82d3c6caa09ac8b5c12db2a8dbdfbac42d2752fc55e9be46bf00e407904f7e&X-Amz-SignedHeaders=host&x-id=GetObject)
464
464
 
465
465
 
466
466
  `buf` 指向一个长度为 0 的数组,qcount 为 0,表示 channel 中没有元素。重点关注 `recvq` 和 `sendq`,它们是 waitq 结构体,而 waitq 实际上就是一个双向链表,链表的元素是 sudog,里面包含 `g` 字段,`g` 表示一个 goroutine,所以 sudog 可以看成一个 goroutine。recvq 存储那些尝试读取 channel 但被阻塞的 goroutine,sendq 则存储那些尝试写入 channel,但被阻塞的 goroutine。
@@ -472,13 +472,13 @@ func main() {
472
472
  `recvq` 的数据结构如下:
473
473
 
474
474
 
475
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7224fb46-7c1c-495c-8d4b-6f10ca794fb2/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092503Z&X-Amz-Expires=3600&X-Amz-Signature=6d83b671e64545e007df5ac03cb22855b20b4eaf797c43607568bec2658039df&X-Amz-SignedHeaders=host&x-id=GetObject)
475
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7224fb46-7c1c-495c-8d4b-6f10ca794fb2/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=f2377a3a9751d5e0813c1e262d92b7a25088e9aa4b81e1d3939ac221b83a8c18&X-Amz-SignedHeaders=host&x-id=GetObject)
476
476
 
477
477
 
478
478
  再从整体上来看一下 chan 此时的状态:
479
479
 
480
480
 
481
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/fcc04a62-2144-40a3-9a3d-087bc4190a5d/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092504Z&X-Amz-Expires=3600&X-Amz-Signature=44e8791c6780fc3b00d26176d3e7bef98bd92361127e83e9a467ca8fe256b6cf&X-Amz-SignedHeaders=host&x-id=GetObject)
481
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/fcc04a62-2144-40a3-9a3d-087bc4190a5d/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=4935e82faa1c5c6dd32ca6efe6075705fdcd5e0057077cdbea61349b5cfbc0d1&X-Amz-SignedHeaders=host&x-id=GetObject)
482
482
 
483
483
 
484
484
  G1 和 G2 被挂起了,状态是 `WAITING`。关于 goroutine 调度器这块不是今天的重点,当然后面肯定会写相关的文章。这里先简单说下,goroutine 是用户态的协程,由 Go runtime 进行管理,作为对比,内核线程由 OS 进行管理。Goroutine 更轻量,因此我们可以轻松创建数万 goroutine。
@@ -487,7 +487,7 @@ G1 和 G2 被挂起了,状态是 `WAITING`。关于 goroutine 调度器这块
487
487
  一个内核线程可以管理多个 goroutine,当其中一个 goroutine 阻塞时,内核线程可以调度其他的 goroutine 来运行,内核线程本身不会阻塞。这就是通常我们说的 `M:N` 模型:
488
488
 
489
489
 
490
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b63f0b14-115b-4bbf-8b22-d14cfb29a3be/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092504Z&X-Amz-Expires=3600&X-Amz-Signature=4933c66fb8f0691d15e77738689dfe06f4c0a6d38186aa434abaeeba8a9cd4e5&X-Amz-SignedHeaders=host&x-id=GetObject)
490
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b63f0b14-115b-4bbf-8b22-d14cfb29a3be/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=7c22e5a9bf7056f32721d1a621994cdad3f91c6264913dc4905a1197d5bda367&X-Amz-SignedHeaders=host&x-id=GetObject)
491
491
 
492
492
 
493
493
  `M:N` 模型通常由三部分构成:M、P、G。M 是内核线程,负责运行 goroutine;P 是 context,保存 goroutine 运行所需要的上下文,它还维护了可运行(runnable)的 goroutine 列表;G 则是待运行的 goroutine。M 和 P 是 G 运行的基础。
@@ -499,13 +499,13 @@ G1 和 G2 被挂起了,状态是 `WAITING`。关于 goroutine 调度器这块
499
499
 
500
500
 
501
501
 
502
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7e20555c-e90f-40b8-967e-6ab10d4b0bfb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092510Z&X-Amz-Expires=3600&X-Amz-Signature=94933253fca4d51582d93f9867897f48944bb4ae8628730868ba890d804ae7c2&X-Amz-SignedHeaders=host&x-id=GetObject)
502
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7e20555c-e90f-40b8-967e-6ab10d4b0bfb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100403Z&X-Amz-Expires=3600&X-Amz-Signature=b12e252df205ea6d1f64832ebf2d9c229a9f77f628b4df5fb1a063dbaa77b5f3&X-Amz-SignedHeaders=host&x-id=GetObject)
503
503
 
504
504
 
505
505
 
506
506
 
507
507
 
508
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/13a28311-91d1-436b-b1fa-1779eaef6739/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092511Z&X-Amz-Expires=3600&X-Amz-Signature=4eda9bed4317eec94fed16f1591546bbc4b558c495fb767845d7ca2b2d99406b&X-Amz-SignedHeaders=host&x-id=GetObject)
508
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/13a28311-91d1-436b-b1fa-1779eaef6739/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100403Z&X-Amz-Expires=3600&X-Amz-Signature=9596d6f4403e29cdce6ea542c2ad3e5b50cb68e369a0fcdaf971ba4ee40ee595&X-Amz-SignedHeaders=host&x-id=GetObject)
509
509
 
510
510
 
511
511
 
@@ -520,7 +520,7 @@ G1 和 G2 被挂起了,状态是 `WAITING`。关于 goroutine 调度器这块
520
520
  G1 脱离与 M 的关系,但调度器可不会让 M 闲着,所以会接着调度另一个 goroutine 来运行:
521
521
 
522
522
 
523
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/e4c2713c-a57e-498d-ae4c-824c0020add7/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092504Z&X-Amz-Expires=3600&X-Amz-Signature=b131b6f46a66ba59baf5ff6a91cfb5fa09985623a24602c2ef6d147c7b7f5274&X-Amz-SignedHeaders=host&x-id=GetObject)
523
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/e4c2713c-a57e-498d-ae4c-824c0020add7/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100354Z&X-Amz-Expires=3600&X-Amz-Signature=1677eba84407211c4dd478ece14f9d247cc980dfc120b031e68e2cc4a0d7d294&X-Amz-SignedHeaders=host&x-id=GetObject)
524
524
 
525
525
 
526
526
  G2 也是同样的遭遇。现在 G1 和 G2 都被挂起了,等待着一个 sender 往 channel 里发送数据,才能得到解救。
@@ -149,10 +149,10 @@ ANDQ $~15, SP
149
149
  ```
150
150
 
151
151
 
152
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/c1554f68-0c9f-481d-b392-6dbc4649fac8/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092539Z&X-Amz-Expires=3600&X-Amz-Signature=64f2dc01de146e31305ef85d6e075da94a4fe7fb8e1936fc8ab82187b2af4722&X-Amz-SignedHeaders=host&x-id=GetObject)
152
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/c1554f68-0c9f-481d-b392-6dbc4649fac8/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=06ab6ffe659375501a5e1793f9ec7486712b6adaaad3beb8be3bccbb2338da6e&X-Amz-SignedHeaders=host&x-id=GetObject)
153
153
 
154
154
 
155
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/17029d23-a6b9-4431-b177-2938130eb040/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092539Z&X-Amz-Expires=3600&X-Amz-Signature=266aeefff4f019957081cedc7ab5671708a727fd4794fa8bc3a9748e7a9ae98e&X-Amz-SignedHeaders=host&x-id=GetObject)
155
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/17029d23-a6b9-4431-b177-2938130eb040/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=508370ecb9371887ac96e86e828bcb843231b6013b74321bf396eed0e36d83e4&X-Amz-SignedHeaders=host&x-id=GetObject)
156
156
 
157
157
 
158
158
  上面两张图中,左侧用箭头标注了 16 字节对齐的位置。第一步表示向下移动 39 B,第二步表示与 `~15` 相与。
@@ -176,7 +176,7 @@ g0 栈的作用就是为运行 runtime 代码提供一个“环境”。
176
176
  这里直接叠甲过,看初始化g0完以后是啥样子:
177
177
 
178
178
 
179
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/cc216a9a-017f-4caa-8fff-c2234f189faf/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092539Z&X-Amz-Expires=3600&X-Amz-Signature=01d617d73da9e9b0a1394b61d41107138d63ca5025c6f184a8d33158f2ca8143&X-Amz-SignedHeaders=host&x-id=GetObject)
179
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/cc216a9a-017f-4caa-8fff-c2234f189faf/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=a5f973bdeaa04f2a1c01a39cb9df3fa5e3e803b820f338d269a7ecceb574751d&X-Amz-SignedHeaders=host&x-id=GetObject)
180
180
 
181
181
 
182
182
  stack.hi和stack.lo分别指向栈的高位和低位。
@@ -225,7 +225,7 @@ g0.m = &m0
225
225
  于是,前面的图又增加了新的玩伴 m0:
226
226
 
227
227
 
228
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5cf6c38a-7068-4f3b-849f-668a8ba5ed7d/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092539Z&X-Amz-Expires=3600&X-Amz-Signature=a82844190abf80ca88a7f50f63483c36d8b78c45df438425bb1ed5f9d8ef1a8b&X-Amz-SignedHeaders=host&x-id=GetObject)
228
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/5cf6c38a-7068-4f3b-849f-668a8ba5ed7d/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=4cc8d9ef984deec5bbeec2c3527cfd1627dca63275f5724e52d15b4711a92432&X-Amz-SignedHeaders=host&x-id=GetObject)
229
229
 
230
230
 
231
231
  ## `schedinit`
@@ -312,7 +312,7 @@ atomicstorep(unsafe.Pointer(&allm), unsafe.Pointer(mp))
312
312
  这一行将 allm 变成 m 的地址,这样变成了一个循环链表。之后再新建 m 的时候,新 m 的 alllink 就会指向本次的 m,最后 allm 又会指向新创建的 m。
313
313
 
314
314
 
315
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ad9f6487-b075-4377-aa73-a7381a87901e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092540Z&X-Amz-Expires=3600&X-Amz-Signature=e956e60f82edb4d787ab69bf84adcbc97c0f59a97b486f15cd271a1d1e06b1b9&X-Amz-SignedHeaders=host&x-id=GetObject)
315
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/ad9f6487-b075-4377-aa73-a7381a87901e/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=cbea3b4db174ea980c49fa3f71fe7193686402efdb08a2fb3b4de664e343e107&X-Amz-SignedHeaders=host&x-id=GetObject)
316
316
 
317
317
 
318
318
  上图中,1 将 m0 挂在 allm 上。之后,若新创建 m,则 m1 会和 m0 相连。
@@ -505,5 +505,5 @@ p0.m = m0
505
505
  最后我们将 allp 和 allm 都添加到图上:
506
506
 
507
507
 
508
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2b326cfb-bc71-4c9b-a54d-9e4dd3472cbe/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092540Z&X-Amz-Expires=3600&X-Amz-Signature=8aab6254dce9c3d5da562c4c2f54ea16700b1a05f0d0728e37b8f0e909daeca4&X-Amz-SignedHeaders=host&x-id=GetObject)
508
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2b326cfb-bc71-4c9b-a54d-9e4dd3472cbe/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100424Z&X-Amz-Expires=3600&X-Amz-Signature=5b566adf3f8d2c93ec25dfcfbb239ce74db5e35469156b129e4df1cafaf9a81b&X-Amz-SignedHeaders=host&x-id=GetObject)
509
509
 
@@ -1,7 +1,7 @@
1
1
  1. unsafe 包提供了 2 点重要的能力:
2
2
  2. 任何类型的指针和 unsafe.Pointer 可以相互转换。uintptr 类型和 unsafe.Pointer 可以相互转换。
3
3
 
4
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/23d3d701-4b0c-4a73-9b7d-6a0cce200166/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092455Z&X-Amz-Expires=3600&X-Amz-Signature=d241bf291102c8f3e502a9f2a5973b930d44cd44d31ef6a0c5ec9d8f779a1324&X-Amz-SignedHeaders=host&x-id=GetObject)
4
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/23d3d701-4b0c-4a73-9b7d-6a0cce200166/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100345Z&X-Amz-Expires=3600&X-Amz-Signature=1c12a061ed8a0db662ac4a35427e7d7ac2db981a8745d92b7d8cdde62a436b7d&X-Amz-SignedHeaders=host&x-id=GetObject)
5
5
 
6
6
 
7
7
  pointer 不能直接进行数学运算,但可以把它转换成 uintptr,对 uintptr 类型进行数学运算,再转换成 pointer 类型。
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
  > 💡 Replicated state machines are typically implemented using a replicated log
21
- > ![Rep_state_machine.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2744dbee-2a7a-4215-ac3c-a02d0041c497/Rep_state_machine.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092523Z&X-Amz-Expires=3600&X-Amz-Signature=566e9efaf6d26542ffbac99f93ee062942d787d843ba2d5e0ab93ed2ba3ab01e&X-Amz-SignedHeaders=host&x-id=GetObject)
21
+ > ![Rep_state_machine.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2744dbee-2a7a-4215-ac3c-a02d0041c497/Rep_state_machine.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100407Z&X-Amz-Expires=3600&X-Amz-Signature=a1812820c2c333492cc4f9d6ee3bdc2e05a4197195f469a54f7446861b41bb75&X-Amz-SignedHeaders=host&x-id=GetObject)
22
22
  >
23
23
  > - Each server stores a log containing a series of commands, which its state machine executes in order
24
24
  >
@@ -27,7 +27,7 @@
27
27
  > - State machines are deterministic, each computes the same state and the same sequence of outputs
28
28
 
29
29
 
30
- ![Rep_state_machine.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2744dbee-2a7a-4215-ac3c-a02d0041c497/Rep_state_machine.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092522Z&X-Amz-Expires=3600&X-Amz-Signature=88c1bdb3c4cd3cb850d455c995727d653b493e90639dbaba0f2b84aa57e63452&X-Amz-SignedHeaders=host&x-id=GetObject)
30
+ ![Rep_state_machine.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/2744dbee-2a7a-4215-ac3c-a02d0041c497/Rep_state_machine.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100405Z&X-Amz-Expires=3600&X-Amz-Signature=c818a2125351e3bed6e10afd80ee750b82c71f977a0c94730b33037c2a93770e&X-Amz-SignedHeaders=host&x-id=GetObject)
31
31
 
32
32
  - Each server stores a log containing a series of commands, which its state machine executes in order
33
33
  - Each log contains the same commands in the same order, so each state machine processes the same sequence of commands
@@ -97,7 +97,7 @@ type bmap struct {
97
97
  `bmap` 就是我们常说的“桶”,桶里面会最多装 8 个 key,这些 key 之所以会落入同一个桶,是因为它们经过哈希计算后,哈希结果是“一类”的。在桶内,又会根据 key 计算出来的 hash 值的高 8 位来决定 key 到底落入桶内的哪个位置(一个桶内最多有8个位置)。
98
98
 
99
99
 
100
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/aa7b22bc-2b87-4008-a124-4a728a21a145/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092436Z&X-Amz-Expires=3600&X-Amz-Signature=58298bc39a71c929a3ae42ba2004e9ece00a4cdc41f6886135a45b8692f00120&X-Amz-SignedHeaders=host&x-id=GetObject)
100
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/aa7b22bc-2b87-4008-a124-4a728a21a145/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100330Z&X-Amz-Expires=3600&X-Amz-Signature=e58a1aedbbb061bcd90423a99a4e80685538a7241b710d3b0f166173144063a3&X-Amz-SignedHeaders=host&x-id=GetObject)
101
101
 
102
102
 
103
103
  当 map 的 key 和 value 都不是指针,并且 size 都小于 128 字节的情况下,会把 bmap 标记为不含指针,这样可以避免 gc 时扫描整个 hmap。但是,我们看 bmap 其实有一个 overflow 的字段,是指针类型的,破坏了 bmap 不含指针的设想,这时会把 overflow 移动到 extra 字段来。
@@ -309,7 +309,7 @@ key 经过哈希计算后得到哈希值,共 64 个 bit
309
309
  2. 再用哈希值的高 8 位,找到此 key 在 bucket 中的位置,这是在寻找已有的 key。最开始桶内还没有 key,新加入的 key 会找到第一个空位,放入。
310
310
  3. buckets 编号就是桶编号,当两个不同的 key 落在同一个桶中,也就是发生了哈希冲突。冲突的解决手段是用链表法:在 bucket 中,从前往后找到第一个空位。这样,在查找某个 key 时,先找到对应的桶,再去遍历 bucket 中的 key。
311
311
 
312
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/8ad11b96-4ce4-40a5-bcd0-ac03a246db38/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092437Z&X-Amz-Expires=3600&X-Amz-Signature=f1c346eca34d159e0c005908fa193025bc626ef6bae08c51d4165da865ed59bc&X-Amz-SignedHeaders=host&x-id=GetObject)
312
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/8ad11b96-4ce4-40a5-bcd0-ac03a246db38/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100330Z&X-Amz-Expires=3600&X-Amz-Signature=db9f14f4a00374e135998b7b2d556ad20142ba0f0516d6e37cdec6c8f25f5ba6&X-Amz-SignedHeaders=host&x-id=GetObject)
313
313
 
314
314
 
315
315
  上图中,假定 B = 5,所以 bucket 总数就是 $2^5 = 32$。首先计算出待查找 key 的哈希,使用低 5 位 `00110`,找到对应的 6 号 bucket,使用高 8 位 `10010111`,对应十进制 151,在 6 号 bucket 中寻找 topbits 值(HOB hash)为 151 的 key,找到了 2 号槽位,这样整个查找过程就结束了。
@@ -959,7 +959,7 @@ evacuate 函数的代码注释非常清晰,对着代码和注释是很容易
959
959
  对于条件 1,就没这么简单了。要重新计算 key 的哈希,才能决定它到底落在哪个 bucket。例如,原来 B = 5,计算出 key 的哈希后,只用看它的低 5 位,就能决定它落在哪个 bucket。扩容后,B 变成了 6,因此需要多看一位,它的低 6 位决定 key 落在哪个 bucket。这称为 `rehash`。
960
960
 
961
961
 
962
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/68da88a4-e66f-44df-b462-7d118bda70ca/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092438Z&X-Amz-Expires=3600&X-Amz-Signature=450d837bcd53b61ec48beba1bd3ebcb750de898a6f5f88f8d547fc23af0afc22&X-Amz-SignedHeaders=host&x-id=GetObject)
962
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/68da88a4-e66f-44df-b462-7d118bda70ca/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100331Z&X-Amz-Expires=3600&X-Amz-Signature=d18f778ee3df1bc9b5f9433404cc840ae9141dc05864751535774216d2f9614c&X-Amz-SignedHeaders=host&x-id=GetObject)
963
963
 
964
964
 
965
965
  因此,某个 key 在搬迁前后 bucket 序号可能和原来相等,也可能是相比原来加上 2^B(原来的 B 值),取决于 hash 值 第 6 bit 位是 0 还是 1。
@@ -971,7 +971,7 @@ evacuate 函数的代码注释非常清晰,对着代码和注释是很容易
971
971
  例如,原始 B = 2,1号 bucket 中有 2 个 key 的哈希值低 3 位分别为:010,110。由于原来 B = 2,所以低 2 位 `10` 决定它们落在 2 号桶,现在 B 变成 3,所以 `010`、`110` 分别落入 2、6 号桶。
972
972
 
973
973
 
974
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/c8fa7780-3e62-43ea-b8b5-28ebea7d59a4/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092438Z&X-Amz-Expires=3600&X-Amz-Signature=ff35600001febc03869dcaec30a0a110798ef619c6d5a8cecc5e197671d86b8b&X-Amz-SignedHeaders=host&x-id=GetObject)
974
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/c8fa7780-3e62-43ea-b8b5-28ebea7d59a4/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100331Z&X-Amz-Expires=3600&X-Amz-Signature=95c585ac0da864424320db5eec8e1e403c3c0c224cb9edf462c733a0e896caca&X-Amz-SignedHeaders=host&x-id=GetObject)
975
975
 
976
976
 
977
977
  理解了这个,后面讲 map 迭代的时候会用到。
@@ -1026,7 +1026,7 @@ useX = hash&newbit == 0
1026
1026
  下面通过图来宏观地看一下扩容前后的变化。
1027
1027
 
1028
1028
 
1029
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/f9573978-7cba-4cbd-a69c-88bab4a82cd8/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092438Z&X-Amz-Expires=3600&X-Amz-Signature=1a13449e61c19f4e4176cf0725b24ea1f6677251d7299ae5505da0eae66039c2&X-Amz-SignedHeaders=host&x-id=GetObject)
1029
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/f9573978-7cba-4cbd-a69c-88bab4a82cd8/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100331Z&X-Amz-Expires=3600&X-Amz-Signature=746ae9f63208e3c96ff00af8210b63473557e53b8a9f9fcf56e368bbe9f6366f&X-Amz-SignedHeaders=host&x-id=GetObject)
1030
1030
 
1031
1031
 
1032
1032
  扩容前,B = 2,共有 4 个 buckets,lowbits 表示 hash 值的低位。假设我们不关注其他 buckets 情况,专注在 2 号 bucket。并且假设 overflow 太多,触发了等量扩容(对应于前面的条件 2)。
@@ -1035,13 +1035,13 @@ useX = hash&newbit == 0
1035
1035
  扩容完成后,overflow bucket 消失了,key 都集中到了一个 bucket,更为紧凑了,提高了查找的效率。
1036
1036
 
1037
1037
 
1038
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/e0f1fe04-7ccc-4605-9e7d-a296628c078b/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092438Z&X-Amz-Expires=3600&X-Amz-Signature=3079d72477cea2fb84308221ce91a7adf582564c90dbf8d0edc4d8a8f4f39562&X-Amz-SignedHeaders=host&x-id=GetObject)
1038
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/e0f1fe04-7ccc-4605-9e7d-a296628c078b/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100331Z&X-Amz-Expires=3600&X-Amz-Signature=6083c57bb4fbd08703f21752bd9605391e3e8b9fb46550d884e079674a984072&X-Amz-SignedHeaders=host&x-id=GetObject)
1039
1039
 
1040
1040
 
1041
1041
  假设触发了 2 倍的扩容,那么扩容完成后,老 buckets 中的 key 分裂到了 2 个 新的 bucket。一个在 x part,一个在 y 的 part。依据是 hash 的 lowbits。新 map 中 `0-3` 称为 x part,`4-7` 称为 y part。
1042
1042
 
1043
1043
 
1044
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/9fee0829-bbaa-426a-88d7-5dcfe2356748/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092438Z&X-Amz-Expires=3600&X-Amz-Signature=d4f230cd43439993e4277b77855dcecaa5156c8040cdc42e70443e356d3fafce&X-Amz-SignedHeaders=host&x-id=GetObject)
1044
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/9fee0829-bbaa-426a-88d7-5dcfe2356748/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100331Z&X-Amz-Expires=3600&X-Amz-Signature=c13f7a9b7aa752ddadddb734a731d16b7b5d6bde6486a0f94fa0cf660861beb9&X-Amz-SignedHeaders=host&x-id=GetObject)
1045
1045
 
1046
1046
 
1047
1047
  注意,上面的两张图忽略了其他 buckets 的搬迁情况,表示所有的 bucket 都搬迁完毕后的情形。实际上,我们知道,搬迁是一个“渐进”的过程,并不会一下子就全部搬迁完毕。所以在搬迁过程中,oldbuckets 指针还会指向原来老的 []bmap,并且已经搬迁完毕的 key 的 tophash 值会是一个状态值,表示 key 的搬迁去向。
@@ -174,7 +174,7 @@ G的状态有以下9种,可以参见[代码](https://github.com/golang/go/blob
174
174
  G的状态流转:
175
175
 
176
176
 
177
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/dba72114-0d8c-40ad-a801-3ae7f04304c6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092535Z&X-Amz-Expires=3600&X-Amz-Signature=21ae62732d1475f8c2b91ab3bd5bd4057ff3fca2ce52a153df54c18c76513287&X-Amz-SignedHeaders=host&x-id=GetObject)
177
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/dba72114-0d8c-40ad-a801-3ae7f04304c6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100419Z&X-Amz-Expires=3600&X-Amz-Signature=171abb1d11de0fedcac31d7efede45eba3067050822af16ea9fcc8dd80ca2ac8&X-Amz-SignedHeaders=host&x-id=GetObject)
178
178
 
179
179
 
180
180
  ### M的结构
@@ -203,7 +203,7 @@ type m struct {
203
203
  ```
204
204
 
205
205
 
206
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/a180533b-3687-47a3-aef4-094f3039fb92/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092535Z&X-Amz-Expires=3600&X-Amz-Signature=c116fe69a2f9e53c8e3c27062c171cde78b6bca6e90475c33dc665252b28590b&X-Amz-SignedHeaders=host&x-id=GetObject)
206
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/a180533b-3687-47a3-aef4-094f3039fb92/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100419Z&X-Amz-Expires=3600&X-Amz-Signature=9ec2b5b01c1ebc25c15ec1cffbc826f49c7818793d4b1d03253003f4cefa7765&X-Amz-SignedHeaders=host&x-id=GetObject)
207
207
 
208
208
 
209
209
  ### P的内部结构
@@ -272,7 +272,7 @@ P有以下几种状态,参加[源码](https://github.com/golang/go/blob/562212
272
272
  P的状态流转:
273
273
 
274
274
 
275
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b23fa4d1-0bb4-48e2-9f2f-18d45b5b92a6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092535Z&X-Amz-Expires=3600&X-Amz-Signature=cfa0308b80915d0b8a9864dc2d81a232f622f21c4d8ed5e2494541387442fd70&X-Amz-SignedHeaders=host&x-id=GetObject)
275
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/b23fa4d1-0bb4-48e2-9f2f-18d45b5b92a6/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100419Z&X-Amz-Expires=3600&X-Amz-Signature=431058030eeb1bfc111b175552fd1e420aff4fc448220f731295b38c3a89c829&X-Amz-SignedHeaders=host&x-id=GetObject)
276
276
 
277
277
 
278
278
  ### 调度器的内部结构
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/09ae8ad7-9c1a-489e-b61e-060b5c9086da/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092452Z&X-Amz-Expires=3600&X-Amz-Signature=b71cca3740667715be94830adf7b82bd3cf77a0ba4384fb145e7743c465c548d&X-Amz-SignedHeaders=host&x-id=GetObject)
5
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/09ae8ad7-9c1a-489e-b61e-060b5c9086da/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100341Z&X-Amz-Expires=3600&X-Amz-Signature=f6c9c82b1187c23ffd58db8321503a2552be32cdc3f651d992f7a58727db5a3c&X-Amz-SignedHeaders=host&x-id=GetObject)
6
6
 
7
7
 
8
8
  # Overview
@@ -191,7 +191,7 @@ go build -x -work main.go 1> transcript.txt 2>&1
191
191
  最后用一张图来总结 go bootstrap 过程吧:
192
192
 
193
193
 
194
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7a2cb10f-a98e-4f13-a3d0-6045e763b729/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092452Z&X-Amz-Expires=3600&X-Amz-Signature=30be4f81780de26751a1e0f07adb04a1f024b288365e2dbe019939a0ab648447&X-Amz-SignedHeaders=host&x-id=GetObject)
194
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/7a2cb10f-a98e-4f13-a3d0-6045e763b729/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100342Z&X-Amz-Expires=3600&X-Amz-Signature=33e2168df1da9c48a29f319db8fbecb3dfcb14e75bbdc8bcc3d11a464cf50478&X-Amz-SignedHeaders=host&x-id=GetObject)
195
195
 
196
196
 
197
197
  `main` 函数里执行的一些重要的操作包括:新建一个线程执行 `sysmon` 函数,定期垃圾回收和调度抢占;启动 `gc`;执行所有的 `init` 函数等等。
@@ -156,7 +156,7 @@ type interfacetype struct {
156
156
  这里通过一张图来看下 `iface` 结构体的全貌:
157
157
 
158
158
 
159
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0eef2fbc-5ce4-4ae0-8c56-5d2526900ddb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092456Z&X-Amz-Expires=3600&X-Amz-Signature=2cfdba0dd22a145c369afd40ed54c66e5d414a0e65326d47a8d56f95dc3b510c&X-Amz-SignedHeaders=host&x-id=GetObject)
159
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/0eef2fbc-5ce4-4ae0-8c56-5d2526900ddb/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100346Z&X-Amz-Expires=3600&X-Amz-Signature=57bd25009511c8f38cae3618cdff9a1dc3819e89052f5d7f8cfb6d1aaa12fead&X-Amz-SignedHeaders=host&x-id=GetObject)
160
160
 
161
161
 
162
162
  ## eface (empty interface)
@@ -176,7 +176,7 @@ type eface struct {
176
176
  相比 `iface`,`eface` 就比较简单了。只维护了一个 `_type` 字段,表示空接口所承载的具体的实体类型。`data` 描述了具体的值。
177
177
 
178
178
 
179
- ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/6bcc7f5f-efc4-46c3-8bb1-fcc08b89f682/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092456Z&X-Amz-Expires=3600&X-Amz-Signature=d316cacd1f90e0ad9f18f34888ba07277349c544d52abba0a9eb89bc35626ead&X-Amz-SignedHeaders=host&x-id=GetObject)
179
+ ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/6bcc7f5f-efc4-46c3-8bb1-fcc08b89f682/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100346Z&X-Amz-Expires=3600&X-Amz-Signature=a2e1b019dbe5b8fb1dd82274bb2e464396e5627b0f9781cf65392ae13f09a56b&X-Amz-SignedHeaders=host&x-id=GetObject)
180
180
 
181
181
 
182
182
  我们来看个例子:
@@ -19,7 +19,7 @@ Sending and receiving RequestVote RPCs
19
19
  </details>
20
20
 
21
21
 
22
- ![figure2-2A.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/bf799b2f-6287-4999-b548-4974769458ec/figure2-2A.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T092513Z&X-Amz-Expires=3600&X-Amz-Signature=e96fc27813785c92bd6144647840aa67ec78e540237b7fac3cd29a2b67a87110&X-Amz-SignedHeaders=host&x-id=GetObject)
22
+ ![figure2-2A.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/816ab0e2-0bbf-4fbc-a791-de833db1ae15/bf799b2f-6287-4999-b548-4974769458ec/figure2-2A.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T100359Z&X-Amz-Expires=3600&X-Amz-Signature=2d149bc898e74b7e2689a7abab8020a0236c2b4062cd091e63407032f116018b&X-Amz-SignedHeaders=host&x-id=GetObject)
23
23
 
24
24
 
25
25
  Step**s:**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noblog",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Generate static blog contnet from a Notion.so table.",
5
5
  "author": "humbornjo",
6
6
  "license": "MIT",
@@ -4,7 +4,6 @@ import { Logger } from "tslog";
4
4
  import { Noblog } from "../lib/nomd/nomd.js";
5
5
  import { GetAllPosts } from "../lib/notion/client.js";
6
6
 
7
- let v: boolean = false;
8
7
  let save_dir = "./content/markdown"
9
8
  let sub_dir = "sub"
10
9
  const nob = new Noblog()
@@ -35,11 +34,11 @@ async function main() {
35
34
  try {
36
35
  await Promise.all(futures);
37
36
  for (const pageid of Object.keys(nob.MdCollection)) {
38
- let fpath = save_dir;
39
- if (pages.find(page => page.id !== pageid))
40
- fpath = sub_dir
37
+ let fpath = sub_dir;
38
+ if (pages.find(page => page.id === pageid))
39
+ fpath = save_dir
41
40
  const log = await nob.SaveJelly(pageid, fpath, nob.MdCollection[pageid])
42
- if (v) logger.info(log);
41
+ logger.info(log);
43
42
  }
44
43
  console.log(`success: finish dump all files to "${save_dir}"`)
45
44
  } catch (error) {