1.网络IO


1.1 网络的两个阶段

第一阶段:硬件接口到内核态
第二阶段:内核态到用户态

image.png

1.2 阻塞IO BIO

image.png
概念:两个阶段都阻塞
解决方法: 多线程 + 阻塞IO

  1. while(1) {
  2. connfd = accept(listenfd); // 阻塞建立连接
  3. pthread_createdoWork); // 创建一个新的线程
  4. }
  5. void doWork() {
  6. int n = read(connfd, buf); // 阻塞读数据
  7. doSomeThing(buf); // 利用读到的数据做些什么
  8. close(connfd); // 关闭连接,循环等待下一个连接
  9. }

1.3 非阻塞IO NIO

image.png
概念:在第一阶段(网卡-内核态)数据未到达时不等待,然后直接返回
优点: 一个线程可以处理多个连接,这也是其非阻塞决定的。
缺点: 系统调用效率问题

  1. fdlist.add(connfd);
  2. while(1) {
  3. for(fd <-- fdlist) {
  4. if(read(fd) != -1) {
  5. doSomeThing();
  6. }
  7. }
  8. }

1.4 IO复用1.0(select poll)

概念:将一批文件描述符通过一次系统调用传给内核,由内核层去遍历

1.5 IO复用2.0(epoll)

1.6 异步IO AIO

概念:用户进程调用函数后即可继续执行,操作系统准备好数据到用户态后通知用户进程