一、驱动中的poll机制

1.简介:
select()和poll()系统调用的本质一样,前者在 BSD UNIX 中引入的,后者在 System V 中引入的。 应用程序使用 select() 或 poll() 调用设备驱动程序的 file_operations 的 poll() 函数。

2.实现
(1).初始化一个等待队列头
init_waitqueue_head(&dev->rx_wait/&dev->tx_wait);

(2).实现驱动中的poll()方法

static unsigned int printer_poll(struct file *fd, poll_table *wait)
{
struct printer_dev *dev = fd->private_data;
unsigned long flags;
int status = ; mutex_lock(&dev->lock_printer_io);
spin_lock_irqsave(&dev->lock, flags);
setup_rx_reqs(dev);
spin_unlock_irqrestore(&dev->lock, flags);
mutex_unlock(&dev->lock_printer_io); poll_wait(fd, &dev->rx_wait, wait); //驱动和应用程序中都有这个函数
poll_wait(fd, &dev->tx_wait, wait); spin_lock_irqsave(&dev->lock, flags);
if (likely(!list_empty(&dev->tx_reqs)))
status |= POLLOUT | POLLWRNORM; //可写 if (likely(dev->current_rx_bytes) || likely(!list_empty(&dev->rx_buffers)))
status |= POLLIN | POLLRDNORM; //可读 spin_unlock_irqrestore(&dev->lock, flags); return status;
}

(3)唤醒等待队列
wake_up_interruptible(&dev->rx_wait/&dev->tx_wait);
poll_wait函数并不会导致休眠。上面的驱动函数 printer_poll 返回位掩码,如果掩码为0,则表示设备不可读。若内核获取到 printer_poll() 返回的掩码为0,知道设备不可读,此时select函数就会被阻塞,进程休眠,等待有数据时被唤醒。所以,在写入数据后,需要唤醒等待

注意:
1.wait_event_interruptible(dev->rx_wait, (likely(!list_empty(&dev->rx_buffers))));是用来实现阻塞型IO的,wake_up_interruptible(&dev->rx_wait);是用来唤醒.
2.printer_poll 并不会导致休眠,进程阻塞是系统调用select造成的。
3.系统调用select的阻塞会导致printer_poll 被调用多次!!

Linux内核中的机制学习总结的更多相关文章

  1. Linux内核中锁机制之RCU、大内核锁

    在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...

  2. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  3. Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔 ...

  4. Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

  5. Linux内核中锁机制之原子操作、自旋锁

    很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多 ...

  6. 大话Linux内核中锁机制之RCU、大内核锁

    大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...

  7. 大话Linux内核中锁机制之完成量、互斥量

    大话Linux内核中锁机制之完成量.互斥量 在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内 ...

  8. 大话Linux内核中锁机制之信号量、读写信号量

    大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...

  9. 大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论 ...

随机推荐

  1. 看起来很懵的java内存加载面试题

    源代码如下,求结果 public class MemoryAnalyse { public static int k = 0; public static MemoryAnalyse t1 = new ...

  2. Edge coloring of bipartite graph CodeForces - 600F (二分图染色)

    大意:给定二分图, 求将边染色, 使得任意邻接边不同色且使用颜色种类数最少 最少颜色数即为最大度数, 要输出方案的话, 对于每一条边(u,v), 求出u,v能使用的最小的颜色$t0$,$t1$ 若t0 ...

  3. .net 环境配置

    需要把安装中文包也安装上.4个都安装

  4. 二维数组malloc

    //WC[K][N] double **WC = (double**)malloc(sizeof(double*)*K); ; i < K; i++) { WC[i] = (double*)ma ...

  5. spring cloud shutdown graceful 优雅停机

    spring cloud shutdown graceful 优雅停机 当一个服务启动后,会注册到eureka中,其他的服务也可以从eureka获取到新注册的服务.但当我们要停止一个服务的时候,如果直 ...

  6. iOS UI-九宫格

    第一节课: .复习 .运行App应用管理,简单界面分析 .一个应用为一个整体,直接创建一个appView然后计算frame .说明弊端,应该根据数据的个数来for循环创建 第二节课: .加载plist ...

  7. 关于Ubuntu 常用的简单指令

    这几天工作强度不算太高,就自己学了一下linux,我就把一些简单的指令整理了一下,希望以后有参考: 我是用的VMware 安装的Ubuntu 虚拟机: 下面直接贴出我整理的简单的日常使用的指令 创建文 ...

  8. sgu 130Circle dp

    130. Circle time limit per test: 0.25 sec. memory limit per test: 4096 KB On a circle border there a ...

  9. SqlServer中的merge操作(转载)

    SqlServer中的merge操作(转载)   今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...

  10. bzoj2438

    题解: tarjan+概率 首先tarjan缩点 然后计算一个x,计算方法: 1.每当有一个强连通分量i的入度为0,那么x++ 2.如果有一个强连通分量i,它的入度为0,且它连的每一条边只有他连,那么 ...