深入了解LINUX下IO模式(一)——一些基本概念

网上看了好多IO,NIO的文字,参差不齐,每篇总是差一两个点没有讲到,所以这里对于我自己理解的做一个总结,也许有不对的地方。

1,基本概念
1.1)同步/异步,阻塞/非阻塞
同步异步主要针对C端:
所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
异步的概念和同步相对。当c端一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
 
阻塞非阻塞主要针对S端:
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。


 
1.2)面向流,面向缓冲区
面向流:每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。
面向缓冲区:数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。
 
1.3)内核态和用户态
内核空间可以访问受保护的内存(32位下高位1G为内核空间),剩下3G为用户空间
操作系统限制用户态不能直接访问硬件设备,所以数据从硬件移动到用户进程的内存时需要2步操作。
 

 
 
1.4)mmap(内存映射)
将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系


  

 
 
2,linux下的5种IO模型


 
5种IO模式关于同步异步,阻塞非阻塞的关系
  阻塞 非阻塞
同步 BIO nonblockingIO
多路复用IO(NIO1.0)
异步 X AIO
 
1,BIO:
阻塞当前线程,等待数据准备


 
2,nonblockingIO:
相当于轮训,将大片的等待时间切割成小片,


 
3,多路复用IO(IO mulitplexing)JAVA中的NIO
监听多个socket,当任何一个数据准备好后就返回,用户进程再调用read函数读取数据,极限情况,如果只监听一个socket那么和BIO是一样的,只有监听的socket多时,才会凸显效率。
重点,后面详细说明


 
4,信号驱动 I/O
5, asynchronous IO


 目前已有Linux下实现方案,但是目前还存在BUG,并且操作效率并不比多路复用的高,所有JDK17之前还一直都是使用多路复用
 

猜你喜欢

转载自tonydark01.iteye.com/blog/2358998