diff --git a/notes/HTTP.md b/notes/HTTP.md
index 7238542e..97f361c9 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -507,7 +507,7 @@ HTTP/1.1 使用虚拟主机技术,使得一台服务器拥有多个域名,
### 3. 隧道
-使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。隧道本身不去解析 HTTP 请求。
+使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。
# 六、HTTPs
@@ -810,9 +810,11 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404
## HTTP/1.1 与 HTTP/2.0 的区别
+> [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn)
+
### 1. 多路复用
-HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求。
+HTTP/2.0 使用多路复用技术,同一个 TCP 连接可以处理多个请求。
### 2. 首部压缩
@@ -820,7 +822,7 @@ HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0
### 3. 服务端推送
-在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
+HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
### 4. 二进制格式
@@ -848,3 +850,5 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
- [XMLHttpRequest](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest)
- [XMLHttpRequest (XHR) Uses Multiple Packets for HTTP POST?](https://blog.josephscott.org/2009/08/27/xmlhttprequest-xhr-uses-multiple-packets-for-http-post/)
- [Symmetric vs. Asymmetric Encryption – What are differences?](https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences)
+- [Web 性能优化与 HTTP/2](https://www.kancloud.cn/digest/web-performance-http2)
+- [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn)
diff --git a/notes/Linux.md b/notes/Linux.md
index dbeddf16..6c38a0fb 100644
--- a/notes/Linux.md
+++ b/notes/Linux.md
@@ -50,8 +50,11 @@
* [九、进程管理](#九进程管理)
* [查看进程](#查看进程)
* [进程状态](#进程状态)
- * [SIGCHILD](#sigchild)
- * [孤儿进程和僵死进程](#孤儿进程和僵死进程)
+ * [SIGCHLD](#sigchld)
+ * [wait()](#wait)
+ * [waitpid()](#waitpid)
+ * [孤儿进程](#孤儿进程)
+ * [僵死进程](#僵死进程)
* [十、I/O 复用](#十io-复用)
* [概念理解](#概念理解)
* [I/O 模型](#io-模型)
@@ -1061,7 +1064,6 @@ daemon 2
-
| 状态 | 说明 |
| :---: | --- |
| R | running or runnable (on run queue) |
@@ -1070,26 +1072,56 @@ daemon 2
| Z | defunct/zombie, terminated but not reaped by its parent |
| T | stopped, either by a job control signal or because it is being traced|
-## SIGCHILD
+## SIGCHLD
当一个子进程改变了它的状态时:停止运行,继续运行或者退出,有两件事会发生在父进程中:
- 得到 SIGCHLD 信号;
-- 阻塞的 waitpid(2)(或者 wait)调用会返回。
+- waitpid() 或者 wait() 调用会返回。
-## 孤儿进程和僵死进程
+其中子进程发送的 SIGCHLD 信号包含了子进程的信息,包含了进程 ID、进程状态、进程使用 CPU 的时间等。
-### 1. 孤儿进程
+在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息。父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。
+
+## wait()
+
+```c
+pid_t wait(int *status)
+```
+
+父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,之后 wait() 函数会销毁子进程并返回。
+
+如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 - 1,同时 errno 被置为 ECHILD。
+
+参数 status 用来保存被收集进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个僵尸进程消灭掉,我们就可以设定这个参数为 NULL:
+
+```c
+pid = wait(NULL);
+```
+
+## waitpid()
+
+```c
+pid_t waitpid(pid_t pid,int *status,int options)
+```
+
+作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。
+
+pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么贺 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。
+
+options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。
+
+## 孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
-### 2. 僵死进程
+## 僵死进程
-一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait 或 waitpid 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait 或 waitpid,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
+一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
僵死进程通过 ps 命令显示出来的状态为 Z。
@@ -1397,3 +1429,4 @@ poll 没有最大描述符数量的限制,如果平台支持应该采用 poll
- [Linux 之守护进程、僵死进程与孤儿进程](http://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/)
- [Linux process states](https://idea.popcount.org/2012-12-11-linux-process-states/)
- [GUID Partition Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
+- [详解 wait 和 waitpid 函数](https://blog.csdn.net/kevinhg/article/details/7001719)
diff --git a/notes/正则表达式.md b/notes/正则表达式.md
index bd38a392..1252be08 100644
--- a/notes/正则表达式.md
+++ b/notes/正则表达式.md
@@ -19,7 +19,7 @@
正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。
-[正则表达式在线工具](http://tool.oschina.net/regex/)
+[正则表达式在线工具](https://regexr.com/)
# 二、匹配单个字符
@@ -164,7 +164,7 @@ a.+c
^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。
-使用 (?m) 来打开分行匹配模式,在该模式下,换行被当做字符串的边界。
+分行匹配模式(multiline)下,换行被当做字符串的边界。
**应用**
@@ -173,10 +173,10 @@ a.+c
**正则表达式**
```
-(?m)^\s*//.*$
+^\s*\/\/.*$
```
-如果没用 (?m),则只会匹配 // 注释 1 以及之后的所有内容。用了分行匹配模式之后,换行符被当成是字符串分隔符,因此能正确匹配出两个注释内容。
+
**匹配结果**
@@ -197,7 +197,7 @@ a.+c
**正则表达式**
```
-(ab) {2,}
+(ab){2,}
```
**匹配结果**
@@ -222,21 +222,23 @@ a.+c
匹配 IP 地址。IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:
-1. 一位或者两位的数字
-2. 1 开头的三位数
-3. 2 开头,第 2 位是 0-4 的三位数
-4. 25 开头,第 3 位是 0-5 的三位数
+1. 一位数字
+2. 不以 0 开头的两位数字
+3. 1 开头的三位数
+4. 2 开头,第 2 位是 0-4 的三位数
+5. 25 开头,第 3 位是 0-5 的三位数
**正则表达式**
```
-(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.) {3}(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])))
+(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5])))
```
**匹配结果**
1. **192.168.0.1**
-2. 555.555.555.555
+2. 00.00.00.00
+3. 555.555.555.555
# 八、回溯引用
@@ -251,7 +253,7 @@ a.+c
\1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。
```
-<(h[1-6])>\w*?\1>
+<(h[1-6])>\w*?<\/\1>
```
**匹配结果**
diff --git a/pics/600e9c75-5033-4dad-ae2b-930957db638e.png b/pics/600e9c75-5033-4dad-ae2b-930957db638e.png
new file mode 100644
index 00000000..bf0834d5
Binary files /dev/null and b/pics/600e9c75-5033-4dad-ae2b-930957db638e.png differ