0%

Linux aio异步读写

[TOC]

linux下aio异步读写

为什么会有异步I/O

aio异步读写是在linux内核2.6之后才正式纳入其标准。
之所以会增加此模块,是因为众所周知我们计算机CPU的执行速度远大于I/O读写的执行速度,
如果我们用传统的阻塞式或非阻塞式来操作I/O的话,
那么我们在同一个程序中(不用多线程或多进程)就不能同时操作俩个以上的文件I/O,
每次只能对一个文件进行I/O操作,
很明显这样效率很低下(因为CPU速度远大于I/O操作的速度,
所以当执行I/O时,CPU其实还可以做更多的事)。因此就诞生了相对高效的异步I/O

2.异步I/O的基本概念

所谓异步I/O即我们在调用I/O操作时(读或写)我们的程序不会阻塞在当前位置,而是在继续往下执行。
例如当我们调用异步读API aio_read()时,程序执行此代码之后会接着运行此函数下面的代码,并且与此同时程序也在进行刚才所要读的文件的读取工作,但是具体什么时候读完是不确定的

3.异步aio的基本API

API函数 说明
aio_read 异步读操作
aio_write 异步写操作
aio_error 检查异步请求的状态
aio_return 获得异步请求完成时的返回值
aio_suspend 挂起调用进程,直到一个或多个异步请求已完成
aio_cancel 取消异步请求
lio_list 发起一系列异步I/O请求

并发与并行

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。

所以我认为它们最关键的点就是:是否是『同时』。

并发与并行的区别:

img

并发和并行都可以是很多线程,就看这些线程能不能被多个CPU执行,如果可以就是并行,而并发是多个线程被一个CPU轮流切换着执行。

顺序:上一个任务完成后,才能执行当前任务

并发:无论上一个任务是否完成,当前任务就可以开始

  • 串行:有一个任务执行单元,物理上只能一个任务、一个任务地执行

  • 并行:有多个任务执行单元,物理上可以多个任务一起执行

    • OpenMP:一个job凤城若干个部分,分给不同的processor去做,每个process又可以多线程去完成任务
    • MPI:Master节点把job分成若干个部分,分给其他slave和自己去run,可能会涉及到node之间的message passing,比如node A完成以后在开始node B

异步:a synchronized,类似UDP

同步:synchronize,类似TCP

多线程:同时做N件事情

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道