读取两个或者两个以上的I/O,如果使用了阻塞的I/O,如果长时间的阻塞在一个文件描述符上,其他描述符即使有数据也不能够读取出来,如何解决这个问题呢,下面提供集中方案以及他们之间的对比:
1、使用多线程或者多进程,以达到隔离用户的目的,但是这会增加系统开销,开辟进程或者线程都会对于内存堆栈等系统资源产生一定的开销;
2、使用非阻塞的I/O,当一个I/O不可读是立即返回,去读取下一个I/O,这种方式成为轮询(polling),这种方式会消耗CPU的时间,对于任何一个文件描述符,CPU都要不断地反复执行read系统调用;
3、异步I/O,当一个文件描述符准备好之后通过信号告诉进程,哪个文件描述符已经准备就绪,由于信号个数有限,所以还会导致一定的限制;
4、采用I/O多路复用,利用select,poll或者epoll机制来进行处理,这种方式,3中机制各有优缺点,select有文件有文件描述符限制,最大为1024,而且当文件描述符较多时,效率会大大降低,epoll机制相对于select具有很高地效率,但是epoll在处理数量少文件描述符时,没有select或poll效率高。