中断处理

interrupt、interrupted 、isInterrupted 区别

元气小坏坏 提交于 2020-03-02 17:04:36
1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。 2、interrupted 和 isInterrupted 首先看一下该方法的实现: public static boolean interrupted () { return currentThread().isInterrupted(true); } 该方法就是直接调用 当前线程 的isInterrupted(true)方法。 然后再来看一下 isInterrupted的实现: public boolean isInterrupted () { return isInterrupted( false); } 这两个方法有两个主要区别: interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象锁对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以再A线程去调用B线程的isInterrupted方法。) 这两个方法最终都会调用同一个方法

JUC锁框架——CyclicBarrier

荒凉一梦 提交于 2020-03-02 12:47:40
CyclicBarrier的简单介绍 CyclicBarrier是一个同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。通过它可以完成多个线程之间相互等待,只有当每个线程都准备就绪后,才能各自继续往下执行后面的操作。 CyclicBarrier通过计数器来实现的。当某个线程调用await方法时,该线程进入等待状态,计数器加1,当计数器的值达到设置的初始值时,所有因调用await进入等待状态的线程被唤醒,继续执行后续操作。 因为CycliBarrier在释放等待线程后可以重用,所以称为循环barrier。CycliBarrier支持一个可选的Runnable,在计数器的值到达设定值后(但在释放所有线程之前),该Runnable运行一次 ,注,Runnable在每个屏障点只运行一个。 CyclicBarrier与CountDownLatch比较 CyclicBarrier与CountDownLatch本质上都是依赖于volatile和CAS实现,两者比较如下: |CyclicBarrier|CountDownLatch| |:|:| |一个线程(或者多个),等待另外N个线程完成某个事情之后才能执执行|N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。| |一次性的|可以重复使用| |基于AQS|基于锁和Condition

定时任务1.基本原理

左心房为你撑大大i 提交于 2020-02-29 18:00:28
##1.php中定时计划任务的实现原理 ###1.连接处理: 在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况: 0 - NORMAL(正常) normal 1 - ABORTED(异常退出) aborted 2 - TIMEOUT(超时) timeout aborted 报错 英 [ə'bɔːtɪd] 美 全球发音 跟读 口语练习 adj. 流产的;夭折的 当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。 2.当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。 3.当连接时间超过 PHP 的时限时,TIMEOUT 状态的标记将被打开。 默认的情况是当远程客户端连接中断时脚本将会退出,但我们可以决定脚本是否需要在客户端中断连接时退出。 有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。 ###2.忽略脚本中断 该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的" php_value ignore_user_abort 以及 ignore_user_abort() 函数来控制。 脚本触发函数: 如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown

linux UART串口驱动开发文档

*爱你&永不变心* 提交于 2020-02-29 09:39:11
内容简介: 介绍了Linux下的串口驱动的设计层次及接口, 并指出串口与TTY终端之间的关联层次(串口可作TTY终端使用), 以及Linux下的中断处理机制/中断共享机制, 还有串口缓冲机制当中涉及的软中断机制; 其中有关w83697/w83977 IC方面的知识, 具体参考相关手册, 对串口的配置寄存器有详细介绍, 本文不再进行说明. 目录索引: 一. Linux的串口接口及层次. 二. Linux的中断机制及中断共享机制. 三. Linux的软中断机制. 四. TTY与串口的具体关联. 一. Linux的串口接口及层次 . 串口是使用已经非常广的设备了, 因此在linux下面的支持已经很完善了, 具有统一的编程接口, 驱动开发者所要完整的工作就是针对不同的串口IC来做完成相应的配置宏, 这此配置宏包括读与写, 中断打开与关闭(如传送与接收中断), 接收状态处理, 有FIFO时还要处理FIFO的状态. 如下我们就首先切入这一部分, 具体了解一下与硬件串口IC相关的部分在驱动中的处理, 这一部分可以说是串口驱动中的最基础部分, 直接与硬件打交道, 完成最底层具体的串口数据传输. 1. 串口硬件资源的处理 . W83697及W83977在ep93xx板子上的映射的硬件物理空间如下: W83697: 0x20000000起1K空间. W83977: 0x30000000起1K空间.

STM32对HAL库的外部中断处理

谁说胖子不能爱 提交于 2020-02-29 06:27:47
这次外部中断是通过检测外部中断实现按键控制LED的开关。 每一个IO口都可作为外部中断口,将你要外部中断的IO口在CUBEMX中进行设置。 中断线能够自动识别,不用手动去改动。其他基本设置好之后,即完成了外部中断的初始化。此时要进入中断函数,印象中大家的外部中断函数应该是这个, 但是在HAL库文件中有此函数的描述, 即它会执行一个外部中断的回调函数。 在库文件中还找到了——weak 该回调函数的定义,weak其实意思就是定义了一个初始化的函数,你不改也可以,你改了,就按照你改的函数来执行。 所以我们需要在main文件中重构一个回调函数,把它当做是中断函数来用就好了。 即完成外部中断的写法。 之前说的串口中断调用的回调函数,应该也是一个道理一个原理,在此说明一下。。 来源: https://www.cnblogs.com/zjx123/p/11866018.html

