中断处理

Java中断机制

人盡茶涼 提交于 2020-02-25 15:57:24
目录 1 前提 2 何为中断 3 中断的好处 4 Thread类的中断相关方法 5 如何处理InterruptedException 5.1 不捕捉 InterruptedException,将它传播给调用者 5.2 捕捉InterruptedException,然后重新抛出 5.3 捕捉 InterruptedException 后恢复中断状态 5.4 生吞中断 —— 一般不要这么做 6 实现可取消的任务 7 实现不可取消的任务 1 前提 假设程序需要停止正在运行的线程,如果直接stop线程,则有可能导致程序运行不完整、造成数据的不一致性以及其它不可控情况,因此Java提供了中断机制。 2 何为中断 每个线程都有一个与之相关联的 Boolean 属性,用于表示线程的 中断状态(interrupted status) 。中断状态初始时为 false。当另一个线程通过调用 Thread.interrupt() 中断一个线程时, 会出现以下两种情况 。在被中断线程中运行的代码以后可以轮询中断状态,看看它是否被请求停止正在做的事情。 若被中断的线程正在执行一个低级可中断阻塞方法(换句话说线程的状态是:WAITIMG或TIMED_WAITING时 ),例如 Thread.sleep()、Thread.join() 或 Object.wait(),那么它将取消阻塞并抛出

WinDbg使用介绍

怎甘沉沦 提交于 2020-02-24 09:51:04
Windbg工作空间     WinDbg使用工作空间来描述和存储调试项目的属性、参数及调试器设置等信息。工作空间与vc中的项目文件很相似。WinDbg定义了两种工作空间,一种为默认工作空间,另一种为命名的工作空间。当没有明确使用某个命名空间时,WinDbg总是使用默认工作空间。   WinDbg在安装后就有预先创建了一些列默认空间。分别为基础工作空间、默认内核工作空间、默认远程调试工作空间、特定处理器工作空间、默认用户态工作空间。它们分别定义了在WinDbg在各种条件下的一些配置、参数设置等。   基础工作空间:当调试会话尚未建立,WinDbg处于闲置状态时,会使用此空间作为默认空间。   默认内核工作空间:当WinDbg开始内核调试,但是尚未与调试目标建立连接时,会使用此空间作为默认空间。   默认远程调试工作空间:当通过调试服务器进行远程调试时,会使用此空间作为默认空间。   默认的用户态工作空间:当使用WinDbg调试一个已运行的进程时,会使用这个空间作为默认工作空间。   当WinDbg打开一个应用程序开始调试时,调试器会 根据可执行文件的路径和文件名为其创建一个默认工作空间,如果已经存在工作空间,就使用已存在的。在WinDbg的文件菜单中可以使用另存为..创建一个命名的工作空间。 WinDbg的工作空间中保存了一下信息:   调试会话状态:包括,断点、打开的源文件

Linux中断管理 (3)workqueue工作队列

ぐ巨炮叔叔 提交于 2020-02-22 18:30:53
目录: 《 Linux中断管理 》 《 Linux中断管理 (1)Linux中断管理机制 》 《 Linux中断管理 (2)软中断和tasklet 》 《 Linux中断管理 (3)workqueue工作队列 》 关键词: GIC、IAR、EOI、SGI/PPI/SPI、中断映射、中断异常向量、中断上下文、内核中断线程、中断注册 。 由于篇幅较大,简单梳理一下内容。 本章主要可以分为三大部分: 讲解硬件背景的 1. ARM中断控制器 。 系统初始化的静态过程:GIC初始化和各中断的中断号映射 2. 硬件中断号和Linux中断号的映射 ;每个中断的注册 5. 注册中断 。 一个中断从产生到执行完毕的动态过程:ARM底层通用部分如何处理 3. ARM底层中断处理 ;GIC部分的处理流程以及上层通用处理部分 4. 高层中断处理 。 这里的高层处理,没有包括下半部。下半部在 Linux中断管理 (2)软中断和tasklet 和 Linux中断管理 (3)workqueue工作队列 中进行介绍。 1. ARM中断控制器 1.1 ARM支持中断类型 ARM GIC-v2支持三种类型的中断: SGI: 软件触发中断(Software Generated Interrupt) ,通常用于多核间通讯,最多支持16个SGI中断,硬件中断号从ID0~ID15。

JAVA并行程序基础

