中断处理

Linux性能优化从入门到实战:04 CPU篇:CPU使用率

时间秒杀一切 提交于 2019-11-28 01:24:53
   CPU使用率 是单位时间内CPU使用情况的统计,以百分比方式展示。 $ top top - 11:46:45 up 7 days, 11:52, 1 user, load average: 0.00, 0.01, 0.00 Tasks: 198 total, 1 running, 197 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 4044232 total, 420136 free, 1061244 used, 2562852 buff/cache KiB Swap: 1046524 total, 1043128 free, 3396 used. 2619124 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 921 root 20 0 531332 138408 58972 S 0.7 3.4 41:31.24 Xorg    参数解析 如下: %user(us),代表用户态 CPU 时间。不包括下面的 nice 时间,但包括了 guest 时间。 %nice(ni),代表低优先级用户态 CPU 时间,也就是进程的

多线程与并发

好久不见. 提交于 2019-11-27 21:30:08
1.1进程和线程的区别 1.进程和线程的由来 串行:初期计算机只能床行执行任务,并且需要长时间等待用户输入 批处理:预先将用户的指令集中成清单,批量创行处理用户指令,仍然无法并发执行。 进程:进程独占内存空间,保存各自运行状态,相互间不干扰且可以互相切换,为并发处理任务提供了可能 线程:共享进程的内存资源,相互间切换更快速,支持更细粒度的任务控制,使进程内的子任务得以并发执行。 进程是资源分配的最小单位,线城市CPU调度的最小单位 1.所有与进程相关的资源,都被记录在PCB中 2.进程是抢占处理机的调度单位,线程属于某个进程,共享其资源 3.线程只由堆栈寄存器,程序计数器和TCB(线程计数表)组成 总结: 1.线程不能看作独立应用。而进程可看作独立应用。 2.进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径 3.线程没有独立的地址空间,多进程的程序比多线程的程序健壮。 4.进程的切换比线程的切换开销大。 JAVA进程和线程的关系: 1. Java对操作系统提供的功能进行封装,包括进程和线程 2.运行一个程序会产生一个进程,进程包含至少一个线程 3.每个进程对应一个JVM实例,多个线程共享JVM里的堆 4.Java采用单线程变成模型,程序会自动创建主线程 5.主线程可以创建子线程,原则上要后于子线程完成执行。 2.Thread中的start和run的区别: 1

中断与中断系统

若如初见. 提交于 2019-11-27 17:56:17
目录 中断 中断源 中断字 中断类型 中断向量 中断嵌套 中断优先级 中断屏蔽 中断处理程序 中断:没有我,还想提高计算机性能,做梦吧! 设想一个场景: 小宏正在吃饭,突然接到公司的电话,要求马上赶到公司开会。此时小宏做了如下几件事情: 放下碗筷 拿上车钥匙 去车库取车 赶到公司 如上场景在生活中经常能够见到,放在本文中,有一个术语能够很好的诠释这一场景——中断。 中断 公司打来电话要求小宏马上去公司开会,因而小宏必须放下没有吃完的饭,转而赶去公司开会,等开完会再回到家继续吃饭。这几个动作就表现出了中断的概念。而小宏就是一个中断装置。 什么是 中断 ? 在程序运行过程中出现某种紧急事件,必须中止当前正在运行的程序,转而去处理此事件,然后再恢复原来运行的程序,这个过程就被称为中断。 什么是 中断装置 ? 中断系统中的硬件部分,其职能是发现并响应中断,具体为: 识别中断源 保存现场 引出中断处理程序 中断源 公司打电话要求小宏马上去公司开会,这就是引起小宏不得放下碗筷去公司开会的事件了。在计算机术语中,也称之为中断源。 引起中断的事件称为 中断源 。 中断字 当小宏到了公司,走进会议室开始开会,此时: 拿出笔记本 开始记录会议内容 以上是小宏在处理中断事件,我们称,笔记本是中断记录器,笔记本上记录的内容是中断字。 在中断装置发现并响应中断后,转到响应的中断处理程序。

USART之空闲中断(IDLE)

纵然是瞬间 提交于 2019-11-27 16:40:14
USART - 空闲中断接收 STM32 的 USART 收发 , 以前只知道用 RENE(非空中断) 处理接收, 自从发现 IDLE(空闲中断) 这词后, 眼前一亮, 老司机自然明白能省多少中断工夫!! 使用时,注意以下两点,很重要 : 1. IDLE的中断清理方式. 开始以为住SR写0就能清理中断, 调试时寄存器确实清0了, 但程序上却不断进中断! (你用IDLE就会发现这问题了) 这个费了一个白天,直至网上发现前人的留言: "因为IDLE被搞成了一个帧,而不是一个事件,这个帧不读掉是清除不了中断标志的,这个真的很坑啊。" 方法如下: u32 temp; temp=USART1->SR; temp=USART1->DR; 就是这样, 这两句顺序还不能错, 前人不说, 撞墙也想不出来这前因后果!! 2. DMA 设置 平时用DMA一般就:PtoM, MtoP, 就是数据长度是已知道的; 而用IDLE(空闲中断), 最方便的就是接收不定长数据. 所以NDTR(传输数量)要设得比实际数量要大(注意单位:你的字长),如200. 大多少没关系. 中断中, 要重新设置NDTR. 切记,切记,切记. 另外: DMA是在关闭时方能修改!! 代码如下, 主要三个函数, DMA初始化 , USART初始化 , 中断函数 , // DMA初始化 //*************************

探究为什么FreeRTOS 有些API不能在中断服务函数中调用,转而需要调用带ISR的版本