32位Intel CPU所含有的寄存器

拈花ヽ惹草 提交于 2020-02-29 06:16:52
4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存取,不会影响高16位的数据。这些 低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄 存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字 节的信息。 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、 除、输入/输出等操作,它们的使用频率很高; 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作 中,当移多位时,要用CL来指明移位的位数;

01.计算机体系结构概述.md

自作多情 提交于 2020-02-28 22:12:45
文章目录 1. 计算机的基本构成 1.1 cpu概览 2. 指令的执行过程 2.1 指令周期 2.2 指令分类 2.3 指令的格式 2.4 参考其他周期 3. 中断 3.1 中断的分类 3.2 中断和指令周期 3.3 中断响应的一般过程 3.4 多个中断 4. 缓存 5. 直接内存存取DMA技术 6. 计算机的并行处理手段 6.1. 对称多处理器SMP: 6.1.1 SMP的架构 6.1.2 SMP的优点 6.1.3 SMP各自拥有独立的缓存导致的数据一致性问题: 6.2. 多核计算机 6.2.1 多核和smp之间的区别 1. 计算机的基本构成 处理器:控制计算机操作,执行数据处理等功能。 内存:存储数据和程序,是易丢失的。 输入/输出模块(I/O): 在计算机和外部环境之间移动数据。外部环境有各种外部辅助设备,比如硬盘,显示器,鼠标。 系统总线:在处理器,内存,输入输出设备之间提供通信的设施。 1.1 cpu概览 cpu处理器的 一种 功能是和存储器交换数据,因此他通常使用两个内部寄存器: 1.存储器地址寄存器(Memory Address Register):用于确定下一次读写的存储器地址。 2.存储器缓冲寄存器(Memory Buffer Register): 存放从存储器读进来的数据或者是要写入到寄存器中的数据。 同样,还有一组寄存器用来和输入和输出设备 1

02.操作系统概述.md

為{幸葍}努か 提交于 2020-02-28 21:12:58
文章目录 2. 操作系统原理介绍 2.1 操作系统的目标和功能 2.1.1 作为用户/计算机接口的操作系统 2.1.2 作为资源管理器的操作系统 2.2 操作系统发展简史 2.2.1 串行处理 2.2.2 简单批处理系统 2.2.2.1 从监控程序的角度来看 2.2.2.2 从处理器的角度来看 2.2.2.3 硬件层面需要进行的支持 2.2.2.4 运行模式的概念 2.2.3 多道批处理系统 2.2.3.1 多道批处理系统的硬件支持 2.2.3.2 多道批处理系统需要注意的新问题 2.2.4 分时系统 I/O调用的过程 2. 操作系统原理介绍 这篇文章主要想从基础介绍一下操作系统是如何运行的,主要专注于操作系统是如何对应用程序进行调度的。需要有 前一篇 文章作为基础 2.1 操作系统的目标和功能 2.1.1 作为用户/计算机接口的操作系统   一个应用程序可以使用一种语言开发,如果没有操作系统的话,每一个开发者都需要十分了解计算机的硬件指令才行,这是不可想象的。操作系统做了一层抽象,就像开发应用程序的时候会写的各种工具类一样,操作系统对这些部分的操作提供了封装的模块,应用程序只需要调用就好了。   同时还有一些通用的工作,比如创建程序,管理文件,控制io设备等,操作系统对这些操作都做了封装来简化编程。 下面是操作系统面向开发者或者用户的一些功能 程序开发

单片机程序死机,跑飞了可能是因为这几个方面的原因

做~自己de王妃 提交于 2020-02-28 13:26:21
1、意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象; 2、中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。 3、地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。 4、无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制; 5、看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗; 6、堆栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。当你把以上几条都试过不能解决问题,试一试把你的被调用少函数直接内置到调用的地方并且把占用RAM大的局部变量改成全局变量,试一试说不定就可以了。 来源: oschina 链接:

[原]Java多线程编程学习笔记之一:线程中断(含代码)

送分小仙女□ 提交于 2020-02-27 08:31:26
转载请注明出处 大学生程序代写 > 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。 这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。 下面一段代码演示了休眠线程的中断: public class SleepInterrupt extends Object implements Runnable{ public void run(){ try{ System.out.println("in run() - about to sleep for 20 seconds"); Thread.sleep(20000); System.out.println("in run() - woke up"); }catch(InterruptedException e){ System.out.println("in run() - interrupted while sleeping"); //处理完中断异常后,返回到run()方法人口, //如果没有return,线程不会实际被中断,它会继续打印下面的信息 return; } System.out.println("in run() -