拈花ヽ惹草 提交于 2020-02-20 10:03:54
JAVA并行程序基础 一、有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器。我们都知道,程序是对于指令、数据及其组织形式的描述,而进程是程序的实体。 线程是轻量级的进程,是程序执行的最小单位。(PS:使用多线程去进行并发程序的设计,是因为线程间的调度和切换成本远小于进程) 线程的状态(Thread的State类): NEW–刚刚创建的线程,需要调用start()方法来执行线程; RUNNABLE–线程处于执行状态; BLOCKED–线程遇到synchronized同步块,会暂停执行直到获得请求的锁; WAITING–无限制时间的等待; TIMED_WAITING–有限制时间的等待; TERMINATED–执行完毕,表示结束。 二、线程的基本操作 创建线程 代码示例:start()方法会新建线程并调用run()方法! Thread t = new Thread(); t.start(); 注意以下代码: 这段代码也可以编译执行,但不能新建一个线程,而是在当前线程中调用run()方法。(PS:就是作为一个普通方法来调用) Thread t = new Thread(); t.run(); 不能用run()来开启线程,它只会在当前线程中串行执行run()方法。 另外,Thread类有一个非常重要的构造方法: public Thread

Java 基础 - 多线程基础

余生颓废 提交于 2020-02-20 09:47:50
并发 并发在单核和多核 CPU 上都存在, 对于单核 CPU,通过轮训时间片的方式实现并发. 线程 线程对象 利用 Thread 对象, 有两种方式来创建并发程序: 直接创建并管理线程. 当程序要启动一个异步任务的时候, 直接创建一个线程. 将线程管理抽象出来, 把并发部分的任务交给 executor . 线程的创建 有两种方式创建线程: 提供一个实现 Runnable 接口的对象. 子类化 Thread . 两种方法的优缺点? Runnable 总体来说更好一点 使用 Runnable 接口的方式更加灵活, 因为可以继续子类化某个类 Runnable 接口的方式可以适配 concurrent 包中的高级线程管理 API 线程的基本状态 线程有如下状态: NEW : 线程已经创建, 但还没有调用 start() 开始执行. RUNNABLE : 线程已经在 JVM 中开始运行, 但有 可能 在等待系统资源运行. BLOCKED : 线程在等待一个 monitor lock 以进入一个 synchronized 块. 也有可能是这个线程刚执行完 wait() , 其他线程又在获取 wait() 对象的 monitor lock . WAITING : 线程进入等待状态, 以下方法会使得线程进入 wait() 状态: Object.wait() join() LockSupport

Flutter Http分块下载与断点续传

狂风中的少年 提交于 2020-02-19 21:50:44
分块下载真的能提高下载速度吗? 其实下载速度的主要瓶颈是取决于网络速度和服务器的出口速度,如果是同一个数据源,分块下载的意义并不大,因为服务器是同一个,出口速度确定的,主要取决于网速,而上面的例子正式同源分块下载,读者可以自己对比一下分块和不分块的的下载速度。如果有多个下载源,并且每个下载源的出口带宽都是有限制的,这时分块下载可能会更快一下,之所以说“可能”,是由于这并不是一定的,比如有三个源,三个源的出口带宽都为1G/s,而我们设备所连网络的峰值假设只有800M/s,那么瓶颈就在我们的网络。即使我们设备的带宽大于任意一个源,下载速度依然不一定就比单源单线下载快,试想一下,假设有两个源A和B,速度A源是B源的3倍,如果采用分块下载,两个源各下载一半的话,读者可以算一下所需的下载时间,然后再算一下只从A源下载所需的时间,看看哪个更快。 分块下载的最终速度受设备所在网络带宽、源出口速度、每个块大小、以及分块的数量等诸多因素影响,实际过程中很难保证速度最优。在实际开发中,读者可可以先测试对比后再决定是否使用。 分块下载有什么实际的用处吗? 分块下载还有一个比较使用的场景是断点续传,可以将文件分为若干个块,然后维护一个下载状态文件用以记录每一个块的状态,这样即使在网络中断后,也可以恢复中断前的状态,具体实现读者可以自己尝试一下,还是有一些细节需要特别注意的,比如分块大小多少合适

MSP430程序库<九>数码管显示

帅比萌擦擦* 提交于 2020-02-19 10:36:33
数码管也是单片机系统最常用的输出设备之一(还有液晶、发光二极管等)。七段(这里用的是8段,有小数点)数码管可以完成显示0-9数字和一部分的英文字符如:A、b。本文实现的程序完成显示数字和可显示的英文字符;同时完成数码管显示的printf函数的移植,以支持printf的格式化字符等好用的特点(我用的数码管8个排为一排,方便数字等的显示)。 硬件介绍: 这里所用到的硬件资源包括8个数码管、和msp430单片机的两个8位IO口(这里用的是P3和P5口,如有改变,可以通过宏定义更改)。 数码管是8个共阴的数码管,a-h 8段通过一个200Ω的电阻接到430单片机的P5口。共阴端是由单片机的P3口控制,单片机的一位IO通过一个三极管接到数码管的共阴端,以完成位选。 单片机的P3口时数码管的位选口,某位为高则选中;P5口时段选口;要数码管显示时,通过P3位选,选中某个数码管亮,P5段选选择8段(a-h)中的那些亮,从而控制某一位显示数字或字符。 要同时显示多个数码管,就要动态扫描;动态扫描时,本程序选用的是由看门狗的中断扫描显示:每1.9ms显示其中的一位,动态扫描显示每一位,从而让数码管看起来是同时亮的。 程序实现: 数码管显示首先要有一个数码管显示的断码表(完成数字和字符到数码管段值的表),程序中采用了《MSP430系列单片机系统工程设计与实践》这本书推荐的方式实现的这个数码表

