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