当前位置: 首页 > news >正文

linux 什么是io,Linux异步IO是什么?

Linux的I/O机制经历了一下几个阶段的演进:

1。 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。

2。 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。

3。 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达到此目的。

4。 异步时间非阻塞I/O: 也叫做异步I/O(AIO),用户程序可以通过向内核发出I/O请求命令,不用等带I/O事件真正发生,可以继续做

另外的事情,等I/O操作完成,内核会通过函数回调或者信号机制通知用户进程。

这样很大程度提高了系统吞吐量。

下面就AIO做详细介绍:

要使用aio的功能,需要include头文件aio。h,在编译连接的时候需要加入POSIX实时扩展库rt。下面就aio库的使用做介绍。

1。 AIO整个过程所使用的数据存放在一个结构体中,struct aiocb,aio control block。

看看头文件中的定义:

/* Asynchronous I/O control block。

*/

struct aiocb

{

int aio_fildes;

/* File desriptor。

*/ 需要在哪个文件描述符上进行I/O

int aio_lio_opcode;

/* Operation to be performed。

*/ 这个是针对批量I/O的情况有效,读写操作类型

int aio_reqprio;

/* Request priority offset。

*/ 请求优先级(If

_POSIX_PRIORITIZED_IO

is defined, and this file supports it, then the

asynchronous operation is submitted at a priority equal to that of the

calling process minus aiocbp->aio_reqprio。

)

volatile void *aio_buf;

/* Location of buffer。

*/ 具体内容,数据缓存

size_t aio_nbytes;

/* Length of transfer。

*/ 数据缓存的长度

struct sigevent aio_sigevent; /* Signal number and value。

*/ 用于异步I/O完成后的通知。

内部实现使用的数据成员。

/* Internal members。

*/

struct aiocb *__next_prio;

int __abs_prio;

int __policy;

int __error_code;

__ssize_t __return_value;

#ifndef __USE_FILE_OFFSET64

__off_t aio_offset;

/* File offset。

*/

char __pad[sizeof (__off64_t) - sizeof (__off_t)];

#else

__off64_t aio_offset;

/* File offset。

*/ 文件读写偏移

#endif

char __unused[32];

};

2。

int aio_read(struct aiocb *aiocbp);

异步读操作,向内核发出读的命令,传入的参数是一个aiocb的结构,比如

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb。

aio_fildes = fd;

myaiocb。aio_buf = new char[1024];

myaiocb。aio_nbytes = 1024;

if (aio_read(&myaiocb) != 0)

{

printf("aio_read error:%s\n" , strerror(errno));

return false;

}

3。

int aio_write(struct aiocb *aiocbp);

异步写操作,向内核发出写的命令,传入的参数仍然是一个aiocb的结构,当文件描述符的O_APPEND

标志位设置后,异步写操作总是将数据添加到文件末尾。如果没有设置,则添加到aio_offset指定的

地方,比如:

struct aiocb myaiocb;

memset(&aiocb , 0x00 , sizeof(myaiocb));

myaiocb。

aio_fildes = fd;

myaiocb。aio_buf = new char[1024];

myaiocb。aio_nbytes = 1024;

myaiocb。aio_offset = 0;

if (aio_write(&myaiocb) != 0)

{

printf("aio_read error:%s\n" , strerror(errno));

return false;

}。

全部

相关文章:

  • linux基础实验报告6,Linux实验报告6参考解析.doc
  • c语言树的类型作用是什么,C语言数据的基本类型有哪些?
  • c语言作业二闰年,浙大版《C语言程序设计(第3版)》题目集 练习3-5 输出闰年 (15 分)...
  • 汇编语言与c 混合编程,汇编语言与C C 混合编程精选.ppt
  • c语言链式表,c语言实现数据结构中的链式表
  • socket双向通信c语言,WebSocket实现实时双向通信
  • 递归函数c语言求分段函数,Python 实现递归函数求解分段函数表达式;并解释递归函数其原理...
  • c语言验证完成排序算法的时间,排序算法的时间复杂度和空间复杂度
  • c语言租游艇算法思路,租用游艇问题(C或C)长江游艇俱乐部在长江上设置了n个游艇出租站 爱问知识人...
  • 陕科大c语言题库,C语言考试题库
  • linux设置url转发,Apache+Weblogic实现URL转发
  • android 广播注册多次,记一次安卓开发广播重复注册的解决方案
  • Android封装拍照sdk,Android 短视频拍摄、拍照滤镜 第三方库SDK
  • c 开发android原生程序,Android原生开发极简教程
  • 印象笔记Android版本,【版本更新】印象笔记Windows 版、Mac 版、安卓版更新说明...