中断处理

异常的捕获和处理

南笙酒味 提交于 2020-01-18 20:39:40
异常的捕获和处理 异常概述 java异常处理 初识异常 异常:程序中运算过程中出现的错误,例如:文件找不到,网络连接中断,算术运算序偶无,数组下标越界等运行程序。 上图为空指针异常 java异常体系结构 java中异型有很多种类型,java体系结构图如下所示 Error类: 表示仅靠程序本身无法恢复的严重错误,如内存溢出,动态链接失败,虚拟机错误…假如出现这样的错误,应尽力使程序安全退出。 Exception类: 由java应用程序抛出和处理的严重错误,如所需文件找不到,网络连接不同或连接中断,算数运算错误,数组下标越界… Exception又分为两大异常类: 1.运行时异常:包括RuntimeException以及所有子类,不要求程序必须对它们进行处理。 2.Checked异常(非运行时异常):除了运行时异常外的其他从Exception类继承来的异常类。 异常 说明 Exception 异常层次结构的根类 ArithmecticException 算数错误异常,如以零作为除数 ArrayIndexOutOfBoundsException 数组下标越界 NullPointerException 尝试访问Null成员 ClassNotFoundException 不能加载所需的类 InputMismatchException 与得到的数据类型与实际的输入类型不匹配

频繁分配释放内存导致的性能问题的分析

和自甴很熟 提交于 2020-01-18 06:37:13
频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 检查要访问的虚拟地址是否合法 查找/分配一个物理页 填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 此进程minflt如此之高,一秒10000多次,不得不怀疑它跟进程内核态cpu消耗大有很大关系。 分析代码 查看代码,发现是这么写的:一个请求来,用malloc分配2M内存,请求结束后free这块内存。看日志,发现分配内存语句耗时10us,平均一条请求处理耗时1000us 。 原因已找到! 虽然分配内存语句的耗时在一条处理请求中耗时比重不大,但是这条语句严重影响了性能

计算机组成与结构复习整理(六)

旧时模样 提交于 2020-01-18 04:00:34
存储系统 总线 特性 分类 总线的数据传输方式 总线设计时要考虑的基本要素 总线裁决 ==集中式裁决方式== 分布式裁决方式 总线结构 输入/输出设备 分类 打印机种类 输入/输出组织 基础知识 程序中断方式 中断分类 中断系统的基本功能 中断过程 例题 DMA(直接存储器存取方式) 总线 部件之间有两种互连方式,分散连接,各部件之间通过单独的连线互连。总线连接:各个部件连接到一组公共信息传输线上。 特性 A. 物理特性 (连接类型、数量、接插件的几何尺寸和形状) B. 电气特性 (某串行接口规定低电平要低于-3V,表示逻辑“1”,高电平要高于+3V,表示逻辑“0”) C. 功能特性 (不同的控制线功能不同,如地址线用来传输地址信息,数据线用来传输数据信息) D. 时间特性 (每根线产生的信号之间的时序关系) 分类 A. 内部总线 :芯片内部连接各元件的总线。 B. 系统总线 :连接计算机系统内各功能部件。( 组成:一组数据线、一组控制线、一组地址线 ) C. 通信总线 :用于主机和I/O设备之间或计算机系统之间的通信。 总线的数据传输方式 串行传输 (又分为同步方式和异步方式)和 并行传输 。 总线设计时要考虑的基本要素 (1)信号线类型:专用信号线 / 复用信号线 (2)仲裁方法:集中式裁决 / 分布式裁决 (3)定时方式:同步协议方式 / 异步协议方式/半同步协议方式

查看linux中的TCP连接数