CPU不可中断和僵尸进程

吃可爱长大的小学妹 提交于 2020-02-18 05:44:43
top时S列为进程的状态: R:运行状态 i:空闲状态 D:不可中断状态,进程正在和硬件交互,为了保护硬件,处于不可中断状态。 Z:僵尸状态,实际上进程已经结束,但父进程没有回收资源。 S:睡眠状态,可中断。 T:暂停状态,进程收到SIN_STOP信号暂停。调试加断点的时候,进程就处于这种状态。 X:进程已经挂掉。 大量不可中断状态,系统或硬件出现故障,可能会出现,检查IO问题。 僵尸状态: 1、父进程创建子进程后,没有调用wait等待, 2、子进程结束会给父进程发送sig_children,父进程没有接受此sig_children处理。 3、或者子进程结束太快,父进程没得及做以上2步操作。 当父进程结束,僵尸子进程会被init回收。 当父进程长期不结束,僵尸子进程也会长期存在。 dstat 查看系统的IO情况。 信号中断(软中断) 本质上是一种异步处理机制。 中断被分成上下两部分处理。 上部分:硬中断,直接处理硬件情况,反应很快。 下部分:软中断,为内核线程,反应相对不如上中断快。 每个CPU都有1个软中断内核线程,名字为ksoftirqd/0 。 硬中断一般对应各种IO问题。 软中断发生频率过高,内核线程会因为CPU使用率过高,导致软中断处理不及时,造成各种问题,像网络延时,调度缓慢等性能问题。 来源: CSDN 作者: 技术老虎Tiger 链接: https://blog

性能优化-CPU上下文

泄露秘密 提交于 2020-02-17 19:10:27
CPU上下文:CPU中的寄存器和程序计数器。切换出的CPU上下文,会保存到linux系统内核中。 分为3种:1、进程上下文,2、线程上下文,3、中断上下文(硬件通过触发信号,导致中断处理程序运行)。 进程的运行空间:内核空间、用户空间。 内核空间:具有最高权限,可以直接访问所以资源,包括硬件。 用户空间:只有有限资源,不能访问包括内存在内的硬件只有,必须通过系统调用嵌入到内核中,才可以调用这些资源。 从用户态到内核态,是通过系统调用实现的。比如我们要查看一个文件的内容,需要 1、调用系统调用open打开一个磁盘文件, 2、read读取一个文件内容, 3、write输入到标准输入, 4、close关闭文件。 一、 执行系统调用,也是需要切换CPU上下文的。需要先保存CPU上下文的当前状态,然后加载系统调用的上下文,再然后跳转到内核态,执行内核任务。 系统调用完成,需要保存CPU现在的上下文状态,加载上次新的上下文状态,进入用户态,执行。 一次系统调用,发生了2次CPU上下文切换。 系统调用,一直是在同一个进程中运行的。 二、 进程上下文切换 进程切换只能在内核态中运行。进程切换不只切换虚拟内存、栈、全局变量等用户空间资源,也包括内核堆栈、等内核态资源。 保存上下文和恢复上下文,也不是免费操作,需要内核占用CPU运行,进行切换。 如果进程切换太频繁

interrupt、interrupted 、isInterrupted 区别

旧巷老猫 提交于 2020-02-17 05:29:05
interrupt、interrupted 、isInterrupted 区别 参考链接: https://blog.csdn.net/z69183787/article/details/25076033 https://blog.csdn.net/zhuyong7/article/details/80852884 《并发编程的艺术》 1、 interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为 "中断"状态 。 注意: 线程中断仅仅是设置线程中一个boolean类型的标志符为True,意味着为中断状态(该字段并不是Thread类的字段,并且标志该字段的方法是native方法),并不会停止线程。需要用户自己去监视线程的状态为并做处理。 支持线程中断的方法,如wait、sleep、join(中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,该线程会立即被唤醒,并抛出中断异常。 从Java的API中可以看到,许多声明抛出InterruptedException的方法(例如Thread.sleep(longmillis)方法)这些方法在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException