文章目录
- 流
- IO模型
- 阻塞IO
- 非阻塞IO
- IO多路复用
- 异步IO
- 网络IO模型
流
- 可以进行IO(input输入、output输出)操作的内核对象;
- 如文件、管道、socket…
- 流的入口是fd (file descriptor);
IO模型
- 阻塞IO, 一直等待,不占用资源;无法同时处理多个任务;
流程图
-
非阻塞IO, 忙轮询,占用CPU;
-
IO多路复用,多个IO复用一个进程/线程,既可以阻塞等待不占用资源,又可以同时并发处理多个任务;
- linux 支持select, poll, epoll
-
异步IO;
阻塞IO
非阻塞IO
- 忙轮询,占用CPU;
- 性能不如阻塞IO;
- 代码流程,不停地 遍历所有的fd,查看是否就绪;
IO多路复用
多个IO复用一个进程/线程,既可以阻塞等待不占用资源,又可以同时并发处理多个任务;
- select
- 最大连接数默认1024;
两次拷贝
,先将所有的fd 从用户空间拷贝到内核空间,由内核监控是否有fd就绪(可读或可写),也就是有网络事件发生;一旦有fd就绪,则遍历所有的fd集合,找到对应的fd并将其 标记为就绪态(可读、可写),然后将所有的fd(fd集合)从内核空间拷贝到用户空间,用户进程内遍历所有的fd,找出就绪的从进行读写;两次遍历
;- 并发量大时,性能下降;
- 代码流程:
- poll,与select 没有本质的区别,只是连接数比select多;
- epoll,高性能的IO多路复用
- 连接数更大,上限为进程的最大连接数;
- 内核中采用红黑树结构,可高效地增删改,仅返回就绪的fd;
- 将就绪的fd拷贝给用户进程,避免无用的遍历;
- 适合并发量大的场景,可以解决C10K问题(单台服务器并发1w)
异步IO
网络IO模型
socket网络通信