阻塞I/O
程序发起一次IO操作后就会一直等待,直到IO成功或者失败才能返回,期间不能做其它事情。
非阻塞I/O
程序发起一次IO后,不断地进行轮询,直到获得数据。
I/O多路复用
也是阻塞型IO,但是不同的是IO多路复用可以同时阻塞多个IO,并对多个IO进行轮询监控,直到有一个IO的数据可用。
select时间复杂度O(n),有数量限制;poll时间复杂度O(n),没有数量限制,因为是用链表实现的;epoll时间复杂度O(1),是事件驱动的而不是轮询。
epoll使用回调机制而不是轮询,就是当文件描述符就绪后主动通知。
对回调函数调用:调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序执和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
信号驱动I/O
利用系统的信号机制,由内核告诉进程哪一个IO已经完成。
异步I/O
异步IO是指程序发起IO操作之后就去干其它事情,而不需要等待IO结果。
跟信号驱动IO优点像,但区别是信号驱动IO在内核提醒IO完成之后还要程序完成数据从内核态到用户态的拷贝,而异步IO是在数据拷贝完成之后才通知的程序。