Skip to content

Commit 27a7958

Browse files
committed
fix redis readme file
1 parent fc81668 commit 27a7958

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

springboot-jedis-sample/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@ Epoll模型属于诸多IO多路服用模型中的一种,但是相比其他IO
1717
> - 内存拷贝,Epoll在这点上使用了“共享内存”,这个内存拷贝也省略了;
1818
1919
**Epoll与Select/Poll的区别:**
20+
2021
> - Select、Poll、Epoll都是IO多路复用机制。I/O多路复用就是一种机制,可以监视多个描述符,一旦某个描述符就绪,能够通知程序进行相应的操作;
2122
> - Select的本质是采用32个整数的32位,即32 x 32=1024来标识,fd的值为1~1024。当fd的值超过1024限制时,就必须修改FD_SETSIZE的大小。这个时候可以标识32*max值范围的fd;
2223
> - poll和select不同,通过一个pollfd数组向内核传递关注的事件,故没有描述符个数的限制,pollfd中的events字段和revents分别用于标示关注的事件和发生的事件,故pollfd数组只需要被初始化一次;
2324
> - Epoll还是Poll的一种优化,返回后不需要对所有的fd进行遍历,在内核中维持了fd的列表。Select和Poll是将内核列表维护在用户态,然后传递到内核态中。与Poll/Select不同,Epoll不再是一个单独的系统调用,而是由epoll_create/epoll_ctl/epoll_wait三个系统调用组成,Epoll在Linux2.6以后内核才支持;
2425
2526
**Select/Poll的几大缺点:**
27+
2628
> - 每次调用select/poll,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;
2729
> - 同时每次调用select/poll都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也会很大;
2830
> - 针对select支持的文件描述符数量太小时,默认是1024;
@@ -31,12 +33,14 @@ Epoll模型属于诸多IO多路服用模型中的一种,但是相比其他IO
3133
> - poll相比select模型,poll使用链表保存描述符,因此没有监视文件数量的限制,pollfd支持复用仅初始化一次,但是依然存在fd拷贝和遍历问题;
3234
3335
**Epoll IO多路复用模型实现机制:**
36+
3437
由于epoll的实现机制与select/poll机制完全不同,上面所说的select的缺点在epoll中不复存在。
3538
epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子:在1GB的内存机器上大约是10万左右的最大连接。
3639

3740
Epoll如何实现高并发的?
3841
在select/poll时代,服务器进程每次都需要把连接告诉操作系统(从用户态复制句柄数据到内核态),让操作系统内核去内核查询这些套接字上是否有事件变化,轮训完后再复制到用户态,让服务器应用程序轮询处理已发生的网络事件,这个过程消耗较大,因此select/poll无法处理几千个并发连接。
3942
epoll的设计和实现与select完全不同,epoll通过在linux内核中申请一个简易的文件系统(采用B+Tree结构存储)。把原先的select/poll调用分为3个部分:
43+
4044
> - 调用epoll_create()建立一个epoll对象(在epoll文件系统中这个句柄对象分配资源);
4145
> - 调用epoll_ctl向epoll对象添加套接字;
4246
> - 调用epoll_wait收集发生事件的连接;

0 commit comments

Comments
 (0)