一、复习review
1.1 多进程和多线程的对比
-
多线程模型需要处理
SIGPIPE
信号,因为多次去写
就会触发SIGPIPE信号
-
多进程的优缺点:一个进程挂掉不会影响其他的进程,稳定;进程之间通信麻烦,需要分配更多的内存
-
多线程的优缺点:一个线程发生致命错误,整个进程都会退出;线程间通信方便,分配的内存少
-
资源上限:
ulimit -a
1.2 状态
二、TCP流量控制(滑动窗口)
- MSS:Max Segment Size
三、IO复用Select
- 对比多线程多进程,活跃的就只是少数的几个
- N核CPU就开N个进程
多进程和多线程的缺点是大量执行单位之间的频繁切换
轮询的缺点是CPU常常会处于空转占用的状态
-
反应堆
就是IO复用
——多个套接字Socket放在一起 - 反应堆使用
FD_SET
来表示
select
是从头开始轮询,时间复杂度是O(n)
四、poll(举手)
- select中的反应堆和结果反应堆是同一个,所以每次要重新初始化
- poll中的反应堆和结果反应堆分开了,是2个,所以不用初始化
读事件
触发
时间复杂度是O(n)
可以处理的事件个数,基于可以打开的fd的个数:65535(ulimit - a
);能同时上万个就很牛逼了
五、epoll
- 调用一次
epoll_ctl()
只能处理一个文件描述符,如果想处理2个文件描述符,就需要调用2次epoll_ctl()
- ET的优点:如果从0变成1,是可以及时反馈的,但是LT就不一定
- ET的缺点:如果错过了
时间点
,没有检测到触发,那么就再也检测不到了 - ONESHOT是只监听一次,触发完就会从那棵树上直接
摘下该节点
-
epoll树
是平衡二叉树 - epoll时间复杂度是
O(logn)
,因为本质上就是就绪队列
,就像在一个平衡二叉树中查找某个节点 - epoll的缺点是还要
维护一棵树
,树中节点的删除,添加
都是需要时间的
六、setsockopt
- 要在
bind()
之前,socket
之后,设置端口复用
- 设置套接字属性就放在socket()刚创建出来的后面
先关闭服务器,再重新用
相同的端口
是可以的,服务器这个时候属于TIME_WAIT
状态
网友评论