中断处理

Java多线程面试问题和答案

北战南征 提交于 2020-01-13 16:38:46
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点。 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。 3) 如何在Java中实现线程? 在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承 java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。 4) 用Runnable还是Thread? 这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使 用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类

异常和Log4j

拜拜、爱过 提交于 2020-01-12 02:33:39
一.生活中的异常一路畅通但是,异常情况迟早要发生!堵车!撞车! 二.什么是异常 异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序 生活中面对异常通常会这样处理 绕行或者等待 请求交警解决 生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活 三.Java的异常处理是通过5个关键字来实现的 try、catch、 finally、throw、throws 捕获异常 执行可能产生异常的代码 无论是否发生异常, 捕获异常 代码总能执行 声明异常 抛出异常 四.常见的异常类型 异常层次结构的父类 算术错误情形,如以零作除数 数组下标越界 尝试访问 null 对象成员 不能加载所需的类 方法接收到非法参数 五.Log4J 在项目中加入log4j的JAR文件 创建log4j.properties文件 配置日志信息 使用log4j记录日志信息 来源: CSDN 作者: athga 链接: https://blog.csdn.net/athga/article/details/103826302

Arduino基础一文通

こ雲淡風輕ζ 提交于 2020-01-11 23:04:40
(Arduino基础一文通) 此文旨在记录arduino的一些基本语法,以备自己后续查用,并没有任何的讲解和分析, 如果您是电子爱好者,想学习arduino,请寻找合适的教材学习; 如果您有编程基础,想短时间内粗略了解arduino,则完全可以。 第一部分 基础 一、Arduino程序结构 草图启动时会调用setup()函数。使用它来初始化变量,引脚模式,启用库等。setup函数只能在Arduino板的每次上电或复位后运行一次。 在创建了用于初始化并设置初始值的setup()函数后,loop()函数,正如它的名称所指,允许你的程序连续循环的更改和响应。可以使用它来主动控制Arduino板。 二、Arduino数据类型 三、Arduino 变量和常量 和C完全一样; 四、Arduino 运算符 和C完全一样; 五、Arduino 控制语句 注意其中一个:(三元运算符) ? :条件运算符语法 expression1 ? expression2 : expression3 max = ( a > b ) ? a : b; 六、Arduino 循环 和C完全一样 七、Arduino 函数 和C完全一样 注意:如果函数写在loop函数下面,则需要在前面声明,就像C语言里写在main函数下面一样 八、Arduino 字符串 Arduino字符串同样继承了C字符串的特点😭😭😭 char my

Linux 时钟系统漫游

你离开我真会死。 提交于 2020-01-10 23:29:41
缘由: 在开发KVM虚拟机过程中,不可避免的会跟虚拟机时钟打交道 目前存在的问题是:一旦出现多个虚拟机运行在同一个CPU上,造成足够多的负载时,由于调度不及时导致虚拟机时钟中断的频率将会变慢 在x86上的虚拟机貌似没有这个问题,借此机会打算梳理一下整个Linux 时钟系统,也不一定能解决,但是至少可以理一下思路 时钟贯穿整个Linux 执行周期,千丝万缕,我们就从最直观的 时钟中断 切入,循序渐进,看看Linux 时钟的演化过程(本篇不涉及动态时钟,后续有机会可以继续分析)。 时钟中断: 1. 时钟中断到来时,系统首先就是要更新墙上时间:update_wall_time 与时钟中断和墙上时钟紧密相关的一个变量是jiffies。这个变量记录着系统启动后产生了多少次时钟中断,所以每个中断来后自增。 与时钟中断相关的重要配置是CONFIG_HZ,这个是编译时配置文件决定,在我这里CONFIG_HZ=256表示一秒钟jiffies增加256次。 但系统时钟并不用jiffies来更新,在update_wall_time函数内使用clock->read(clock)读取时钟源,并更新系统时钟xtime。这个时钟源往往是之前注册好的主板上恒定的硬件时钟 内核中很多变量都需要用jiffies计算,而不是人所需要的xtime,所以对内核来说jiffies比xtime更有用。 2.

SYS/BIOS知识整理汇总

泪湿孤枕 提交于 2020-01-10 17:31:14
本文主要整理BIOS相关组件的执行原理及使用,这里主要包括了硬件中断Hwi模块、软件中断Swi模块、时钟Clock模块、任务Tsk模块、信号量Sem模块。 1.SYS/BIOS概述 SYS/BIOS是一个可扩展的实时内核(或者说是操作系统),其提供了许多模块化的APIs(应用程序接口),支持抢占式多线程,硬件抽象,实时分析和配置工具,其设计目的是为了最大限度地减少对内存和CPU的要求。其拥有很多实时嵌入式操作系统的功能,如任务的调度,任务间的同步和通信,内存管理,实时时钟管理,中断服务管理等。有了它,用户可以编写复杂的多线程程序,并且会占用更少的CPU和内存资源。 SYS/BIOS的早期版本是DSP/BIOS,更名的原因,是因为SYS/BIOS不仅可以用于DSP,而且也可以嵌入到ARM等其他Soc中去。SYS/BIOS是一个可用于实时调度、同步,主机和目标机通信,以及实时分析系统上的一个可裁减实时内核,它提供了抢占式的多任务调度,对硬件的及时反应,实时分析和配置工具等。同时也提供标准的API接口,易于使用。它是TI的eXpressDSP实时软件技术的的一个关键部分。 2.开发环境 CCS支持SYS/BIOS的开发,用户单独下载安装bios组件即可运行,能够大大方便用户编写多任务应用程序。 3.SYS/BIOS相比裸机的优点 适用于复杂系统,在需要同时处理多个事件时SYS

