从Linux驱动角度说阻塞/非阻塞与异步/同步

来源:互联网 发布:外国人看中国网络审查 编辑:程序博客网 时间:2024/05/29 08:36
缘起正在读《Linux设备驱动开发详解》,遇到了自己被自己搞糊涂的概念:阻塞/非阻塞和同步/异步,觉得有必要停下来好好理解一下概念(一直以为阻塞与同步在概念上是一样的,非阻塞就是异步),然后再向前走。这说明,扎实的基础对工作和学习的意义。正文首先看看这几个概念在Linux设备驱动这个大背景下是如何描述的,不能说定义,因为我没有找到正式一些的定义。一、阻塞:在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列中移走,直到等待的条件被满足。注:上面的描述摘自书中8.1节。下面提出我自己的疑问与解释。上述描述的主要对象是进程,这个要强调一下,不是线程也不是socket1.“若不能获得资源”,造成这个结果的可能原因是,这个资源在临界区并且正在被其他进程所占用(可以参考上一章Linux中并发控制访问的手段:原子操作、中断屏蔽、自旋锁和信号量)。2.什么是挂起。就像描述中所说,挂起是操作系统将此进程从调度器的运行队列中(内存中)移走。移到哪里去呢?移动到磁盘(或称为外存)上的挂起队列(suspend queue)中。而当操作系统觉得条件满足时,就把此进程从外存移入内存,这个过程又叫做激活(activate)。3.自己简单的理解:阻塞就是操作系统将进程挂起了,而进程也睡眠了。实现的方法是等待队列(wait queue)二、非阻塞:与阻塞的区别在于,遇到不能进行设备操作时,它并不挂起,而是有两个选择:一个是放弃,另一个是不停的查询,直到可以进行操作为止。注:不停的查询就是轮询,用select()和poll()来实现。三、异步:一旦设备准备就绪,它会主动通知应用程序(那个进程)。这个过程又被称为“信号驱动的异步I/O”。信号:软件层面上对中断机制的模拟。一个进程收到一个信号与处理器收到一个中断请求,效果上应该是一样的。注:Linux2.6提供了专门的异步I/OAIO。四、同步:这个词在不同的语境中有不同的解释,下面我试图在几个方面来说明。1.百科中对同步的物理学解释:synchronous;sync;synchronism;synchronization 指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。2.多线程或多进程的同步:当两个或以上的进程(或线程)需要访问同一资源时,它们需要某种顺序来确保该资源(此时可以称为临界区资源)某一时刻只能被一个进程(或线程)使用的方式。3.通信(信息传输)方面的同步与异步:通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流(按照一定的顺序)。而异步通信,发送的数据的顺序是任意的。4.socket编程上的同步和异步:我个人认为同步与阻塞,异步与非阻塞表达的意思相同。参考:《Linux设备驱动开发详解》(第2版)操作系统:精髓与设计原理(原书第6版)