Skip to content

Commit 7d87dad

Browse files
committed
update network
1 parent bfb3c4e commit 7d87dad

File tree

14 files changed

+147
-260
lines changed

14 files changed

+147
-260
lines changed

Algorithm/BinarySearch.md

-158
This file was deleted.

Algorithm/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858

5959
二分查找算法(binary search)是一种在有序数组中查找某一特定元素的算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半,因此时间复杂度为 logn。
6060

61-
更多内容参见 [BinarySearch](BinarySearch.md)
61+
更多内容参见 [BinarySearch](https://github.com/xuelangZF/LeetCode/tree/master/BinarySearch)
6262

6363
# 更多阅读
6464

DataBase/Concept.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
数据库(Database)是按照数据结构来**组织、存储和管理数据的仓库**,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。
2+
3+
数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。
4+
15
# 关系数据库
26

37
关系数据库由表的集合构成,每个表有唯一的名字。表中一行代表了一组值之间的一种联系。

DataBase/Design.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
1. 惟一地标识一行。
1818
2. 作为一个可以被外键有效引用的对象。
1919

20-
2120
[候选关键字](http://www.nowcoder.com/questionTerminal/088587c25467478884128c0cb31eeeb8)
2221
[主键、外键](http://www.nowcoder.com/questionTerminal/70100692594e4130a6b3efe344ef3874)
2322

@@ -52,7 +51,7 @@
5251
* `部分函数依赖`:假如Y函数依赖于X,但同时Y并不完全函数依赖于X,那么我们就称Y部分函数依赖于X。
5352
* `传递函数依赖`:假如Z函数依赖于Y,且Y函数依赖于X (严格来说还有一个X不包含于Y,且Y不函数依赖于Z的前提条件),那么我们就称 Z 传递函数依赖于X。
5453

55-
包含在任何一个候选中的属性称为主属性。如果数据表中存在`非主属性`对于候选码的部分函数依赖,则数据表不符合 2NF 的要求,否则,符合2NF。
54+
**包含在任何一个候选中的属性称为主属性。**如果数据表中存在`非主属性`对于候选码的部分函数依赖,则数据表不符合 2NF 的要求,否则,符合2NF。
5655

5756
对于上面的表,所有的函数依赖关系如下图:
5857

@@ -143,10 +142,9 @@
143142

144143
实际应用中,可以使用部分 schema、缓存表等技巧。最常见的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列。在新版本的Mysql中,可以使用触发器更新缓存值。
145144

146-
147145
# 更多阅读
148146

149-
[解释一下关系数据库的第一第二第三范式?](https://www.zhihu.com/question/24696366)
147+
[解释一下关系数据库的第一第二第三范式?](https://www.zhihu.com/question/24696366)
150148

151149
[1]: http://7xrlu9.com1.z0.glb.clouddn.com/DatabaseSystem_Design_1.png
152150
[2]: http://7xrlu9.com1.z0.glb.clouddn.com/DatabaseSystem_Design_2.png

DataBase/Engine.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
## 索引实现
1010

11-
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:
11+
MyISAM引擎使用B+Tree作为索引结构,**叶节点的data域存放的是数据记录的地址**。下图是MyISAM索引的原理图:
1212

1313
![][1]
1414

@@ -49,7 +49,7 @@ InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截
4949

5050
这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
5151

52-
在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。如果从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。
52+
在使用InnoDB存储引擎时,如果没有特别的需要,请永远**使用一个与业务无关的自增字段作为主键**。如果从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。
5353

5454
因为使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有数据,因此效率很高,也不会增加很多开销在维护索引上。
5555

DataBase/SQL_Basic.md

+4-6
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ update 语句可以在不改变整个元组的情况下改变其部分属性的
6969
where salary < (select avg(salary)
7070
from instructor);
7171

72-
SQL 语句提供case 语句,可以利用它在一条语句中执行多种更新,避免更新次序发生的问题
72+
SQL 语句提供case 语句,可以利用它在一条语句中执行多种更新,避免因为更新次序可能引发的问题
7373

7474
update instructor
7575
set salary=case
@@ -122,12 +122,10 @@ SELECT * FROM Websites WHERE country='CN';
122122
* >=:大于等于
123123
* <=:小于等于
124124
* BETWEEN:在某个范围内
125-
* LIKE:搜索某种模式
125+
* LIKE:**搜索某种模式**
126126
* IN:指定针对某个列的多个可能值
127127

128-
### like 模糊匹配
129-
130-
`字符串运算`:在字符串上可以使用`like 操作符`来实现模式匹配(大小写敏感)。
128+
可以在字符串上可以使用`like 操作符`来实现模式匹配(大小写敏感)。
131129

132130
* `百分号%`:匹配任意字符串
133131
* `下划线_`:匹配任意一个字符
@@ -159,7 +157,7 @@ FROM access_log GROUP BY site_id;
159157

160158
## HAVING 子句
161159

162-
在 SQL 中增加 HAVING 子句原因是,`WHERE 关键字无法与聚合函数一起使用`。HAVING 子句可以让我们筛选分组后的各组数据。假设我们想要查找总访问量大于 200 的网站,可以使用下面的 SQL 语句:
160+
在 SQL 中增加 HAVING 子句原因是,**WHERE 关键字无法与聚合函数一起使用**。HAVING 子句可以让我们筛选分组后的各组数据。假设我们想要查找总访问量大于 200 的网站,可以使用下面的 SQL 语句:
163161

164162
```SQL
165163
SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log

Linux_OS/IO_Model.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ epoll操作过程需要三个接口,分别如下:
152152

153153
2. int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
154154

155-
epoll的事件注册函数,它不同与select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
155+
epoll的事件注册函数,它不同于select()是在监听事件时告诉内核要监听什么类型的事件,而是在这里先注册要监听的事件类型。
156156

157157
* 第一个参数是epoll_create()的返回值,
158158
* 第二个参数表示动作,用三个宏来表示:EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;
@@ -217,7 +217,7 @@ epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪
217217

218218
与 I/O 复用密切相关的另一种 I/O 模型是在多线程中使用阻塞式 I/O。这种模型与上述模型极为相似,但它没有使用 select 阻塞在多个描述符上,而是使用多个线程,每个线程阻塞在一个描述符上。
219219

220-
# 参考
220+
# 更多阅读
221221
[Unix五种I/O模型对比](http://sukai.me/linux-five-io-models/)
222222
[IO多路复用之select总结](http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html)
223223
[IO多路复用之epoll总结](http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html)

Linux_OS/SharedMemory.md

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种最有效的方式,不同进程之间共享的内存通常安排为同一段物理内存。
12

2-
3-
# 共享内存接口
4-
3+
进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
54

65
# 实现原理
76

7+
共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。
8+
89

910
(共享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?)
1011

Network/README.md

+1-3
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,6 @@ TCP协议和UDP协议特性区别,主要从连接性、可靠性、有序性
111111

112112
基于TCP的协议有:HTTP/HTTPS,Telnet,FTP,SMTP。
113113
基于UDP的协议有:DHCP,DNS,SNMP,TFTP,BOOTP。
114-
115-
参考 [TCP和UDP的区别](http://liangjiabin.com/blog/2015/03/difference-between-tcp-vs-udp-protocol.html)
116114

117115
# 应用层
118116

@@ -147,7 +145,7 @@ HTTP 有两个主要的版本 HTTP 1.0 和 HTTP 1.1,1.1 版本在带宽优化
147145

148146
[协议森林系列文章](http://www.cnblogs.com/vamei/archive/2012/12/05/2802811.html)
149147
[《计算机网络》这门课为何如此之难?](https://www.zhihu.com/question/19718686)
150-
148+
[TCP和UDP的区别](http://liangjiabin.com/blog/2015/03/difference-between-tcp-vs-udp-protocol.html)
151149

152150
[1]: http://7xrlu9.com1.z0.glb.clouddn.com/Network_01.png
153151
[2]: http://7xrlu9.com1.z0.glb.clouddn.com/Network_02.jpg

Network/TCP.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只
8989

9090
1. **可靠地实现TCP全双工连接的终止**
9191

92-
在进行关闭连接四次握手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,主动关闭端只有在维护状态信息的情况下才可以重新发送最终的那个ACK。如果不维护这个状态信息,主动关闭端将会响应一个RST,对端会将此响应标记为错误,所以不能进行正常的关闭。
92+
在进行关闭连接四次握手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,被动关闭方将重发最终的FIN,主动关闭端只有在维护状态信息的情况下才可以重新发送最终的那个ACK。如果不维护这个状态信息,主动关闭端将会响应一个RST,对端会将此响应标记为错误,所以不能进行正常的关闭。
9393

9494
2. **允许老的重复分节在网络中消逝**
9595

@@ -123,7 +123,7 @@ TCP要保证所有的数据包都可以到达,所以,必需要有重传机
123123

124124
## TCP 滑动窗口
125125

126-
TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是**接收端告诉发送端自己还有多少缓冲区可以接收数据**。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。滑动窗可以是提高TCP传输效率的一种机制。`滑动窗口只关注发送端和接受端自身的状况,而没有考虑整个网络的通信情况`
126+
TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是**接收端告诉发送端自己还有多少缓冲区可以接收数据**。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。滑动窗可以是提高TCP传输效率的一种机制。`要注意滑动窗口只关注发送端和接收端自身的状况,而没有考虑整个网络的通信情况`
127127

128128
为了说明滑动窗口,我们需要先看一下TCP缓冲区的一些数据结构:
129129

@@ -154,7 +154,7 @@ TCP头里有一个字段叫Window,又叫Advertised-Window,这个字段是**
154154

155155
![][8]
156156

157-
下面我们来看一个接受端控制发送端的图示
157+
下面我们来看一个接收端控制发送端的图示
158158

159159
![][9]
160160

Python/Class.md

+15-14
Original file line numberDiff line numberDiff line change
@@ -63,20 +63,21 @@ python的新式类是2.2版本引进来的,之前的类叫做经典类或者
6363

6464
关于统一类(class)和类型(type),具体看下面的例子
6565

66-
class OldClass():
67-
pass
68-
69-
o = OldClass()
70-
print o.__class__ # __main__.OldClass
71-
print type(o) # <type 'instance'>
72-
73-
74-
class newClass(object):
75-
pass
76-
77-
n = newClass()
78-
print n.__class__ # <class '__main__.newClass'>
79-
print type(n) # <class '__main__.newClass'>
66+
```python
67+
class OldClass():
68+
pass
69+
70+
o = OldClass()
71+
print o.__class__ # __main__.OldClass
72+
print type(o) # <type 'instance'>
73+
74+
class newClass(object):
75+
pass
76+
77+
n = newClass()
78+
print n.__class__ # <class '__main__.newClass'>
79+
print type(n) # <class '__main__.newClass'>
80+
```
8081

8182
# 对象属性
8283

0 commit comments

Comments
 (0)