标签归档:IO

Java基础知识 之 IO

操作系统IO五类模型

  • IO操作的两个阶段:1.等待数据的到来,当数据到来时将数据拷贝到内核临时缓冲区;2. 将数据从内核临时缓冲区拷贝到用户缓冲区;
  • 阻塞IO、非阻塞IO:阻塞IO就是进程一直等待数据的到来直到抵达超时时间;非阻塞IO就是采用“轮询”的方式询问操作是否准备就绪,是一种浪费CPU的方式;在阻塞IO上上进一步改进,一个阻塞IO监控一个套接字比较改进为使用IO复用(select 、poll),一次监控多个套接字,减少轮询次数,轮询模式一定程度上牺牲了实时性;当然select一次管理的socket的数量有上限,比如在linux 2.6.15内核中最大值为1024。

  • 当然IO复用一定程度上解决了我们一些问题,但是他的副作用也很明显,对CPU的压力、牺牲的实时性。接下来还有2种方式时异步IO模式,型号驱动IO模式和异步IO模式;异步IO与异步信号IO的区别是异步IO是内核所有操作处理完毕后才会通知,而信号异步IO是内核执行过程中也会通知,比如数据准备完毕后的通知。异步IO是最理想的工作方式,但是目前在实践中一直没有稳定的内核版本推出。

  • 在异步IO未成熟的情况下,解决select模式的socket句柄数限制,在Linux 2.6 内核中引入了epoll IO多路复用技术。poll每次调用时对集合进行线性扫描,而epoll只会对活跃的socket进行操作,这样IO效率不随FS数量的增加而线性下降;其次,为了解决数据从内核态到用户态的拷贝,在用户空间和内核空间的划出一片共同区域mmap实现数据交换;基于事件驱动,避免每次都把所有fd都扫描一遍

继续阅读

Advertisements