Linux内核开发之异步通知与异步I/O(二)

Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O 阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制,但是如果有了异步通知整套机制就更加完善了。       异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一 阅读详情

“曾经有一份真挚的爱情摆在面前,我却不懂珍惜;曾经有一个承诺,我却倍感珍惜,今天一定要好好讲讲..”

讲讲啥,讲讲上节说的那个异步通知的例子呗,大家喜欢看代码,咋们就先上代码:

struct globalfifo_dev                                     
{                                                        
  struct cdev cdev; /*cdev结构体*/                       
  unsigned int current_len;    /*fifo有效数据长度*/
  unsigned char mem[GLOBALFIFO_SIZE]; /*全局内存*/        
  struct semaphore sem; /*并发控制用的信号量*/           
  wait_queue_head_t r_wait; /*阻塞读用的等待队列头*/     
  wait_queue_head_t w_wait; /*阻塞写用的等待队列头*/    
  struct fasync_struct *async_queue; /* 异步结构体指针,用于读 */ 
};
/*文件释放函数*/
int globalfifo_release(struct inode *inode, struct file *filp)
{
	/* 将文件从异步通知列表中删除 */
  globalmem_fasync( - 1, filp, 0);
  return 0;
}

static int globalfifo_fasync(int fd, struct file *filp, int mode)
{
	struct globalfifo_dev *dev = filp->private_data; 
	return fasync_helper(fd, filp, mode, &dev->async_queue);
}

/*globalfifo写操作*/
static ssize_t globalfifo_write(struct file *filp, const char __user *buf,
  size_t count, loff_t *ppos)
{
  struct globalfifo_dev *dev = filp->private_data; //获得设备结构体指针
  int ret;
  DECLARE_WAITQUEUE(wait, current); //定义等待队列

  down(&dev->sem); //获取信号量
  add_wait_queue(&dev->w_wait, &wait); //进入写等待队列头

  /* 等待FIFO非满 */
  if (dev->current_len == GLOBALFIFO_SIZE)
  {
    if (filp->f_flags &O_NONBLOCK)
    //如果是非阻塞访问
    {
      ret =  - EAGAIN;
      goto out;
    } 
    __set_current_state(TASK_INTERRUPTIBLE); //改变进程状态为睡眠
    up(&dev->sem);

    schedule(); //调度其他进程执行
    if (signal_pending(current))
    //如果是因为信号唤醒
    {
      ret =  - ERESTARTSYS;
      goto out2;
    }

    down(&dev->sem); //获得信号量
  }

  /*从用户空间拷贝到内核空间*/
  if (count > GLOBALFIFO_SIZE - dev->current_len)
    count = GLOBALFIFO_SIZE - dev->current_len;

  if (copy_from_user(dev->mem + dev->current_len, buf, count))
  {
    ret =  - EFAULT;
    goto out;
  }
  else
  {
    dev->current_len += count;
    printk(KERN_INFO "written %d bytes(s),current_len:%d\n", count, dev
      ->current_len);

    wake_up_interruptible(&dev->r_wait); //唤醒读等待队列
    /* 产生异步读信号 */
    if (dev->async_queue)
       kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
    
    ret = count;
  }

  out: up(&dev->sem); //释放信号量
  out2:remove_wait_queue(&dev->w_wait, &wait); //从附属的等待队列头移除
  set_current_state(TASK_RUNNING);
  return ret;
}

下面再给出测试程序:
#include ...
//接收到异步读信号的动作
void input_handler(int signum)
{
    printf("Receive a signal from globalfifo,signalnum:%d\n",signum);
}

int main()
{
  int fd, oflags;
  fd = open("/dev/globalfifo", O_RDWR, S_IRUSR | S_IWUSR);
  if (fd !=  - 1)
  {
       //启动信号驱动机制
    signal(SIGIO, input_handler); //让input_handler()处理SIGIO信号
    fcntl(fd, F_SETOWN, getpid());
    oflags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, oflags | FASYNC);
    while(1)
    {
    	sleep(100);
    }
  }
  else
  {
    printf("device open failure\n");
  }
}
当我们加载完驱动并创建完设备节点后,运行上述程序,每当通过echo向/dev/globalfilfo写入新的数据后,input_handler将会被调用。如下所示:
echo 0>/dev/globalfifo
receive a signal from globalfifo ,signalnum:29

 
echo 0>/dev/globalfifo
receive a signal from globalfifo ,signalnum:29

 

