IO模型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO模型相关的知识,希望对你有一定的参考价值。
一、阻塞
概念:在执行设备操作时,不能获取资源,则进程挂起。直到满足条件,再进行操作。挂起时,进程休眠,被从调度器的运行队列移走。
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模型的主要内容,如果未能解决你的问题,请参考以下文章