IO整理

名词解释:

区域

用户态:用户应用程序所在的。
内核态:操作系统程序所在的。

磁盘与内核态的缓存传输数据

PIO:很早之前数据在磁盘与内存间交互需要CPU存储转发,大量占用CPU时间,这种模式叫做PIO。
DMA:直接内存访问,CPU告诉DMA控制器,DMA通过系统总线传输数据,完毕了告诉CPU,大量地减少了CPU时间的占用。

两种copy方式

CPU copy:缓存与缓存之间copy
DMA copy:磁盘与缓存之间copy

两种IO

文件IO(磁盘IO):本地磁盘与本地应用程序缓存间传输数据。
网络IO:主机将数据从磁盘发送到网卡缓存中,再发送出去与其他主机传输数据。

多种IO流程

总体流程:

image.png

缓冲IO:磁盘数据DMA copy到内核态高速页缓存,应用程序通过系统调用从内核态高速页缓存CPU copy到用户态应用程序缓存中。这样如果高速页缓存中有的数据就不用读取磁盘从而提升性能。
image.png

直接IO:应用程序不经过内核态高速页缓存直接系统调用读取磁盘数据,一些数据库管理类的应用倾向于选择自己的缓存机制而不使用高速缓存页,但是如果应用程序缓存中没有的数据从磁盘加载速度会非常缓慢。

image.png

内存映射:指的是内核态高速缓存页与用户态应用程序缓存建立地址映射,通过共享的方式减少从内核态到用户态的CPU copy。当有大量数据需要传输时使用内存映射会获得比较好的效率。

image.png

网络IO中的零拷贝:正常网络IO流程为 磁盘数据-->DMA copy-->内核态高速页缓存-->CPU copy-->用户态应用程序缓存-->CPU copy-->内核态Socket缓存-->DMA copy-->网卡缓存-->网络发送。一共4次copy。
零拷贝网络IO流程为 磁盘数据-->DMA copy-->内核态高速页缓存-->apend dscr(追加位置与偏移量)-->内核态Socket缓存-->DMA gather copy(根据Socket缓存中的位置与偏移量去高速页缓存中获取数据)-->网卡缓存-->网络发送。一共2次copy。可以看到比正常的网络IO流程减少了2次copy操作

同步异步阻塞非阻塞

同步就是两种东西通过一种机制实现步调一致,异步是两种东西不必步调一致。

  1. 同步调用与异步调用:
    在用在调用场景中,无非是对调用结果的不同处理。我理解同步调用就是调用一但返回,就能知道结果,而异步是返回时不一定知道结果,还得通过其他机制来获知结果,如:a. 状态b. 通知c. 回调函数
    这里的同步调用不一定会阻塞,例如立即返回失败的结果。而异步调用立即返回时,你还拿不到结果的。
  2. 同步线程与异步线程:
    同步线程:即两个线程步调要一致,要相互协商。两个线程的运行进度各不相同,怎么才能步调一致呢?我们直观的理解就是,快的等慢的呗!快的阻塞一下等到慢的步调一致即可。
    异步线程:步调不用一致,各自按各自的步调运行,不受另一个线程的影响。同步是指两个线程的运行是相关的,其中一个线程可能要阻塞等待另外一个线程的运行;异步的意思是两个线程毫无相关,自己运行自己的。
  3. 同步通信与异步通信:
    这里的同步和异步是指:发送方和接收方是否协调步调一致!
    同步通信是指:发送方和接收方通过一定机制,实现收发步调协调。如:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式
    异步通信是指:发送方的发送不管接收方的接收状态,如:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

阻塞和非阻塞就比较容易理解了,没有上面那么多场景,阻塞就是这个事情阻到这儿了,不能继续往下干事了,非阻塞就是这个事情不会阻碍你继续干后面的事情。阻塞可以是实现同步的一种手段!例如两个东西需要同步,一旦出现不同步情况,我就阻塞快的一方,使双方达到同步。

同步是两个对象之间的关系,而阻塞是一个对象的状态。

按照我自己的理解
IO的同步和异步,说的是2个进程之间的事情,一个是用户态的用户进程,另一个是内核态的系统调用进程。
说它们是同步的,说明2个进程之间努力的想要步调一致,比如一方一直等待,或者不停请求。
说它们是异步的,说明2个进程之间没有努力的想要步调一致,各自不管,等到一方完事了给个通知或者回调函数等。

阻塞非阻塞说的是一个进程的事情,自己处于了等待状态就是被阻塞了,仍然运行或者运行完毕就是非阻塞的。

一个类比
老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

5个IO模型

https://www.cnblogs.com/sunsky303/p/8962628.html
https://www.cnblogs.com/williamjie/p/11194561.html
http://www.52im.net/thread-2640-1-1.html
https://www.cnblogs.com/jianmang/articles/4909784.html
https://www.zhihu.com/question/29005375

你可能感兴趣的:(IO整理)