echo 0>/dev/globalfifo
receive a signal from globalfifo ,signalnum:29

通过上边实际的例子,小王,明白了吧,我的承诺也兑现了,下次咱们可要开始更高级的东西了..

Linux驱动开发 异步通知实现详解 信号(signal)使用 POSIX 信号机制,设备可以向进程发送信号,通知某个事件发生。常用的信号包括SIGIO(用于异步 I/O 通知)、SIGUSR1SIGUSR2等。信号适用于简单的通知模型,例如设备可用、读写完成等。poll和select通过poll和select系统调用,用户进程可以监视文件描述符的状态变化,如可读、可写等。设备可以通过改变文件状态来通知用户进程 I/O 操作已经完成。适合需要监视多个文件描述符的情况,如网络服务器的实现。异步 I/O(AIO)使用。 阅读详情

相关推荐

理解Linux五种I/O模型、同步I/O与异步I/O、阻塞与非阻塞

五种IO模型 、五种I/O模型的比较 、同步I/O与异步I/O

ZY-JIMMY 3266

linux异步通知 -7

学习目标: 了解linux常用信号; 了解异步通知概念; 在前面代码基础上增加异步通知; 理解: 异步通知:举个例子吧。比如我想要买口罩,现在肺炎很厉害商店都没有卖的了,我在药店交押金预定,不用专门去药店问今天有没有,药店有口罩了售货员小姐姐会通知我。这种情况我认为就是异步通知。 同步通知:我去药店问小姐姐(也可以打电话问,就是我必须主动问人家),问完结果才罢休。 综上:同步和...

u010743406的博客 760

Linux异步I/O库:libaio深入解析与应用

Linux异步I/O库是支持异步I/O操作的一组API集合。本章我们将探讨其基本概念,介绍其发展历程,并解释为什么异步I/O在现代操作系统中变得至关重要。异步I/O允许应用程序发起多个I/O操作而无需阻塞或等待I/O操作完成。这与传统的同步I/O形成鲜明对比,同步I/O会导致程序在等待I/O操作完成时处于空闲状态。异步I/O模型的优势在于它提高了程序的效率和响应速度,特别是在高并发和I/O密集型的应用场景中。我们先从异步I/O的基本概念入手,包括I/O操作的分类和异步I/O的核心机制。

weixin_30838971的博客 1515

linux异步系统,linux内核异步执行流程

linux内核异步执行流程(2009-09-15 13:33:58)标签:系统调用软中断linux内核处理器it进程能够通过中断从一个状态转换到另一个状态,获得这种转换的途径之一是包括异常和中断在内的异步。异常:异常也叫做同步中断,是发生在整个处理器硬件内部的事件。异常通常发生在指令执行之后。大多数现代 处理器允许程序员通过执行某些指令来产生一个异常。其中一个例子就是系统调用。系统调用:用户态的程...

weixin_29256771的博客 286

Android T GPS 定位流程

Gps 定位

好记性不如烂笔头 1355

Blender----利用DEM(tif)生成三维模型

利用DEM(tif)生成三维模型

LongJ_Sir的博客 5422

Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》

阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问。(异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态,这是不是特像硬件上常提的“中断的概念”。上边比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。) 说到信号,在应用程序中

wangpengqi的专栏 2803

网络安全 —— 实验(基于华为eNSP模拟器)

8. 实验八 —— 通过路由的远程管理(基于实验七的基础配置)8. 实验八 —— 通过路由的远程管理(基于实验七的基础配置)6. 实验六 —— 交换机的远程控制(直接控制和间接控制)6. 实验六 —— 交换机的远程控制(直接控制和间接控制)5. 实验五 —— 将交换机作为PC端通过交换机相连。5. 实验五 —— 将交换机作为PC端通过交换机相连。4. 实验四 —— 两个PC机通过两台交换机相连。2. 实验二 —— 两个PC机通过交换机相连。2. 实验二 —— 两个PC机通过交换机相连。

