From fc9fdabd968a9bd02e9b16547b246c09e7ffc21d Mon Sep 17 00:00:00 2001 From: hmao Date: Tue, 17 Nov 2020 18:14:35 -0800 Subject: [PATCH] Update Rocket.md --- Rocket.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Rocket.md b/Rocket.md index fe0d4c1..60ff313 100644 --- a/Rocket.md +++ b/Rocket.md @@ -990,6 +990,20 @@ public class Test { 2、http是超文本传输协议,信息是明文传输, https则是具有安全性的ssl加密传输协议 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443 +### SELECT和EPOLL区别 + +select的几大缺点: + +(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 + +(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大 + +(3)select支持的文件描述符数量太小了,默认是1024 +对于第一个缺点,epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时(在epoll_ctl中指定EPOLL_CTL_ADD),会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每个fd在整个过程中只会拷贝一次。 + +  对于第二个缺点,epoll的解决方案不像select或poll一样每次都把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表)。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd(利用schedule_timeout()实现睡一会,判断一会的效果,和select实现中的第7步是类似的)。 + +  对于第三个缺点,epoll没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和系统内存关系很大。 ### 秒杀并发情况下库存为负数问题