两盒软妹~` 提交于 2020-01-18 03:49:04
一、查看哪些IP连接本机 netstat -an 二、查看TCP连接数 1)统计80端口连接数 netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数 ps -ef|grep httpd|wc -l 3)、统计已连接上的,状态为“established netstat -na|grep ESTABLISHED|wc -l 4)、查出哪个IP地址连接最多,将其封了. netstat -na|grep ESTABLISHED|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n netstat -na|grep SYN|awk {print $5}|awk -F: {print $1}|sort|uniq -c|sort -r +0n --------------------------------------------------------------------------------------------- 1、查看apache当前并发访问数: netstat -an | grep ESTABLISHED | wc -l 对比httpd.conf中MaxClients的数字差距多少。 2、查看有多少个进程数: ps aux|grep httpd|wc -l 3

spin_lock 相关 -- 原子上下文

纵然是瞬间 提交于 2020-01-18 02:33:34
在前面文章描述spin_lock的时候, 要求spin_lock/unlock中间的代码不能有主动放弃cpu, 进入睡眠的函数。 (如sleep, schedule()等) 下面提一个问题? Q: 那在spin_lock/unlock中间代码段执行时, 时间片到了怎么办? A: spin_lock和spin_unlock中间代码是原子上下文。 故时间片轮转到了, 也不会调度。。。 类似中断上下文, 软中断/task_let内(还是在中断上下文), 以及spin_lock保护的区域内, 都是原子上下文, 无法睡眠。 因为如果睡眠了.... 中断上下文就回不来了.... 对应的, 进程上下文可以睡眠, 调度, 故有些中断下半部使用工作队列, irq_thread等机制, 使下半部存在于进程上下文, 可以睡眠。 贴一个别人的描述: 内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能 睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供 了四个宏来判断是否处于这几种情况里: #define in_irq() (hardirq_count()) //在处理硬中断中 #define in_softirq() (softirq_count()) //在处理软中断中

AQS源码分析

£可爱£侵袭症+ 提交于 2020-01-18 01:08:44
AQS全程为AbstractQueuedSynchronizer,其定义了一套多线程访问共享资源的同步框架,大部分的同步类的实现都依赖于他,比如ReentrantLock,ReentrantReadWriteLock, Semaphore, CountDownLatch等等; AQS的内容包括了以下几个方面: 1) AQS实现线程阻塞和唤醒的基础:LockSupport; 2) AQS子类(自定义同步器); 3) 队列; 4) 独占模式资源请求; 5) 共享模式资源请求; 6) 其他细节; 一、LockSupport: 封装了unsafe的park/unpark接口,提供了阻塞线程和唤醒线程的功能,park/unpark的声明原型为:   public native void unpark(Thread jthread);   public native void park( boolean isAbsolute, long time); isAbsolute参数表示是否是绝对时间,time参数表示时间值,在LockSupport中的实现代码如下: 二、自定义同步器: AQS提供了两种资源共享方式:独占模式和共享模式; AQS提供了同步器的框架代码,需要派生子类来实现自定义同步器,自定义同步器在实现时只需要重载资源请求的接口函数即可

S5PV210在Linux下如何编写驱动

江枫思渺然 提交于 2020-01-17 21:24:29
    我使用了两种驱动开发的模型来写了smart210上的按键驱动程序,这里做一下总结以及提供他人参考以及建议和改进,最后一个原因是自己很久没有写过博客了,现在想分享一下linux驱动开发程序的编写。    首先是Linux的中断处理机制。裸机开发中,通过中断标识一个函数指明该函数是中断处理函数,在编译器处理时候,也会对该函数的指针保存或特殊处理,当把该程序烧写到板子的时候,会把这个中断函数的地址加载到指定的地址,当中断发生时,通过寄存器保存的该函数的指针,进行中断函数地处理。但是在Linux中采用了类似信号处理这一种机制,在Linux的底层,当有中断发生时,就会有板级的代码产生一个指定的中断号,我们的中断驱动就是在内核中注册当接收的该中断信号后的处理函数,具体函数如下: int request_irq(irq,func, trigger_type, name, dev_id );   这里我是用伪代码描述:     irq: 需要接受或检测的中断号     func: 中断处理函数     trigger_type: 中断触发模式     name: 中断名称     dev_id: 这个参数是void类型的指针,最终传递给中断处理函数的第二个参数   中断的处理分为Top-part,和 Bottom-part,可以使用多种处理方式进行处理,比如:tasklet,

关于线程中断的一点思考和探究

谁说我不能喝 提交于 2020-01-17 08:25:20
起因: 项目引入了sonar代码检测工具,检测出代码中关于InterruptException异常的处理存在问题 项目中相关代码如下: public void demo ( ) { RLock rLock = redissonClient . getLock ( key ) ; boolean tryLock = false ; try { tryLock = rLock . tryLock ( 0 , 5 , TimeUnit . SECONDS ) ; } catch ( InterruptedException e ) { logger . error ( "tryLock error," , e ) ; } if ( tryLock ) { try { //business code } catch ( Exception e ) { } finally { if ( rLock != null ) { try { rLock . unlock ( ) ; } catch ( Exception e ) { } } } } } sonar中正确示例 public void run ( ) { try { while ( true ) { // do stuff } } catch ( InterruptedException e ) { LOGGER . log (

STM32 串口

对着背影说爱祢 提交于 2020-01-17 03:23:28
学习笔记 一、STM32的APB1与APB2总线及挂载到该总线的设备 APB1总线上的设备 DAC PWR BKP bxCAN USB IIC1 IIC2 UART2~ 5 TIM2~ 7 RTC WWDG IWDG SPI2/I2S SPIS/I2S APB2总线上的设备 ADC1~ 3 UART1 SPI1 TIM1 TIM8 GPIOx EXTI AFIO 如果是APB1总线上的设备则使用RCC_APB1PeriphClockCmd() 函数使能时钟; 如果是APB2总线上的设备则使用RCC_APB2PeriphClockCmd() 函数使能时钟; 二、串口设置的一般步骤 串口时钟使能, GPIO 时钟使能 串口复位 GPIO 端口模式设置 串口参数初始化 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 使能串口 编写中断处理函数 对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式 1.串口时钟使能。 RCC_APB2PeriphClockCmd(); 2.串口复位。 一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数 USART_DeInit()中完成: void USART_DeInit(USART_TypeDef* USARTx);//串口复位 3

Vue切换页面时中断axios请求

南楼画角 提交于 2020-01-17 02:37:43
一、概述 在Vue单页面开发过程中,遇到这样的情况,当我切换页面时,由于上一页面请求执行时间长,切换到该页面时,还未执行完,这时那个请求仍会继续执行直到请求结束,此时将会影响页面性能,并且可能对现在页面的数据显示造成一定影响 所以我们应该,切换页面前中断前面所有请求 二、解决方法 在main.js中,重新封装axios请求,在router.beforeEach强制中断请求 Vue.prototype.$http= axios; //Vue函数添加一个原型属性$axios 指向axios,这样vue实例或组件中不用再去重复引用Axios 直接用this.$axios就能执行axios 方法 const CancelToken = axios.CancelToken; Vue.$httpRequestList=[]; Vue.prototype.$ajax = (type, url, data) => { return new Promise((resolve, reject) => { //封装ajax var aa = { method: type, url: url, cancelToken: new CancelToken(c => { //强行中断请求要用到的 Vue.$httpRequestList.push(c); }) } var json = (type ==