中断处理

Java 并发:线程基础

怎甘沉沦 提交于 2020-01-29 03:57:22
线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。 阻塞(Blocking) 等待获取一个排它锁,如果其线程释放了锁就会结束此状态。 无限期等待(Waiting) 等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。 限期等待(Timed Waiting) 无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。 调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。 调用 Object.wait() 方法使线程进入限期等待或者无限期等待时,常常用“挂起一个线程”进行描述。 睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态。 阻塞和等待的区别在于,阻塞是被动的,它是在等待获取一个排它锁。而等待是主动的,通过调用 Thread.sleep() 和 Object.wait() 等方法进入。 死亡(Terminated) 可以是线程结束任务之后自己结束,或者产生了异常而结束。 线程使用方式 有三种使用线程的方法: 实现 Runnable 接口; 实现 Callable 接口; 继承 Thread 类。 实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务

Lock和synchronized的选择

a 夏天 提交于 2020-01-28 14:12:11
学习资源: http://www.cnblogs.com/dolphin0520/p/3923167.html 一.java.util.concurrent.locks包下常用的类 1.Lock public interface Lock { void lock() ;//用来获取锁。如果锁已被其他线程获取,则进行等待。 void lockInterruptibly () throws InterruptedException;//当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。 boolean tryLock ();//是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。 boolean tryLock( long time, TimeUnit unit) throws InterruptedException ;//和tryLock()方法是类似的

信号和中断的比较 + 中断和异常的比较

巧了我就是萌 提交于 2020-01-28 11:56:02
概念太多了,信号,软中断,中断等等。试着做总结。 下面这个里面主要讲了硬件中断: http://www.cnblogs.com/charlesblc/p/6261741.html 下面这个里面主要讲了软中断,硬中断: http://www.cnblogs.com/charlesblc/p/6263208.html 这里先比较一下异常和中断 参考 http://blog.csdn.net/dodo_check/article/details/8806961 l 中 断(也称硬件中断) 定义:中断是由 其他硬件设备 依照CPU时钟周期信号随机产生的。 分类: 可屏蔽中断 非可屏蔽中断 来源: 间隔定时器和I/O l 异 常(也称软件中断) 定义:当指令执行时 由CPU控制单元 产生的。 分类: 处理器探测到的异常 ² 故障 ² 陷阱 ² 异常终止 编程异常(也称软中断) ² int指令 来源: 程序的错误产生的 内核必须处理的异常(例如:缺页和内核服务的请求-int) 异常处理 l 当发生异常时,CPU控制单元产生一个硬件出错码。 l CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。 l 中断处理程序处理完之后向当前进程发送一个SIG***信号。 l 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操作。 中断处理 l

java并发变成及juc包的应用

╄→尐↘猪︶ㄣ 提交于 2020-01-28 03:51:22
多线程: windows操作系统是多任务操作系统,它以进程为单位,一个进程是一个包含有自身地址的程序,每个正在独立执行的程序都称为进程,进程是系统进行资源分配和调用的独立单位,每个进程有自己的内存空间和系统资源。系统可以分配给每个进程一段有限的使用CPU时间,CPU在这个时间片中执行某个进程,然后下一个时间片又跳到另一个进程中去执行,由于CPU转换较快,所以使的每个进程好像同时进行,多核CPU的多核同时运行,但是进程数远远大于核数,所以还是要依靠切换进程来做。一个线程则是进程中的执行流程,一个进程中可以同时包括多个线程,每个线程也可以得到一小段程序的执行时间,这样一个进程就可以具有多个并发执行的线程,在单线程中,程序的代码按照调用顺序依次往下执行,如果需要一个进程同时完成多段代码的操作,就需要产生多线程(多条执行路径)。多线程可以提高应用程序的使用率,为了有更高的几率抢到CPU的执行权,但我们不能保证哪一个线程能够在哪一个时刻抢到,所以线程的执行有随机性。在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。 线程的两种调度模型:平均分配每个线程占用CPU的时间片,上面说的就是这种,第二种就是抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,会随机选一个,优先级高仅仅表示线程获取的cpu时间片的几率相对对多些