这个家伙看起来很懒,只想把你留下来哦 9338

Linux内核异步数据处理--kfifo

引题: 在驱动编程中,经常会遇到异步数据处理的情况,比如采用中断或定时器处理数据输入输出等情况 此时数据的采集与处理往往不同步,于是驱动编程中数据采集方需要将采集的数据暂时放到一个缓冲区中,使用方在需要处理数据时从缓冲区中将数据读出 驱动编程中常采用队列这种数据结构来实现整个过程,我们可以选择自己编写一个队列,也可以利用内核中现有队列kfifo来实现 kfi

Eric.Xi 2811

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 356

VS2022下C# WPF项目一键打包成独立exe的完整指南

本文提供了一份在Visual Studio 2022中将C# WPF项目一键打包成独立可执行exe文件的完整指南。通过配置项目属性、启用单文件发布和自包含模式,开发者无需依赖第三方工具,即可生成可在未安装.NET运行时的电脑上直接运行的独立程序,极大简化了桌面应用的分发流程。

weixin_28831399的博客 670

Linux内核同步和异步使用(速览)

介绍 kernel有很多的同步和异步机制,做简单整理,力求能够熟练使用。 1.同步机制 并发:多个执行单元同时被执行 竞态:并发的执行单元对共享资源(硬件资源和软件上的全局变量等)的访问导致竞争状态。 并发与竞态。 假设有2个进程试图同时向一个设备的相同位置写入数据,就会造成数据混乱。处理并发常用的技术:加锁或者互斥,即确保在任何时间只有一个执行单元可以操作共享资源。在Linux内核中主要通过...

勤能补拙,孰能生巧 717

【Python3教程】Python3高级篇之uWSGI 安装配置

本文介绍了在Python 3环境中安装和配置uWSGI的完整流程,涵盖基本安装、Flask/Django应用部署、Nginx集成以及systemd管理等关键环节。主要内容包括:uWSGI的安装前提条件,创建简单WSGI应用,编写uWSGI配置文件(.ini格式),与Nginx配合实现生产环境部署,以及使用systemd实现服务管理。文章还提供了常见Web框架(Flask、Django)的部署示例和高级配置建议,如负载均衡、HTTPS设置等。最后列出了权限、端口占用等常见问题的解决方案,为开发者提供了一套完整

No8g攻城狮的博客 438

Linux驱动开发--异步通知与异步I/O

最后,在文件关闭时,即在设备驱动的 release() 函数中,应调用设备驱动的 fasync() 函数将文件从异步通知的列表中删除。从中可以看出,当用户输入一串字符串后,标准输入设备释放 SIGIO 信号,这个信号“中断”与驱使对应的应用程序中的 input_handler() 得以执行,并将用户输入显示出来。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。下面给出了释放信号的范例。

张哈哈的博客 1385

IEC61850规约客户端软件开发实战(第二章)

本文介绍了基于IEC61850规约的客户端软件开发过程,重点阐述功能界面设计和服务端连接功能的实现。界面采用Qt框架设计,包含功能按钮区、数据模型展示区(使用QTreeWidget)和状态显示区。连接功能通过libiec61850开源库实现,详细说明了连接流程、句柄创建及状态管理的代码实现。测试结果表明系统能正确识别连接状态,并通过界面直观显示。文章为IEC61850规约软件开发提供了实用参考,下期将分享规约模型数据加载的实现过程。

半青年的博客 2855

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

S7-1200中OB100和OB20中断使用方法及示例程序说明(图文)

Robot_PLC_HMI_Automation 8584

Linux I/O编程:I/O多路复用与异步 I/O对比

本文将简要介绍 Linux 中的多路复用 I/O 和异步 I/O 模型,并编写示例代码简述。对于网络 I/O,特别是 UDP 和 TCP,多路复用 I/O(如 `select`、`epoll()`)通常是更好的选择。而异步 I/O(如 `libaio`)只建议用在文件和块设备的 I/O 操作。

Where there is life, there is hope. 1446

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【Linux】【异步】设备驱动中的异步通知(Asynchronous Notifications)与异步I/O(Asynchronous I/O)

