zoukankan      html  css  js  c++  java
  • poll_wait阻塞/唤醒

    1. 应用阻塞
    应用程序使用 select() 或 poll() 调用设备驱动程序的 poll() 函数,该函数把输入输出复用处理的等待队列追加到由内核管理的进程的 poll_table()上

    #include <linux/poll.h>
    static inline void poll_wait (struct file *filp, wait_queue_head_t *wait_address, poll_table *P);

    filp:设备文件信息的 struct file 结构体的指针参数 struct file *filp
    P:追加到设备驱动上的 poll_table结构体指针参数

    2. 内核等待事件

    /* 
    *    conditon:必须满足,否则阻塞
    *    timeout和conditon相比,有更高优先级
    */
    wait_event(wq, condition);
    wait_event_timeout(wq, condition, timeout);
    wait_event_interruptible(wq, condition) ;
    wait_event_interruptible_timeout(wq, condition, timeout) ;

    3. 唤醒等待队列

    //可唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态的进程
    #define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL)
    
    //只能唤醒处于TASK_INTERRUPTIBLE状态的进程
    #define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)

    4. schedule_timeout
    表示的进程睡眠直到时间超时,函数就会立即返回

    5. 信号
    TASK_INTERRUPTIBLE是可以被信号和wake_up()唤醒的,当信号到来时,进程会被设置为可运行
    TASK_UNINTERRUPTIBLE只能被wake_up()唤醒

    信号来源:
    硬件来源:(比如我们按下了键盘或者其它硬件故障)
    软件来源:最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作

  • 相关阅读:
    小程序文档
    display: flex;
    时间戳格式化
    transition-分栏按钮动画
    animation与transition区别
    放大镜
    原生js实现瀑布流效果
    Javascript获取数组中最大和最小值
    scss基础
    C/C++ XMPP/Jabber 客户端类库对比/点评 (转)
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709840.html
Copyright © 2011-2022 走看看