Linux中断体系结构

旧街凉风 提交于 2020-01-28 02:17:44
1.中断处理体系结构 Linux内核将所有中断统一编号,使用一个irq_desc结构数组来描述这些中断。 数组声明在 /linux/kernel/irq/handle.c中,其中 #define NR_IRQS 128 ,定义在 /linux/include/ asm/irq.h 中 1 /* 2 * Linux has a controller-independent interrupt architecture. 3 * Every controller has a 'controller-template', that is used 4 * by the main code to do the right thing. Each driver-visible 5 * interrupt source is transparently wired to the appropriate 6 * controller. Thus drivers need not be aware of the 7 * interrupt-controller. 8 * 9 * The code is designed to be easily extended with new/different 10 * interrupt controllers, without having to do

1-并发编程概念

↘锁芯ラ 提交于 2020-01-27 18:53:11
一、基础 1、cup核心数据与线程数 早期是1:1关系 但后internet优化,提一核可以同时处理2个线程,所以现在核心数据与线程 1:2 2、cpu时间片轮询机制 ,cpu在执行任务的时候是把cpu分成一段段时间片,因为时间片太短我们感知不到 3、并发和并行 : 并行:同一时刻处理事情的能力 如比:食堂有8个打饭窗口,那么可以同时处理8个人打饭 并发:时间段内处理事情的能力 如比:一个人打饭需1分钟,那么食堂10分钟内的并发能力就是:8x1x10 = 80个, 10分钟内可处理80个人打饭。 4、并发编程好处意义 :提升cup利用效,模块化方法 5、注意事项 :注意线程安全,容易死锁,线程太多 机器宕机 二、并发编程 有几种方式创建2种线程 类Thread:java对线程的抽象 Runnable: 对任务和业务逻辑的抽象 Thread threa = Thread(new Runnable()) 线程如何中断? Stop为什么不建议使用:会使线程立刻结束,而资源不会正常释放 Suspend()强制线程挂起,不会释放锁,可能会引起死索 Thread线程中断: 如果要中断线程,那么使用interrupt设置中断标志位 中断线程实现: interrupt():对线程发起中断:并不是真正终止线程,给线程一个中断标志位(只是跟线程打招呼,线程不会立即停止,也可能不理会),线程是协作式

字符设备驱动(三)中断框架

那年仲夏 提交于 2020-01-27 07:53:57
目录 字符设备驱动(三)中断框架 引入 汇编处理 拷贝向量表 向量表宏解析 跳转函数 C函数处理 asm_do_IRQ __set_irq_handler s3c24xx_init_irq handle_edge_irq handle_IRQ_event desc->action 小结 流程 设置 irq_desc 数组 关键结构成员 完整框架图 流程一览 设置向量表 设置全局中断数组 设置用户action动作 title: 字符设备驱动(三)中断框架 tags: linux date: 2018-11-22 18:58:22 toc: true --- 字符设备驱动(三)中断框架 引入 裸机中断流程 外部触发 CPU 发生中断, 强制的跳到异常向量处 跳转到具体函数 保存被中断处的现场(各种寄存器的值)。 处理具体任务 恢复被中断的现场 LINUX流程 ARM 架构的 CPU 的异常向量基址可以是 0x0000 0000 ,也可以是 0xffff0000 ,这个地址并不代表实际的内存,是虚拟地址.当建立了虚拟地址与物理地址间的映射后,得将那些异常向量,即相当于把那些跳转指令复制拷贝到这个 0xffff0000 这个地址处去。 汇编处理 在 trap_init 中实现( start_kernel 中调用) // arch/arm/kernel/traps.c void __init

【Java】多线程初探

