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函数,软件来源还包括一些非法运算等操作

poll_wait阻塞/唤醒的更多相关文章

  1. AQS阻塞唤醒工具LockSupport

    LockSupport在JDK源码中描述为:构建锁和其他同步类的基本线程阻塞原语,构建更高级别的同步工具集.LockSupport提供的park/unpark从线程的粒度上进行阻塞和唤醒,park/u ...

  2. java线程阻塞唤醒的四种方式

    java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...

  3. 如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)

    以下为线程 阻塞/唤醒  主要代码 public class MyThread extends Thread { //无意义 private final Object lock = new Objec ...

  4. 多线程之Java线程阻塞与唤醒

    线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...

  5. Java并发框架——AQS之阻塞与唤醒

    根据前面的线程阻塞与唤醒小节知道,目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与r ...

  6. 从JDK源码角度看线程的阻塞和唤醒

    目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合.wait与notify组合.park与unpark组合.其中suspend与resume因为存在无法解决的竟态问 ...

  7. 阻塞和唤醒线程——LockSupport功能简介及原理浅析

    目录 1.LockSupport功能简介 1.1 使用wait,notify阻塞唤醒线程 1.2 使用LockSupport阻塞唤醒线程 2. LockSupport的其他特色 2.1 可以先唤醒线程 ...

  8. Java 中你怎样唤醒一个阻塞的线程?

    在 Java 发展史上曾经使用 suspend().resume()方法对于线程进行阻塞唤醒,但 随之出现很多问题,比较典型的还是死锁问题. 解决方案可以使用以对象为目标的阻塞,即利用 Object ...

  9. Java并发框架——AQS阻塞队列管理(三)——CLH锁改造

    在CLH锁核心思想的影响下,Java并发包的基础框架AQS以CLH锁作为基础而设计,其中主要是考虑到CLH锁更容易实现取消与超时功能.比起原来的CLH锁已经做了很大的改造,主要从两方面进行了改造:节点 ...

随机推荐

  1. [转]Oracle左连接、右连接、全外连接以及(+)号用法

    原文地址:https://www.cnblogs.com/hehaiyang/p/4745897.html 阅读目录 1.准备工作 2.左外连接(LEFT OUTER JOIN/ LEFT JOIN) ...

  2. Roberts算子

    https://blog.csdn.net/likezhaobin/article/details/6892176 https://zhuanlan.zhihu.com/p/35032299 Robe ...

  3. Android 使用NDK编译二进制文件并运行

    Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件. 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件 ...

  4. Linux 等待信号(sigsuspend)

    /* sigsuspend()函数说明 */ #include <stdio.h> #include <signal.h> /* 知识补充: sigsuspend()函数 函数 ...

  5. spring cloud java: 无法访问redis.clients.jedis.JedisPoolConfig 找不到redis.clients.jedis.JedisPoolConfig的类文件

    spring cloud <spring-cloud.version>Greenwich.SR3</spring-cloud.version> 注入Redis 时候: @Bea ...

  6. c++ Array运用实例

    myprint.hpp #include <iostream> #include <string> template <typename T> inline voi ...

  7. IDEA代码折叠

    IDEA代码折叠 觉得有用的话,欢迎一起讨论相互学习~Follow Me 选中内容-->右键 folding -->fold selection/remove region

  8. pipeline结合jacoco获取自动化测试代码覆盖率

    1下载jacoco,并上传至服务器:https://www.eclemma.org/jacoco/ 2.应用服务tomcat的catalina.sh增加jacocoagent #JAVA_OPTS=& ...

  9. phpspreadsheet 中文文档 粗翻版

    2019年10月11日09:32:33 官方使用文档  https://phpspreadsheet.readthedocs.io/en/stable/topics/accessing-cells/ ...

  10. webpack四个基础概念

    本文参考自:https://www.cnblogs.com/xiaohuochai/p/7002344.html webpack 核心概念:入口(entry).输出(output).加载器(loade ...