一.阻塞IO
recvfrom:c语言中接受数据的方法
当进程没有拿到数据的返回结果前一直是阻塞的状态
二.非阻塞IO
当进程发送调用请求后,如果数据没准备好。他会返回一个状态码,他并不会阻塞你这个进程。我们需要使用轮询的方式判断数据是否准备好,当他准备好数据时,就会返回数据。
三.IO复用
优势是处理多个连接的情况。
1.select/poll
select/poll:单个进程可以同时处理多个客户端的连接
相当于把多个服务器连接注册到select上,监听器一起监听,一旦发现某个连接准备好了,这个连接再发起请求,然后得到结果(数据从内核空间复制到内存空间)
select /poll缺点 :单个进程所能打开的fd()默认:1024 ,每次 轮询需要判断所有的的连接(包括空的)
jdk1.5之前的NIO是使用这种模型jdk1.6之前的NIO是使用这种模型之后引入了epool.
2.epool
epool:不去轮询判断你是否准备好,你准备好了来通知我。
epool改进:
- 对单个进程所打开的连接数没有限制.
- 利用每个fd上的callback函数来实现异步回调,省略了轮询的开销
- mmap(内核空间与用户空间用同一映射地址,减少内存复制)
epool:相当于去饭店点菜,菜作好了,他会告诉你,然后你在去饭店去取。(伪异步)
select/poll和epoll区别
四.信号驱动IO
五.异步IO
相当于去饭店点菜,菜作好了,他会告诉你然后再给你送到家门口。(省去了内核空间复制到用户空间的过程)