在Linux设备驱动程序设计中,异步通知与异步I/O机制是提高系统性能和响应性的关键手段。异步通知用于在事件发生时及时通知用户空间进程,而异步I/O则允许用户空间进程在等待I/O完成的同时继续执行其他任务。通过合理的异步通知与异步I/O机制设计和实现,可以有效提升设备驱动程序的性能和可靠性。

极客代码 1666

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux设备驱动中的异步通知与异步I/O

阻塞与非阻塞访问、 poll() 函数提供了较好的解决设备访问的机制, 但是如果有了异步通知, 整套机制则更加完整了。,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念, 比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

ljl113的博客 983

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Linux内核开发之异步通知与异步I/O_fcntl

“小王,听说过锦上添花吧..”我拍拍下王的头说。 “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我。 “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东东,看来现在是不行了”我吃惊道,“这样吧,这次就给你讲些和前边有关的东西,也不失为锦上添花不是?”。 “好,我也是这么打算的,就是没好意思说,今天讲些啥呢?”小王暗淡的眼光总算闪了闪

gtkknd的专栏 982

【Linux驱动开发】Linux 设备驱动中的异步通知与异步 I/O:原理、机制与实战

本文探讨Linux设备驱动中的异步通知与I/O机制,分析其原理、实现方法与适用场景。主要内容包括:1)通过wait_queue与.poll实现轮询式就绪检测;2)利用.fasync与kill_fasync()实现SIGIO信号驱动I/O;3)结合定时器/工作队列实现异步数据生产。文章详细解析了fasync内部数据结构(RCU链表)、poll/epoll内核路径及边沿触发语义,并以async_demo示例展示字符设备驱动的完整实现方案。针对不同需求场景(低频率事件/高吞吐I/O)提供了技术选型建议,同时指出内

love131452098的博客 1075

Linux设备驱动中的异步通知与同步I/O

在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问。因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。异步通知类似于硬件上的“中断”概念,比较准确的称谓是“信号驱动的异步I/O”。 9.1 异步通知的概念和作用 异步通知:一旦设备就绪,则主动通知应用程序,该应用程序无需查询设备状态 几种通知方式比较: 阻塞I/

zcj的博客 5391

【Linux】Linux异步I/O -libaio

libaio是Linux内核提供的异步I/O库,通过io_submit提交请求后立即返回,内核通过完成队列通知结果。其核心特性包括零拷贝(结合O_DIRECT绕过内核缓冲区)和批量处理。使用O_DIRECT时需注意数据对齐要求,适合数据库等大文件连续I/O场景。主要API包括:io_setup创建上下文、io_submit提交请求、io_getevents获取完成事件,以及io_prep_pread/pwrite准备读写请求。libaio通过异步机制显著提升I/O性能,特别适合高并发存储应用。

Antonio915的博客 2485

突破性能瓶颈:Linux内核aio_complete异步I/O完成通知机制深度剖析

你是否还在为同步I/O操作阻塞进程而烦恼?是否想让应用程序在等待磁盘响应时仍能高效处理其他任务?本文将深入解析Linux内核中异步I/O(Asynchronous I/O,AIO)的核心完成通知机制——`aio_complete`,带你掌握如何利用内核提供的异步I/O能力提升应用性能。读完本文,你将理解`aio_complete`的工作原理、调用流程及在不同文件系统中的实现差异,并能通过实例代码正...

gitblog_00013的博客 742

设备驱动中的异步通知与异步I/O

在设备驱动中使用异步通知可以使得再进行对设备的访问时,由驱动主动通知用户程序进行访问。这样,使用非阻塞I/O的应用程序无需轮询机制查询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代。除了异步通知以为,应用还可以在发起I/O请求后,立即返回。之后,在查询I/O完成情况,或者I/O完成后被返回。这个过程为异步I/O。 阻塞与非阻塞访问、poll函数提供了较好的解决设备访问机制,但是如...

weixin_42005898的博客 453
上一篇: Linux内核开发之异步通知与异步I/O(一)
下一篇: Linux内核开发之异步通知与异步I/O(三)
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值