1.网络IO
1.1 网络的两个阶段
1.2 阻塞IO BIO
概念:两个阶段都阻塞
解决方法: 多线程 + 阻塞IO
while(1) {
connfd = accept(listenfd); // 阻塞建立连接
pthread_create(doWork); // 创建一个新的线程
}
void doWork() {
int n = read(connfd, buf); // 阻塞读数据
doSomeThing(buf); // 利用读到的数据做些什么
close(connfd); // 关闭连接,循环等待下一个连接
}
1.3 非阻塞IO NIO
概念:在第一阶段(网卡-内核态)数据未到达时不等待,然后直接返回
优点: 一个线程可以处理多个连接,这也是其非阻塞决定的。
缺点: 系统调用效率问题
fdlist.add(connfd);
while(1) {
for(fd <-- fdlist) {
if(read(fd) != -1) {
doSomeThing();
}
}
}
1.4 IO复用1.0(select poll)
概念:将一批文件描述符通过一次系统调用传给内核,由内核层去遍历
1.5 IO复用2.0(epoll)
1.6 异步IO AIO
概念:用户进程调用函数后即可继续执行,操作系统准备好数据到用户态后通知用户进程