1、Linux设备的阻塞式和非阻塞式访问

1、休眠
休眠的概念:
休眠的进程会被搁置在一边,等待将来的某个事件发生。
当进程休眠时,它期待某个条件未来为真,当一个休眠的进程被唤醒
是,它必须再次检查它所等待的条件的确为真。

休眠有简单休眠、高级休眠、手工休眠等。

 1.1简单休眠
Linux内核中最简单的休眠方式称为是wait_event的宏,它在休眠的同时
也要检查进程等待的条件。
以下是几种简单的休眠宏:
1)、wait_event(wq, condition)
* wait_event - sleep until a condition gets true
* @wq: the waitqueue to wait on
* @condition: a C expression for the event to wait for
* @condition:任意一个布尔表达式

2)、wait_event_timeout(wq, condition, ret)
* wait_event_timeout - sleep until a condition gets true or a timeout elapses
* @wq: the waitqueue to wait on
* @condition: a C expression for the event to wait for
* @timeout: timeout, in jiffies

3)、wait_event_interruptible(wq, condition)
* wait_event_interruptible - sleep until a condition gets true or a signal is received
* @wq: the waitqueue to wait on
* @condition: a C expression for the event to wait for
 
4)、wait_event_interruptible_timeout(wq, condition, timeout)
* wait_event_interruptible_timeout - sleep until a condition gets true or a timeout elapses
* @wq: the waitqueue to wait on
* @condition: a C expression for the event to wait for
* @timeout: timeout, in jiffies

唤醒休眠函数
wake_up()
wake_up_interruptible()

wake_up()会唤醒等待在queue上的所有进程,wake_up_interruptible()
只会唤醒那些执行可中断休眠的进程 
如果要确保只有一个进程能看到非零值,则必须以原子的方式进行检查。
if (condition) \
break; \
__wait_event(wq, condition); \
} while (0)

 1.2高级休眠


 1.3手工休眠
在早期的Linux版本中出现,如果愿意仍可以沿用这种休眠方式,但容易出错。
在源码中进行了如下解释:

DEFINE_WAIT(name) //建立并初始化一个等待队列入口
void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state);
void finish_wait(wait_queue_head_t *q, wait_queue_t *wait);

2、Linux设备的阻塞式和非阻塞式访问
linux驱动为上层用户空间访问设备提供了阻塞和非阻塞两种不同
的访问模式。
阻塞操作的概念:
在执行设备操作时若不能获得资源则挂起进程,知道满足可操作的
条件后再进行操作,被挂起的进程进入休眠状态。
非阻塞操作的概念:
在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,
直到可以操作为止。只有read、write和open文件操作受非阻塞标志的影响。

阻塞的进程会进入休眠状态,因此必须确保有一个地方能够唤醒休
眠的进程,为确保唤醒发生,需整体理解自己的代码,唤醒休眠进程的
地方最可能发生在中断,因为硬件资源状态变化往往伴随一个中断。

使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否对
设备进行无阻塞的访问。select()和poll()的系统调用最终会引发设备驱动中的poll
函数执行。select()和poll()系统调用的本质是一样的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值