[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请求 |
并发与并行
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。
并发与并行的区别:
并发和并行都可以是很多线程,就看这些线程能不能被多个CPU执行,如果可以就是并行,而并发是多个线程被一个CPU轮流切换着执行。
顺序:上一个任务完成后,才能执行当前任务
并发:无论上一个任务是否完成,当前任务就可以开始
串行:有一个任务执行单元,物理上只能一个任务、一个任务地执行
并行:有多个任务执行单元,物理上可以多个任务一起执行
- OpenMP:一个job凤城若干个部分,分给不同的processor去做,每个process又可以多线程去完成任务
- MPI:Master节点把job分成若干个部分,分给其他slave和自己去run,可能会涉及到node之间的message passing,比如node A完成以后在开始node B
异步:a synchronized,类似UDP
同步:synchronize,类似TCP
多线程:同时做N件事情