您的位置:首页 > 运维架构 > Linux

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

2016-08-07 15:35 113 查看
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()系统调用的本质是一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: