异步IO原理及相应函数

何为异步IO?

(1)几乎可以认为:异步IO就是操作系统用软件实现的一套中断响应系统。
(2)异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号

SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进

程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。其实所有的信号

都是软件实现的一种中断机制,所以异步IO其实就是利用了信号这种软件中断机制来工作

的,工作流程如下:
1):设置设备文件fd具有接收IO的功能
2):设置异步IO事件的接收进程
3):注册信号处理函数(也就是绑定)

涉及的函数:
(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)
F_GETFL:获取设备文件fd的操作属性
F_SETFL:设置设备文件fd的操作属性
O_ASYNC:用来设置fd具有可接收异步IO信号的功能
F_SETOWN:设置异步IO事件的接收进程
(2)signal或者sigaction(SIGIO)

示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>

#define FILE "/dev/input/mouse0"

static int fd = -1;

static inline void funcIO(int sig);

int main(void)
{
int flag = -1;
int sig_ret = -1;
int read_ret = -1;
char buf[100] = {0};
struct sigaction sig = {
.sa_handler = funcIO,
};

//打开设备文件
fd = open(FILE, O_RDONLY);
if (-1 == fd)
{
perror("open error");
exit(-1);
}

//把鼠标的fd设置为可接收异步IO信号
flag = fcntl(fd, F_GETFL); //读出fd的属性
flag |= O_ASYNC; //添加O_ASYNC属性,使之具有可接收异步IO信号
fcntl(fd, F_SETFL, flag); //设置属性

//设置当前进程为异步IO事件的接收进程
fcntl(fd, F_SETOWN, getpid());

//绑定异步IO事件处理函数
sig_ret = sigaction(SIGIO, &sig, NULL); //表示不获取旧的处理函数
if (-1 == sig_ret)
{
perror("sigaction error");
exit(-1);
}

/*
//键盘以阻塞的方式
read(0, buf, sizeof(buf)/2);
printf("读出的键盘的数据: %s.\n", buf);
*/

while (1)
{
memset(buf, 0, sizeof(buf));
read_ret = read(0, buf, sizeof(buf)/2);
if (0 < read_ret)
{
printf("读出的键盘的数据: %s.\n", buf);
}
}

//关闭文件描述符
close(fd);

return 0;
}

static inline void funcIO(int sig)
{
char buf[100] = {0};

if (SIGIO != sig)
return;
read(fd, buf, sizeof(buf)/2);
printf("读出的鼠标的数据: %s.\n", buf);
}

时间: 2024-09-27 04:32:09

异步IO原理及相应函数的相关文章

第十七章-异步IO

异步IO的出现源自于CPU速度与IO速度完全不匹配 一般的可以采用多线程或者多进程的方式来解决IO等待的问题 同样异步IO也可以解决同步IO所带来的问题 常见的异步IO的实现方式是使用一个消息循环, 主线程不断的读取这个消息循环以便确定IO操作是否完成 1 协程 协程(微线程, 纤程) 一般子程序调用是一个入口一个出口, 调用的顺序也是明确的 但是协程不同, 执行过程中子程序内部中断, 就会转而执行别的子程序, 等待合适的时间返回 , 这样的行为类似于进程的切换 正因为协程又类似于线程执行的特性

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

相较于同步IO,异步IO请求发出后,应用程序不用阻塞,可以继续执行后面的业务流程,因此能够极大提高系统并发度和吞吐率.这也是为何许多SAN服务后端数据落盘常常采用异步IO读写的原因. C语言中提供了两套实现异步IO的方法,根据个人的理解,可以分为原生的AIO_ABI方法和集成的libaio方法.这篇主要介绍原生的异步IO的使用方法. 1. 头文件 和原生异步IO操作相关的函数对应的头文件包括: /usr/include/linux/aio_abi.h: 里面的内容如下: 此外,还有 /usr/i

Windows内核原理-同步IO与异步IO

目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查异常连接导致的内存泄漏排查的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O.完成端口.IRP.设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理. 目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇

tornado和异步IO的基本简单流程原理

tornado #建立连接 from tornado.httpclient import AsyncHTTPClient #发送请求 from tornado.httpclient import HTTPRequest #事件循环 from tornado import ioloop #接收的次数 REV_COUNTER = 0 #请求的次数 REQ_COUNTER = 0 def handle_response(reponse): """ 处理返回值内容(需要维护计数器,来

Mina、Netty、Twisted一起学(九):异步IO和回调函数

用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,比如Ajax.jQuery的动画等. $.get(url, function() { doSomething1(); // (3) }); // (1) doSomething2(); // (2) 上面的代码是jQuery的Ajax,因为Ajax是异步的,所以在请求URL的过程中并不会堵塞程序,也就是程序运行到(1)并不用等待Ajax请求的结果,就继续往下运行(2).而$.get的

javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较

一.同步阻塞IO BIO就是阻塞式的IO,网络通信中对于多客户端的连入,服务器端总是与客户端数量一致的线程去处理每个客户端任务,即,客户端与线程数1:1,并且进行读写操作室阻塞的,当有你成千上完的客户端进行连接,就导致服务器不断的建立新的线程,最后导致低通资源不足,后面的客户端不能连接服务器,并且连接入的客户端并不是总是在于服务器进行交互,很可能就只是占用着资源而已. 二.伪异步IO 伪异步IO对同步IO进行了优化,后端通过一个线程池和任务队列去处理所有客户端的请求,当用完后在归还给线程池,线程

理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,

Node.js异步IO

为什么要异步I/O? 从用户体验角度讲,异步IO可以消除UI阻塞,快速响应资源 JavaScript是单线程的,它与UI渲染共用一个线程.所以在JavaScript执行的时候,UI渲染将处于停顿的状态,用户体验较差.而异步请求可以在下载资源的时候,JavaScript和UI渲染都同时执行,消除UI阻塞,降低响应资源需要的时间开销. 假如一个资源来自两个不同位置的数据的返回,第一个资源需要M毫秒的耗时,第二个资源需要N毫秒的耗时.当采用同步的方式,总耗时为(M+N)毫秒,代码大致如下: //耗时为

arm驱动linux异步通知与异步IO【转】

转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO>涉及内核驱动函数二个,内核结构体一个,分析了内核驱动函数二个:可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动三个 描述:设备文件IO访问:阻塞与非阻塞io访问,poll函数提供较好的解决设备访问的机制,但是如果有了异步通知整套机制就更加完整了 一.阻塞 I/O,非阻塞IO,异步