C中异步IO浅析之一:基于AIO_ABI的异步IO

相较于同步IO,异步IO请求发出后,应用程序不用阻塞,可以继续执行后面的业务流程,因此能够极大提高系统并发度和吞吐率。这也是为何许多SAN服务后端数据落盘常常采用异步IO读写的原因。

C语言中提供了两套实现异步IO的方法,根据个人的理解,可以分为原生的AIO_ABI方法和集成的libaio方法。这篇主要介绍原生的异步IO的使用方法。

1. 头文件

和原生异步IO操作相关的函数对应的头文件包括:

/usr/include/linux/aio_abi.h:

里面的内容如下:

此外,还有 /usr/include/aio.h,里面既包括相应的数据结构的定义:

还包括了基本的aio操作:

2. 实现方法

基于上面的库的异步IO的实现有两种方式,示例代码分别如下:

mode 1: base don sleep method

上面这种方式在提交异步写请求之后,休眠一段时间,让后台完成IO请求。只要等待时间足够,IO一般能够完成。但本质上就变成同步的了,而且无法确保IO一定完成,因此,不建议用。

mode 2: based on signal mechanism 示例代码如下:

这种基于aio_xxx 的异步实现,需要通过无名信号量signal机制来判断是否IO完成。上面首先注册一个信号响应函数aioSigHandler, 接着设置异步完成之后产生指定的信号,并且把改信号和信号响应函数通过都注册到mycb的信号事件结构中去。

这样借助signal 通知的机制,就能判断异步IO是否完成,设置可以定制异步完成之后的处理函数。

3. 编译方式

需要链接动态库librt.so,可以参考下面的makefile

[[email protected] test]# cat makefile

dest=async_io

dest: async_io.c

gcc -o async_io async_io.c -lrt

时间: 2024-10-15 08:53:10

C中异步IO浅析之一:基于AIO_ABI的异步IO的相关文章

MSDN搬运 之 [基于事件的异步模式]

基于事件的异步模式概述 那些同时执行多项任务.但仍能响应用户交互的应用程序通常需要实施一种使用多线程的设计方案.System.Threading 命名空间提供了创建高性能多线程应用程序所必需的所有工具,但要想有效地使用这些工具,需要有丰富的使用多线程软件工程的经验.对于相对简单的多线程应用程序,BackgroundWorker 组件提供了一个简单的解决方案.对于更复杂的异步应用程序,请考虑实现一个符合基于事件的异步模式的类. 基于事件的异步模式具有多线程应用程序的优点,同时隐匿了多线程设计中固有

基于事件的异步模式(EAP)

什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消.进度报告和报告结果.然而.net中并不是所有的类都支持EAP,总结起来有以下17个类支持EAP异步. System.Object的派生类型: System.Activies.WorkflowInvoke System.Deployment.Application.ApplicationD

.Net中的并行编程-7.基于BlockingCollection实现高性能异步队列

三年前写过基于ConcurrentQueue的异步队列,今天在整理代码的时候发现当时另外一种实现方式-使用BlockingCollection实现,这种方式目前依然在实际项目中使用.关于BlockingCollection的基本使用请查阅MSDN.源码实现 下面直接上代码:(代码已经放到了我的github上) using System; using System.Collections.Concurrent; using System.Collections.Generic; using Sys

C#中的异步调用及异步设计模式(三)——基于事件的异步模式

四.基于事件的异步模式(设计层面) 基于事件的C#异步编程模式是比IAsyncResult模式更高级的一种异步编程模式,也被用在更多的场合.该异步模式具有以下优点: ·                  “在后台”执行耗时任务(例如下载和数据库操作),但不会中断您的应用程序. ·                  同时执行多个操作,每个操作完成时都会接到通知(在通知中可以区分是完成了哪个操作). ·                  等待资源变得可用,但不会停止(“挂起”)您的应用程序. ·  

C#中的异步调用及异步设计模式(二)——基于 IAsyncResult 的异步设计模式

三.基于 IAsyncResult 的异步设计模式(设计层面) IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用,如 FileStream 类提供了 BeginRead 和 EndRead 方法来从文件异步读取字节,它们是 Read 方法的异步版本 Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象.委托用

在Silverlight中的DispatcherTimer的Tick中使用基于事件的异步请求

需求:在silverlight用户界面上使用计时器定时刷新数据. 在 Silverlight 中的 DispatcherTimer 的 Tick 事件 中使用异步请求数据时,会出现多次请求的问题,以下是ViewModel的代码,看样子没什么问题: using System; using System.Net; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Wind

linux进程调度函数浅析(基于3.16-rc4)

众所周知,进程调度使用schedule()函数来完成,下面我们从分析该函数开始,代码如下(kernel/sched/core.c): 1 asmlinkage __visible void __sched schedule(void) 2 { 3 struct task_struct *tsk = current; 4 5 sched_submit_work(tsk); 6 __schedule(); 7 } 8 EXPORT_SYMBOL(schedule); 第3行获取当前进程描述符指针,存

基于curl的异步http实现

简述用于windows客户端的一个异步http模块的实现 1.需要实现的feature 1.1 很容易地发起异步http请求,然后回调. 1.2 能够管理http并发数. 1.3 能够支持http超时:不依赖于curl中实现的连接超时及其它超时. 1.4 请求可以取消. 2.参与者和简要分析: Manager:接收http请求,调用curl. Request:封装http请求. Response:封装http回应. 线程模型: 这里实现异步一般会开线程,假定有一个UI(主)线程,可能有这些模式:

使用Android新式LruCache缓存图片,基于线程池异步加载图片

import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import a