左心房为你撑大大i 提交于 2019-11-27 15:46:49
  用了好久的FreeRTOS以前只是知道,如果在中断服务程序中调用某一些FreeRTOS的API函数时需要注意,如果有ISR版本的一定要调用,末尾带ISR的函数,并且要调用系统的API函数,中断服务程序的中断优先级不能高于配置宏(configMAX_SYSCALL_INTERRUPT_PRIORITY)的值这是为什么呢。刚好今天受台风影响只能在家里窝着,所以就想着趁有时间看看这一部分的内容,研究一下为什么,那么废话不多说开干。   找了几个函数简化一些安全检查的内容再把一些宏函数替换后对比观察了下内容如下: TickType_t xTaskGetTickCount( void ) { TickType_t xTicks; { xTicks = xTickCount; } return xTicks; } /*-----------------------------------------------------------*/ TickType_t xTaskGetTickCountFromISR( void ) { TickType_t xReturn; UBaseType_t uxSavedInterruptStatus; portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); uxSavedInterruptStatus =

JVM 垃圾回收算法

丶灬走出姿态 提交于 2019-11-27 13:04:22
标记-清除算法 操作 把需要清楚的对象进行一一标记 标记完成之后统一清楚 缺点 标记和清楚的执行过程效率低 清理之后形成很多的空间碎片 如果此时需要一整块大一些的空间可能就放不进去 可能就又导致新的垃圾回收以配合内存申请 时间一长这样的碎片可能是越来越密集的 复制算法 基本复制算法 操作 把内存分为两块区域一块用于存放对象,另一块为空的内存区域 每次垃圾回收把用的区域中还存活的对象复制到空的区域中 优势 这样就不会形成内存碎片 而且效率较高 缺点 需要专门一块空间不放对象 对内存是一种浪费 HotSpot新生代 复制算法 操作 把垃圾回收分为三块区域分别是一块eden区,两块survior区域 三个大小比例是8:1:1 新的对象加入到 enden 区域 和 一块 survior区域 每次垃圾回收把这两个区域中还存活的对象放到第二个survior区域中 然后再把这个两个区域清空 原理 新生代中的对象都是 朝生夕死的,一般来说98%都会被清理掉 所以留10%的空间给能存活的2%的对象,大部分情况都足够了 分配担保机制 即使留10%也可能出现不够的情况 那么就让老年区在这种情况发现的情况下分配一下内存负担 之所以说是担保,也就是不一定总会帮忙借出内存 当达到担保的阈值的时候就不借出了 此时会执行Full GC确保能有足够的空间给新的对象 在Full GC之前都是Minor GC 标记

Thread interrupted() 线程的中断

≯℡__Kan透↙ 提交于 2019-11-27 11:39:10
问题:   1、线程的中断方式。   2、为什么中断阻塞中的线程,会抛出异常。 代码示例:   package com.hdwl.netty; public class ThreadInterrupted { public static void main(String[] args) { // testNoInterrupted(); // testInterrupted(); testInterruptedWithBlock(); } //测试阻塞线程的中断 private static void testInterruptedWithBlock() { MyInterruptedBlockThread mibt = new MyInterruptedBlockThread(); mibt.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } mibt.interrupt();//设置中断标示 } //线程非阻塞中断的演示 private static void testInterrupted() { MyInterruptedNoBlockThread mibt = new MyInterruptedNoBlockThread(); mibt

FreeRTOS 任务栈大小确定及其溢出检测

帅比萌擦擦* 提交于 2019-11-27 10:19:11
以下转载自 https://www.cnblogs.com/yangguang-it/p/7123727.html FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式。如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用。 FreeRTOS 的系统栈设置 上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方 都是在这里配置的栈空间: 在 RTOS 下, 上面两个截图中设置的栈大小有了一个新的名字叫系统栈空间 ,而任务栈是不使用这里的空间的。 任务栈不使用这里的栈空间,哪里使用这里的栈空间呢?答案就在中断函数和中断嵌套。  由于 Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP 任务堆栈指针也是可以的。在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中

线程状态转换以及基本操作

丶灬走出姿态 提交于 2019-11-27 06:05:35
在上一篇文章中并发编程的优缺点谈到了为什么花功夫去学习并发编程的技术,也就是说我们必须了解到并发编程的优缺点,我们在什么情况下可以去考虑开启多个线程去实现我们的业务,当然使用多线程我们应该着重注意一些什么,在上一篇文章中会有一些讨论。那么,说了这么多,无论是针对面试还是实际工作中作为一名软件开发人员都应该具备这样的技能。万事开头难,接下来就应该了解如何新建一个线程?线程状态是怎样转换的?关于线程状态的操作是怎样的?这篇文章就主要围绕这三个方面来聊一聊。 1. 新建线程 一个java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上java程序天生就是一个多线程程序,包含了: (1)分发处理发送给给JVM信号的线程; (2)调用对象的finalize方法的线程; (3)清除Reference的线程; (4)main线程,用户程序的入口。 那么,如何在用户程序中新建一个线程了,只要有三种方式: 通过继承Thread类,重写run方法; 通过实现runable接口; 通过实现callable接口这三种方式,下面看具体demo。 public class CreateThreadDemo { public static void main(String[] args) { //1.继承Thread Thread thread = new Thread

Java线程面试题 Top 50 (转载)

强颜欢笑 提交于 2019-11-27 04:36:00
50道Java线程面试题   下面是Java线程相关的热门面试题,你可以用它来好好准备面试。 1) 什么是线程?   线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请 点击这里 。 2) 线程和进程有什么区别?   线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请 点击这里 。 3) 如何在Java中实现线程?   在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请 点击这里 . 4) 用Runnable还是Thread?   这个问题是上题的后续