拟墨画扇 提交于 2020-01-27 02:31:03
参考书籍: 《Java核心技术 卷Ⅰ 》 Java的线程状态 从操作系统的角度看,线程有5种状态:创建, 就绪, 运行, 阻塞, 终止(结束)。如下图所示 而Java定义的线程状态有: 创建(New), 可运行(Runnable), 阻塞(Blocked), 等待(Waiting), 计时等待(Time waiting) 被终止(Terminated)。 那么相比起操作系统的线程状态, Java定义的线程状态该如何解读呢? 如下: 1. Java的阻塞、 等待、 计时等待都属于操作系统中定义的阻塞状态,不过做了进一步的划分,阻塞(Blocked)是试图获得对象锁(不是java.util.concurrent库中的锁),而对象锁暂时被其他线程持有导致的;等待(Waiting)则是调用Object.wait,Thread.join或Lock.lock等方法导致的;计时等待(Time waiting)则是在等待的方法中引入了时间参数进入的状态,例如sleep(s) 2. Java的Runnable状态实际上包含了操作系统的就绪和运行这两种状态, 但并没有专门的标识进行区分,而是统一标识为Runnable 获取当前线程的状态和名称 currentThread()是Thread类的一个静态方法,它返回的是当前线程对象 对某个线程对象有以下方法: getState方法:返回该线程的状态

Linux中断处理流程

风流意气都作罢 提交于 2020-01-26 17:41:11
1. 中断处理流程   当中断发生时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总入口函数),并且把中断号irq传进来。根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有一个irq_desc结构的数组irq_desc_ptrs[NR_IRQS]),然后调用irq_desc中的handle_irq函数,即中断入口函数。我们编写中断的驱动,即填充并注册irq_desc结构。 2. 中断处理数据结构:irq_desc   Linux内核将所有的中断统一编号,使用一个irq_desc[NR_IRQS]的结构体数组来描述这些中断:每个数组项对应着一个中断源(也可能是一组中断源),记录中断入口函数、中断标记,并提供了中断的底层硬件访问函数(中断清除、屏蔽、使能)。另外通过这个结构体数组项中的action,能够找到用户注册的中断处理函数。 struct irq_desc { unsigned int irq; irq_flow_handler_t handle_irq; struct irq_chip *chip; struct msi_desc *msi_desc; void *handler_data; void *chip_data; struct irqaction *action; /* IRQ action

Linux课程设计报告【全集】

杀马特。学长 韩版系。学妹 提交于 2020-01-26 06:45:32
4个题目:进程创建及创建过程分析、进程族亲关系分析、进程间软中断通信、进程间管道通信 (欢迎评论/私信) 笔者用的是“ProcessOn免费在线作图网站”作的图。 报告格式要求:正文{中文:宋体、五号、单倍距;英文:Times New Roman、11号、单倍距} 一级标题{宋体、小三号、加粗} 二级标题{四号} 三级标题{小四} 不允许有四级标题 图命名{在图下方居中、宋体、五号、 仅允许出现2级图名 eg.3-1<空格>名称} 图中文字{宋体、小五} 表命名{在表上方居中、......} 表中文字{......} 页眉{学号<空格>姓名、宋体、小四、居中} 页脚{目录页码用罗马数字、正文页码用阿拉伯数字} 注* 参考文献格式要求、缩进要求 题目1 进程创建及创建过程分析 参看书P163~166 1.1设计目的 灵活运用fork系统调用创建进程,深入分析进程创建过程及fork系统调用返回值的含义,透彻分析父子进程代码共享、执行流程及数据集合的变化轨迹。 1.2设计要求 设计的程序能体现出父子进程执行轨迹的差别,也能体现出父子进程数据集合的差别。 1.3程序源代码 #include<stdio.h> #include<unistd.h> pid_t fork(void); int main() { printf("parent pid=%d\n",getpid()); pid_t