彻底理解BIO,NIO,AIO

用户空间和内核空间

在IO操作过程中都是应用程序先把数据拷贝到用户空间的缓冲区,在把缓冲区的数据拷贝的内核空间的缓冲区,最后再将内核空间缓冲区的数据保存到磁盘。

彻底理解BIO,NIO,AIO

io操作过程

BIO操作IO过程

彻底理解BIO,NIO,AIO

bio

BIO是同步阻塞IO :同步表示线程A发起IO操作后会亲自接收IO操作完后的结果,阻塞主要表现在IO在操作过程中由于数据没有准备好或者内核空间还没有把数据返回 这两个过程一直处于阻塞状态.

注:在NIO还没有出现的时候 为了提高BIO的性能主要是用多线程方式解决:当一个客户端的请求来的时候,首先accept()会收到客户端的请求,此时会新建一个线程去处理客户端的请求。这样会有一个问题,当客户端请求多了以后,服务器的线程会愈来愈多,服务器的压力会很大。

BIO缺点:

1.每个Socket接收到,都会创建一个线程,线程的竞争、切换上下文影响性能;

2.每个线程都会占用栈空间和CPU资源;

3.并不是每个socket都进行IO操作,无意义的线程处理;

NIO操作IO过程:

彻底理解BIO,NIO,AIO

nio

NIO是同步非阻塞:非阻塞的过程主要表现在所有请求都会注册到selector选择器上,当数据没有准备好就直接返回,而selector选择器会通过轮询的方式判断请求的线程数据是否已经准备好。IO操作数据是通过Buffer缓冲区与内核交付,当数据准备好后就会马上去读取,而BIO此时会一直阻塞等待数据准备和返回,而NIO通过这个Buffer缓冲区做了一个桥梁大大提高了效率

AIO是异步IO:是指当线程发起IO操作时马上就返回了,把所有的操作都交给了操作系统去完成,当操作系统完成IO操作后会通过事件回调的方式通过IO线程。

关于阻塞与非阻塞 同步与异步的区别:

一般来说IO分为两个阶段,第一阶段是等待数据阶段,第二阶段是内核空间的数据拷贝到用户空间,

假设一个线程(或是进程)P准备执行一个IO操作的话它会经历以下过程:

第一阶段:

P发出一个IO请求,这时候会有两种情况:

1:立刻返回: 非阻塞

2:一直等待,P调用sleep/wait休眠或是挂起,让出CPU给别的线程/进程 阻塞

第二阶段:

这时内核的数据终于准备好了,

那么现在用户进程想要读取内核空间的数据有两种方式:

1: P自己把数据从内核空间拷贝到用户空间 同步

2:P创建一个线程做数据copy的工作 异步

现在应该明白了吧。阻塞/非阻塞是针对IO的第一阶段的描述。异步/同步是针对IO的第二阶段的描述也就是IO的主体。

这里主要比较难理解的就是同步/异步。首先P在发起IO的请求的时候如果P本身还要负责IO请求后的数据copy(内核空间到用户空间)工作。那么我们就可以说是同步的。

如果P在发起IO操作后数据copy的工作由内核线程/进程或是P自己再创建一个线程/进程去完成,那么我们就可以称之为异步


分享到:


相關文章: