1.同步/异步,阻塞/非阻塞的区别
同步/异步是侧重与程序间的消息通信机制。
同步意味着程序发起调用一直同步等待直到结果返回。
异步意味着程序发起调用后不管结果是否ok,调用立即返回。
阻塞/非阻塞是针对等待结果时程序的状态
阻塞意味着如果没有调用结果没有准备好当前程序挂起
非阻塞意味着如果调用结果没有准备好程序可以做其他事情,可能一直轮询调用直到结果ok
2.阐述IO
下面站在IO的角度阐述同步IO/异步IO,阻塞IO/非阻塞IO
例如缓存IO,客户端请求某页面,httpd进程发起线程调用read(),查看内核缓冲区是否有数据,如果没有,从磁盘加载通过DMA的方式进内核缓冲区,然后再通过CPU将数据拷贝到用户空间。
一言蔽之,1.数据先从磁盘拷贝到内核缓冲区
2.从内核缓冲区拷贝到用户空间
针对于第一步而言,如果内核缓冲区中没有需要的数据或者说没有准备好,此时程序是阻塞还是非阻塞。
针对第二步而言,如果程序发起系统调用时,程序不需要同步等待而是发起系统调用后立即返回,而是由内核将数据从内核缓冲区拷贝到用户空间完毕后通知用户进程则为异步IO,如果程序发起系统调用后将 CPU执行权交给内核并同步等待数据从内核缓冲区拷贝到用户空间则称为同步IO
阻塞IO和非阻塞IO指的是程序对于文件描述符是否就绪的是否阻塞
同步IO和异步IO指的是程序发起系统调用与内核缓冲区读写数据时是否同步等待
3.五种网络IO模型:
3.1阻塞IO
程序发起IO操作后,如果内核缓冲区无数据或者数据未准备好,程序一直阻塞到内核缓冲区中数据准备好,然后通过CPU拷贝将数据从内核缓冲区拷贝到用户空间。程序全程都是阻塞状态。
3.2非阻塞IO
程序发起read()系统调用,如果内核缓冲区中无数据或者数据未准备好,程序立即返回错误,程序一直轮询调用,直到内核缓冲区中数据准备好,然后程序将CPU执行权交给内核,程序同步等待数据从内核缓冲区拷贝到用户空间。
3.3多路复用IO
程序通过select()发起系统调用将一个或多个文件描述符传给内核,该方法可以设置阻塞或非阻塞模式,select()方式监控文件描述符的就绪状态,这里的就绪直到的文件描述符可读或者可写,即内核缓冲区数据已经准备好或者可以写入数据,当文件描述符就绪后通知进程,进程再发起read()系统调用,程序同步等待数据从内核缓冲区拷贝到用户进程
3.4信号驱动IO
用户程序向内核发起sigaction()系统调用,当文件描述符处于就绪后,内核向程序发送SIGIO信号,然后程序向内核发起read()系统调用,由内核通过CPU将数据由内核缓冲区拷贝到用户空间。
3.5异步IO
程序向内核发起aio_read()系统调用,并指定信号通知或回调函数,然后程序可以一直干其他事情,直到内核缓冲区数据就绪,并将内核缓冲区数据拷贝到用户空间后,通知调用程序指定信号或者回调函数。异步IO看似完美,但是将数据从内核缓冲区拷贝到用户需要CPU参与,存在内核和应用进程争用CPU的情况,如果高并发的情况下需要处理好才行。
网友评论