如何停止JAVA线程

只谈情不闲聊 提交于 2020-01-08 23:35:46
本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! 本文以转移至本人的个人博客,请多多关注! http://blog.csdn.net/anhuidelinger/article/details/11746365 终止线程的三种方法 有三种方法可以使终止线程。 1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。 3. 使用interrupt方法中断线程。 1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要循环处理的任务。 在这种情况下,一般是将这些任务放在一个循环中,如while循环。如果想让循环永远运行下去,可以使用while(true){……}来处理。但要想使 while循环在某一特定条件下退出,最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false来控制while循环 是否退出。下面给出了一个利用退出标志终止线程的例子。 package chapter2; public class ThreadFlag extends Thread { public

Nachos-Lab2-线程调度模块实现

纵然是瞬间 提交于 2020-01-08 21:12:39
源码获取 https://github.com/icoty/nachos-3.4-Lab 内容一:总体概述 本实习希望通过修改Nachos系统平台的底层源代码,达到“扩展调度算法”的目标。本次实验主要是要理解Timer、Scheduler和Interrupt之间的关系,从而理解线程之间是如何进行调度的。 内容二:任务完成情况 任务完成列表(Y/N) Exercise1 Exercise2 Exercise3 Challenge1 第一部分 Y Y Y Y 具体Exercise的完成情况 Exercise1 调研 调研Linux或Windows中采用的进程/线程调度算法。具体内容见课堂要求。 linux-4.19.23进程调度策略 : SCHED_OTHER 分时调度策略, SCHED_FIFO 实时调度策略(先到先服务), SCHED_RR 实时调度策略(时间片轮转)。 RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。 当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。 RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的位置决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?)

日常问题解决

陌路散爱 提交于 2020-01-08 13:31:07
需求1:sqlite两张同样数据结构的表,将数据合成到一张表中 场景:服务器上突然中断导致对sqlite的读写中断,数据库被锁,报database disk image is malformed的错误,导致重启后无法继续写入,将数据备份,重建数据库写入数据,后期需要数据合并。 需求2:服务器重启时自动启动某个程序 场景:录像处理的程序,若不启动,导致中转上面的数据堆积,磁盘占满,防止服务器重启后忘记启动这个程序,加入自动启动的机制 来源: https://www.cnblogs.com/mbaymax/p/12165925.html

网卡工作原理

流过昼夜 提交于 2020-01-08 08:09:16
网卡工作原理 Linux操作系统的功能可以概括为进程管理、内存管理、文件系统管理、设备管理、网络等几部分。所有的系统操作最终都可以映射到对物理设备的操作。除去对CPU、内存以及其他少数几个物理实体的操作之外,系统对其他设备的所有操作都通过专门的称为驱动程序的代码完成。系统中存在的每种外设在内核中都必须有对应的设备驱动程序对其进行处理。所以分析网卡的工作原理即是分析网卡的驱动程序。 网络是独立的一个模块。为了屏蔽网络环境中物理网络设备的多样性,Linux对所有的设备进行抽象并定义了一个统一的概念,称之为接口。所有对网络硬件的访问都是通过接口进行的,接口提供了一个对所有类型的硬件一致化的操作集合来处理基本数据发送和接收。一个网络接口被看作是一个发送和接收数据包的实体。对于每个网络接口,都用一个net_device的数据结构来表示。net_device中有很多提供系统访问和协议层调用的设备方法,包括提供设备初始化和往系统注册用的init函数,打开和关闭网络设备的open和stop函数,处理数据包发送的函数hard_start_xmit,以及中断处理函数。 所有被发送和接收的包都用数据结构sk_buff表示。要发送数据时,网络系统将分局系统路由表选择相应的网络接口进行数据传输;当接收数据包时,通过驱动程序登记的中断服务程序进行数据的接口处理。 Linux网络驱动程序崇尚倒下分为四层

IDT 中断描述符表

≡放荡痞女 提交于 2020-01-08 00:44:52
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。 IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。 中断描述符表IDT和寄存器IDTR LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前 特权级 CPL 是0的代码执行,通常被用于创建IDT时的操作 系统初始化 代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。   如果中断或异常向量引用的描述符超过了IDT的界限