IO模型

本文详细介绍了 Linux 下四种主流 I/O 模型:阻塞 I/O、非阻塞 I/O、I/O 多路复用及信号驱动 I/O 的工作原理与实现方式。深入探讨了每种模型的特点及其应用场景。
一、阻塞
概念:在执行设备操作时,不能获取资源,则进程挂起。直到满足条件,再进行操作。挂起时,进程休眠,被从调度器的运行队列移走。
1、阻塞机制实现:睡眠
        a、简单睡眠
        b、手动睡眠
 
2、简单睡眠机制实现:等待队列
    API:
    1)定义等待队列头:wait_queue_head_t readq;
    2)初始化等待队列头:init_waitqueue_head(&readq);
    3)等待事件:wait_event(&readq,condition);wait_event_interruptible(&readq,condition)
        注意:睡前condition为真则不睡,醒后若condition为假则继续睡。condition主要用来判断是否休眠。可创建休眠条件。
    4)唤醒队列:wake_up(&readq);wake_up_interrputible(&readq);
 
3、手动睡眠
 
二、非阻塞
概念:在执行设备操作时,若获取不到资源,则选择放弃或是不停得查询,直到可以进行操作。它是建立在阻塞的基础之上的。
实现:通过判断file结构体中的f_flags来判断O_NONBLOCK是否置位。
    
 
三、多路复用
概念:让进程一次性阻塞监听多个描述符,当有资源可获得时,则进程唤醒并开始执行。
1、机制实现:
    1)将设备与当前进程相关联
    2)判断监听的描述符集合中是否有可操作资源,有责更新描述符集合,并返回 POLLIN | POLLRDNORM
    3)若没有,则阻塞在sys_select处
2、API:
    1)实现file_operations中的poll方法
    2)将设备与当前进程关联,就是将当前进程节点,挂到设备的等待队列当中
    
 
四、信号驱动
概念:这是一种异步I/O,一旦设备就绪,则主动发送信号通知进程。
1、实现机制:
    1)实现file_operations中的fasync方法
    2)定义一个异步结构体指针:struct fasync_struct *my_fasync;
    3)在实现fasync的函数中调用fasync_helper函数,它维护一张信号发送对象表,通过on的置位来判断是否插入表
    
    4)发送信号
    

转载于:https://www.cnblogs.com/ddg318/p/5257279.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值