Linux阻塞和非阻塞

  • 等待队列
  • 1.等待队列头
  • 等待队列头就是一个等待队列的头部,每个访问设备的进程都是一个队列项,当设备不可用的时候就要将这些进程对应的等待队列项添加到等待队列里面
  • 1.阻塞访问最大的好处就是当设备文件不可操作的时候进程可以进入休眠态,这样可以将CPU 资源让出来。
  • 2.当设备文件可以操作的时候就必须唤醒进程,一般在中断函数里面完成唤醒工作。
  • 3.Linux 内核提供了等待队列(wait queue)来实现阻塞进程的唤醒工作,如果我们要在驱动中使用等待队列,必须创建并初始化一个等待队列头,等待队列头使用结构体wait_queue_head_t 表示, wait_queue_head_t 结构体定义在文件 include/linux/wait.h 中
  • 2.等待队列项
  • 3.将队列项添加/移除等待队列头
    -1.当设备不可访问的时候就需要将进程对应的等待队列项添加到前面创建的等待队列头中,只有添加到等待队列头中以后进程才能进入休眠态。
  • 2.当设备可以访问以后再将进程对应的等待队列项从等待队列头中移除即可。
  • 4.等待唤醒
    -当设备可以使用的时候就要唤醒进入休眠态的进程,
  • 5.等待事件
  • 除了主动唤醒以外,也可以设置等待队列等待某个事件,当这个事件满足以后就自动唤醒等待队列中的进程,和等待事件有关
  • 轮询
  • 1.如果用户应用程序以非阻塞的方式访问设备,设备驱动程序就要提供非阻塞的处理方式,也就是轮询。
  • 2.poll、 epoll 和 select 可以用于处理轮询,应用程序通过 select、 epoll 或 poll 函数来查询设备是否可以操作,如果可以操作的话就从设备读取或者向设备写入数据。
  • 3.当应用程序调用 select、 epoll 或 poll 函数的时候设备驱动程序中的 poll 函数就会执行,因此需要在设备驱动程序中编写 poll 函数。