码迷,mamicode.com
首页 > 其他好文 > 详细

IO模型

时间:2016-03-09 12:34:25      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

一、阻塞
概念:在执行设备操作时,不能获取资源,则进程挂起。直到满足条件,再进行操作。挂起时,进程休眠,被从调度器的运行队列移走。
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)发送信号
    技术分享技术分享

IO模型

标签:

原文地址:http://www.cnblogs.com/ddg318/p/5257279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!