diff --git a/notes/HTTP.md b/notes/HTTP.md
index 71dba8da..dc706e08 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -4,15 +4,15 @@
* [URL](#url)
* [请求和响应报文](#请求和响应报文)
* [二、HTTP 方法](#二http-方法)
- * [GET:获取资源](#get获取资源)
- * [POST:传输实体主体](#post传输实体主体)
- * [HEAD:获取报文首部](#head获取报文首部)
- * [PUT:上传文件](#put上传文件)
- * [PATCH:对资源进行部分修改](#patch对资源进行部分修改)
- * [DELETE:删除文件](#delete删除文件)
- * [OPTIONS:查询支持的方法](#options查询支持的方法)
- * [CONNECT:要求用隧道协议连接代理](#connect要求用隧道协议连接代理)
- * [TRACE:追踪路径](#trace追踪路径)
+ * [GET](#get)
+ * [POST](#post)
+ * [HEAD](#head)
+ * [PUT](#put)
+ * [PATCH](#patch)
+ * [DELETE](#delete)
+ * [OPTIONS](#options)
+ * [CONNECT](#connect)
+ * [TRACE](#trace)
* [三、HTTP 状态码](#三http-状态码)
* [2XX 成功](#2xx-成功)
* [3XX 重定向](#3xx-重定向)
@@ -77,9 +77,13 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基
客户端发送的 **请求报文** 第一行为请求行,包含了方法字段。
-## GET:获取资源
+## GET
-## POST:传输实体主体
+> 获取资源
+
+## POST
+
+> 传输实体主体
POST 主要目的不是获取资源,而是传输存储在内容实体中的数据。
@@ -97,13 +101,17 @@ name1=value1&name2=value2
GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 中是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
-## HEAD:获取报文首部
+## HEAD
+
+> 获取报文首部
和 GET 方法一样,但是不返回报文实体主体部分。
主要用于确认 URL 的有效性以及资源更新的日期时间等。
-## PUT:上传文件
+## PUT
+
+> 上传文件
由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
@@ -116,7 +124,9 @@ Content-length: 16
New File
```
-## PATCH:对资源进行部分修改
+## PATCH
+
+> 对资源进行部分修改
PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。
@@ -130,7 +140,9 @@ Content-Length: 100
[description of changes]
```
-## DELETE:删除文件
+## DELETE
+
+> 删除文件
与 PUT 功能相反,并且同样不带验证机制。
@@ -138,13 +150,17 @@ Content-Length: 100
DELETE /file.html HTTP/1.1
```
-## OPTIONS:查询支持的方法
+## OPTIONS
+
+> 查询支持的方法
查询指定的 URL 能够支持的方法。
会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。
-## CONNECT:要求用隧道协议连接代理
+## CONNECT
+
+> 要求用隧道协议连接代理
要求在于代理服务器通信时建立隧道,使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
@@ -154,7 +170,9 @@ CONNECT www.example.com:443 HTTP/1.1
-## TRACE:追踪路径
+## TRACE
+
+> 追踪路径
服务器会将通信路径返回给客户端。
diff --git a/notes/Linux.md b/notes/Linux.md
index 31d445b1..92a941f7 100644
--- a/notes/Linux.md
+++ b/notes/Linux.md
@@ -49,11 +49,14 @@
* [awk](#awk)
* [九、进程管理](#九进程管理)
* [查看进程](#查看进程)
- * [查看端口](#查看端口)
+ * [进程状态](#进程状态)
+ * [SIGCHILD](#sigchild)
+ * [孤儿进程和僵死进程](#孤儿进程和僵死进程)
* [十、I/O 复用](#十io-复用)
* [概念理解](#概念理解)
* [I/O 模型](#io-模型)
* [select() poll() epoll](#select-poll-epoll)
+ * [select 和 poll 比较](#select-和-poll-比较)
* [select() poll() epoll 应用场景](#select-poll-epoll-应用场景)
* [参考资料](#参考资料)
@@ -994,7 +997,7 @@ dmtsai lines: 5 columns: 9
范例 3:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。
```text
-cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
+$ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
root 0
bin 1
daemon 2
@@ -1004,16 +1007,95 @@ daemon 2
## 查看进程
-```html
-ps aux | grep threadx
+### 1. ps
+
+查看某个时间点的进程信息
+
+示例一:查看自己的进程
+
+```
+# ps -l
```
-## 查看端口
+示例二:查看系统所有进程
+
+```
+# ps aux
+```
+
+示例三:查看特定的进程
```html
-netstat -anp | grep 80
+# ps aux | grep threadx
```
+### 2. top
+
+实时显示进程信息
+
+示例:两秒钟刷新一次
+
+```
+# top -d 2
+```
+
+### 3. pstree
+
+查看进程树
+
+示例:查看所有进程树
+
+```
+# pstree -A
+```
+
+### 4. netstat
+
+查看占用端口的进程
+
+```
+# netstat -anp | grep port
+```
+
+## 进程状态
+
+| 状态 | 说明 |
+| :---: | --- |
+| R | running or runnable (on run queue) |
+| D | uninterruptible sleep (usually IO) |
+| S | interruptible sleep (waiting for an event to complete) |
+| 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 信号;
+- 阻塞的 waitpid(2)(或者 wait)调用会返回。
+
+
+
+## 孤儿进程和僵死进程
+
+### 1. 孤儿进程
+
+一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
+
+由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
+
+### 2. 僵死进程
+
+一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait 或 waitpid 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait 或 waitpid,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。
+
+僵死进程通过 ps 命令显示出来的状态为 Z。
+
+系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
+
+要消灭系统中大量的僵死进程,只需要将其父进程杀死,此时所有的僵死进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵死进程。
+
# 十、I/O 复用
## 概念理解
@@ -1057,7 +1139,7 @@ HTTP 服务器即要处理监听套接字,又要处理已连接的套接字,
### 3. 异步-阻塞
-这是 I/O 复用使用的一种模式,通过使用 slect(),它可以监听多个 I/O 事件,当这些事件至少有一个发生时,用户程序会收到通知。
+这是 I/O 复用使用的一种模式,通过使用 select,它可以监听多个 I/O 事件,当这些事件至少有一个发生时,用户程序会收到通知。
@@ -1129,7 +1211,7 @@ else
在 Linux 中 select 最多支持 1024 个 fd_set 同时轮询,其中 1024 由 Linux 内核的 FD_SETSIZE 决定。如果需要打破该限制可以修改 FD_SETSIZE,然后重新编译内核。
-### 2. poll()
+### 2. poll
```c
int poll (struct pollfd *fds, unsigned int nfds, int timeout);
@@ -1245,14 +1327,40 @@ epoll_ctl 执行一次系统调用,用于向内核注册新的描述符或者
epoll_wait 取出在内核中通过链表维护的 I/O 准备好的描述符,将他们从内核复制到程序中,不需要像 select() poll() 对注册的所有描述符遍历一遍。
epoll 对多线程编程更有友好,同时多个线程对同一个描述符调用了 epoll_wait 也不会产生像 select() poll() 的不确定情况。或者一个线程调用了 epoll_wait 另一个线程关闭了同一个描述符也不会产生不确定情况。
+它是 select 和 poll 的增强版,更加灵活而且没有描述符限制。它将用户关心的描述符放到内核的一个事件表中,从而只需要在用户空间和内核空间拷贝一次。
-epoll() 对文件描述符的操作有两种模式:LT(level trigger)和 ET(edge trigger)。
+select 和 poll 方式中,进程只有在调用一定的方法后,内核才对所有监视的描述符进行扫描。而 epoll 事先通过 epoll_ctl() 来注册描述符,一旦基于某个描述符就绪时,内核会采用类似 callback 的回调机制,迅速激活这个描述符,当进程调用 epoll_wait() 时便得到通知。
+
+#### eopll 工作模式
+
+epoll 对文件描述符的操作有两种模式:LT(level trigger)和 ET(edge trigger)。
epoll_event有两种触发模式,LT模式和ET模式
- LT 模式:当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用 epoll_wait() 时,会再次响应应用程序并通知此事件。是默认的一种模式,并且同时支持 Blocking 和 No-Blocking。
- ET 模式:当 epoll_wait() 检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用 epoll_wait() 时,不会再次响应应用程序并通知此事件。很大程度上减少了 epoll 事件被重复触发的次数,因此效率要比 LT 模式高。只支持 No-Blocking,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。
+## select 和 poll 比较
+
+### 1. 功能
+
+它们提供了几乎相同的功能,但是在一些细节上有所不同:
+
+- select 会修改 fd_set 参数,而 poll 不会;
+- select 默认只能监听 1024 个描述符,如果要监听更多的话,需要修改 FD_SETSIZE 之后重新编译;
+- poll 提供了更多多的事件类型。
+
+### 2. 速度
+
+poll 和 select 在速度上都很慢。
+
+- 它们都采取轮询的方式来找到 I/O 完成的描述符,如果描述符很多,那么速度就会很慢;
+- select 只使用每个描述符的 3 位,而 poll 通常需要使用 64 位,因此 poll 需要复制更多的内核空间。
+
+### 3. 可移植性
+
+几乎所有的系统都支持 select,但是只有比较新的系统支持 poll。
+
## select() poll() epoll 应用场景
很容易产生一种错觉认为只要用 epoll() 就可以了,select() poll() 都是历史遗留问题,并没有什么应用场景,其实并不是这样的。
@@ -1285,3 +1393,6 @@ poll 没有最大描述符数量的限制,如果平台支持应该采用 poll
- [Synchronous and Asynchronous I/O](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365683(v=vs.85).aspx)
- [Linux IO 模式及 select、poll、epoll 详解](https://segmentfault.com/a/1190000003063859)
- [select / poll / epoll: practical difference for system architects](https://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-difference-for-system-architects/)
+- [poll vs select vs event-based](https://daniel.haxx.se/docs/poll-vs-select.html)
+- [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/)
diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md
index 0c56070e..bac42e6a 100644
--- a/notes/计算机操作系统.md
+++ b/notes/计算机操作系统.md
@@ -22,7 +22,8 @@
* [页面置换算法](#页面置换算法)
* [五、设备管理](#五设备管理)
* [磁盘调度算法](#磁盘调度算法)
-* [六、参考资料](#六参考资料)
+* [六、链接](#六链接)
+* [参考资料](#参考资料)
@@ -812,7 +813,9 @@ SCAN 算法在 SSTF 算法之上考虑了磁头的移动方向,要求所请求
CSCAN 对 SCAN 进行了改动,要求磁头始终沿着一个方向移动。
-# 六、参考资料
+# 六、链接
+
+# 参考资料
- Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
- 汤子瀛, 哲凤屏, 汤小丹. 计算机操作系统[M]. 西安电子科技大学出版社, 2001.
diff --git a/pics/76a49594323247f21c9b3a69945445ee.png b/pics/76a49594323247f21c9b3a69945445ee.png
new file mode 100644
index 00000000..788ba0b1
Binary files /dev/null and b/pics/76a49594323247f21c9b3a69945445ee.png differ
diff --git a/pics/flow.png b/pics/flow.png
new file mode 100644
index 00000000..aa0492a4
Binary files /dev/null and b/pics/flow.png differ