30.常见的异常类有哪些?

本文列举并解释了常见的5种运行时异常,包括ArithmeticException、ArrayIndexOutOfBoundsException、NullPointerException、ClassCastException和IllegalArgumentException,帮助读者理解这些异常的特点及其处理方式。

列举最常见的5个运用时异常。
在这里插入图片描述
1、Error和Exception的联系和区别:

Error类和Exception类是Throwable类的两个直接子类。
Error类包括一些严重的程序不能处理的系统错误类,如内存溢出、虚拟机错误、栈溢出等。这类错误一般与硬件有关,与程序本身无关,通常由系统进行处理,程序本身无法捕获和处理
Exception类异常是在程序中发生后可以进行捕获处理,处理后程序正常运行,从而保证程序的稳定性及健壮性。
2、常见运行时异常:

ArithmeticException、 ArrayIndexOutOfBoundsException、 NullPointerException、ClassCastException、 IllegalArgumentException、 NumberFormatException

在这里插入图片描述

以下是针对 **计算机底层原理 20 道高频面试题** 的标准面试答案详解,内容符合中高级 Java 开发、后端开发及系统研发岗位在真实技术面试中的表达规范:逻辑清晰、原理深入、关键词突出、语言专业。每道题均包含 **核心概念 + 实现机制 + 应用场景 + 注意事项**,便于精准作答。 --- ### 1. 计算机的组成结构? 现代计算机由五大基本部件构成(基于冯·诺依曼体系): | 组件 | 功能 | |------|------| | **运算器(ALU)** | 执行算术和逻辑运算 | | **控制器(CU)** | 解码指令,控制各部件协调工作 | | **存储器(Memory)** | 存放程序与数据,包括主存(RAM)、缓存(Cache)、硬盘等 | | **输入设备(Input)** | 如键盘、鼠标,用于向计算机输入信息 | | **输出设备(Output)** | 如显示器、打印机,用于输出结果 | > ✅ 运算器 + 控制器 = **CPU** > ✅ 存储器 + I/O 设备通过总线(Bus)与 CPU 通信 --- ### 2. 冯·诺依曼体系结构? 冯·诺依曼体系是现代计算机的基础架构模型,提出于1945年。 #### 核心思想: 1. **程序存储**:程序和数据以二进制形式共同存储在内存中 2. **顺序执行**:CPU 按地址顺序取指、译码、执行 3. **五大部件组成**:如上所述 4. **采用二进制表示信息** #### 特点: - 程序可被修改(自修改代码) - 支持条件跳转实现分支与循环 > ⚠️ 缺陷:“冯·诺依曼瓶颈”——CPU 与内存之间的带宽限制性能提升 --- ### 3. CPU的运行原理? CPU 是计算机的核心处理器,其运行遵循“取指-译码-执行-写回”周期。 #### 工作流程: 1. **取指(Fetch)**:从 PC(程序计数器)指向的内存地址读取指令 2. **译码(Decode)**:控制单元解析指令操作码和操作数 3. **执行(Execute)**:ALU 执行运算或发出访存/跳转信号 4. **写回(Write-back)**:将结果写入寄存器或内存 #### 关键组件参与: - **PC(Program Counter)**:指向当前指令地址 - **IR(Instruction Register)**:暂存当前指令 - **ACC(Accumulator)**:累加器,存放中间结果 - **ALU**:进行计算 > ✅ 每条指令的执行称为一个“机器周期”,多个时钟周期完成 --- ### 4. 内存的访问机制? 内存访问是 CPU 读写 RAM 中数据的过程。 #### 访问步骤: 1. CPU 将目标地址送入 **地址总线** 2. 控制单元发出读/写命令到 **控制总线** 3. 数据通过 **数据总线** 在 CPU 与内存间传输 #### 性能影响因素: - **访问延迟**:首次访问某行数据较慢(Row Access Delay) - **局部性原理**: - 时间局部性:最近访问的数据可能再次使用 - 空间局部性:相邻地址的数据很可能被连续访问 → 引出 Cache 设计 > ✅ 内存访问远慢于 CPU 处理速度,因此引入多级缓存缓解瓶颈 --- ### 5. 寄存器的作用? 寄存器是 CPU 内部的高速存储单元,用于暂存指令、数据和地址。 #### 主要寄存器类型: | 寄存器 | 作用 | |--------|------| | **通用寄存器(RAX, RBX...)** | 存放操作数和中间结果 | | **程序计数器(PC / RIP)** | 指向下一条要执行的指令地址 | | **指令寄存器(IR)** | 存放当前正在执行的指令 | | **状态寄存器(FLAGS / RFLAGS)** | 记录运算结果状态(如零标志 ZF、进位 CF) | | **栈指针寄存器(SP / RSP)** | 指向函数调用栈顶 | | **基址指针寄存器(BP / RBP)** | 指向当前栈帧起始位置 | > ✅ 特点:数量少(几十个)、速度快(一个时钟周期可访问)、成本高 --- ### 6. 指令集架构? 指令集架构(ISA, Instruction Set Architecture)是软硬件之间的接口规范。 #### 两种主流架构: | 类型 | 特点 | |------|------| | **CISC(复杂指令集)** | x86 架构代表,指令丰富、长度可变、支持复杂操作(如 `rep movsb`) | | **RISC(精简指令集)** | ARM、MIPS、RISC-V 代表,指令简单、定长、单周期执行为主 | #### 对比: | 维度 | CISC | RISC | |------|------|------| | 指令数量 | 多 | 少 | | 编码方式 | 变长 | 定长 | | 执行效率 | 单条功能强,但解码复杂 | 更适合流水线优化 | | 功耗 | 较高 | 较低(适合移动设备) | > ✅ 当前趋势:CISC 芯片内部微码转为 RISC 风格执行(x86 使用 μOps) --- ### 7. 流水线机制? 流水线技术将指令执行划分为多个阶段,并行处理不同指令,提高吞吐率。 #### 典型五级流水线: 1. **IF(Instruction Fetch)**:取指 2. **ID(Instruction Decode)**:译码 3. **EX(Execute)**:执行 4. **MEM(Memory Access)**:访存 5. **WB(Write Back)**:写回 ``` 时钟周期: 1 2 3 4 5 6 7 IF1 ID1 EX1 MEM1 WB1 IF2 ID2 EX2 MEM2 WB2 IF3 ID3 EX3 MEM3 WB3 ``` > ✅ 吞吐量接近每周期一条指令,但存在“冒险”问题(数据依赖、控制跳转) --- ### 8. 超线程技术? 超线程(Hyper-Threading, HT)是 Intel 提出的并发执行技术。 #### 原理: - 单个物理核心模拟出两个逻辑核心(Core0 → Logical Core0 & Core1) - 共享 ALU、Cache、执行单元,但拥有独立的 PC、寄存器组 - 当一个线程等待内存时,另一个线程可以继续执行,提升资源利用率 #### 效果: - 性能提升约 10%~30%,非双倍 - 在 I/O 密集型任务中收益明显,在计算密集型中有限 > ✅ 操作系统将其视为独立 CPU,可用于多线程并行调度 --- ### 9. 缓存一致性协议? 多核 CPU 中每个核心有独立 Cache,需保证数据一致性。 #### MESI 协议(最常见): 定义每个缓存行的四种状态: | 状态 | 含义 | |------|------| | **Modified (M)** | 本核修改过,与其他副本不一致,需写回内存 | | **Exclusive (E)** | 仅本核持有,未修改,可自由修改 | | **Shared (S)** | 多个核共享,只读 | | **Invalid (I)** | 数据无效,不能使用 | #### 典型操作: - 写命中 Shared 数据 → 发出 Invalidate 请求使其他核失效 - 读 Miss → 广播 Read 请求获取最新数据 > ✅ 协议通过总线嗅探(Bus Snooping)或目录式(Directory-based)实现 --- ### 10. 内存屏障的作用? 内存屏障(Memory Barrier / Fence)用于控制指令重排序行为,确保内存可见性和顺序性。 #### 三类重排序: 1. 编译器重排序 2. CPU 乱序执行(Out-of-Order Execution) 3. 写缓冲导致的写顺序不一致 #### 屏障类型: | 类型 | 说明 | |------|------| | **LoadLoad** | 禁止前面的 Load 与后面的 Load 重排 | | **StoreStore** | 禁止前面的 Store 与后面的 Store 重排 | | **LoadStore** | 禁止 Load 与 Store 重排 | | **StoreLoad** | 最强屏障,防止 Store 和 Load 重排,通常伴随全局锁 | ```cpp // 示例:x86 的 mfence 指令 asm volatile("mfence" ::: "memory"); ``` > ✅ Java 中 `volatile` 变量写入会插入 StoreLoad 屏障,保证可见性与有序性 --- ### 11. 操作系统的启动过程? 操作系统启动是从加电到用户态程序运行的全过程。 #### 启动流程: 1. **加电自检(POST)**:BIOS 检查硬件是否正常 2. **加载 MBR**:BIOS 读取磁盘第 0 扇区(MBR),跳转至引导代码 3. **启动 Bootloader**(如 GRUB):选择内核镜像,加载到内存 4. **加载内核**:将 OS Kernel 解压到内存,开始执行 5. **初始化系统**:设置页表、启动中断、创建 init 进程 6. **启动用户空间**:运行 `/sbin/init` 或 systemd,进入登录界面 > ✅ UEFI 替代传统 BIOS,支持更大磁盘、更快启动、安全启动(Secure Boot) --- ### 12. BIOS的作用? BIOS(Basic Input/Output System)是固化在主板 ROM 中的固件程序。 #### 主要功能: 1. **硬件初始化**:检测 CPU、内存、显卡、硬盘等 2. **POST(Power-On Self Test)**:开机自检 3. **提供低层服务**:如屏幕打印、磁盘读写中断调用 4. **引导操作系统**:查找可启动设备,加载引导扇区 > ⚠️ 现代系统已逐步被 **UEFI(Unified Extensible Firmware Interface)** 替代,功能更强 --- ### 13. 硬盘的读写机制? 硬盘分为机械硬盘(HDD)和固态硬盘(SSD),机制不同。 #### HDD(机械硬盘): - 数据存储在旋转磁盘表面,通过磁头移动读写 - 三大性能指标: - **寻道时间**:磁头定位到目标磁道 - **旋转延迟**:等待目标扇区转到磁头下 - **传输时间**:数据读出或写入 - 随机 I/O 性能差,顺序 I/O 较好 #### SSD(固态硬盘): - 基于 NAND Flash,无机械结构 - 由主控芯片管理读写、磨损均衡、垃圾回收 - 支持 TRIM 命令释放无效页 - 随机读极快,写寿命受限(P/E 次数) > ✅ 数据库、日志系统推荐使用 SSD 提升 IOPS --- ### 14. 操作系统的中断机制? 中断是外部设备通知 CPU 有事件发生的机制。 #### 中断分类: | 类型 | 来源 | 示例 | |------|------|------| | **硬件中断** | 外设触发 | 键盘输入、网卡收包、定时器到期 | | **软件中断** | 程序主动触发 | 系统调用(int 0x80 / syscall) | | **异常(Exception)** | CPU 内部错误 | 除零、缺页、非法指令 | #### 处理流程: 1. 中断发生 → CPU 保存上下文(CS:EIP, FLAGS) 2. 查中断向量表 → 跳转 ISR(中断服务例程) 3. 执行 ISR → 处理事件(如读网卡数据) 4. 执行 `iret` 恢复现场,继续原程序 > ✅ 中断是实现异步 I/O 和多任务调度的基础 --- ### 15. 虚拟内存的实现? 虚拟内存让每个进程拥有独立的地址空间,隔离且易于管理。 #### 核心机制: - 每个进程使用 **虚拟地址(VA)** - 通过 **MMU(内存管理单元)** 转换为物理地址(PA) - 使用 **分页机制** 将虚拟页映射到物理页帧 #### 优势: - 地址空间隔离,防越界 - 支持内存超分配(Swap) - 程序无需关心物理内存布局 > ✅ 虚拟地址空间通常分为用户空间(0~3G)和内核空间(3G~4G,x86) --- ### 16. 分页与分段的区别? | 特性 | **分页(Paging)** | **分段(Segmentation)** | |------|---------------------|----------------------------| | 划分单位 | 固定大小页面(如 4KB) | 可变长度段(如代码段、堆栈段) | | 目的 | 解决外碎片,简化内存管理 | 满足程序逻辑结构需求 | | 地址结构 | 页号 + 页内偏移 | 段号 + 段内偏移 | | 碎片 | 内碎片(最后一页浪费) | 外碎片(空闲块分散) | | 易实现共享 | 不易(需对齐页) | 容易(整个段共享) | | 当前使用 | 主流(x86/x64 使用段+页混合) | 基本淘汰 | > ✅ 现代系统采用“段页式”:先分段保护,再分页映射 --- ### 17. TLB的作用? TLB(Translation Lookaside Buffer)是 MMU 中的高速缓存,缓存虚拟页到物理页的映射关系。 #### 为什么需要 TLB? - 每次地址转换需查多级页表(如 4 级页表),耗时多次内存访问 - TLB 缓存最近使用的页表项(PTE),命中时直接返回物理地址 #### 特点: - 容量小(几十到几百项),全相连或组相连 - 分为 ITLB(指令)、DTLB(数据) - 上下文切换时需刷新(或使用 ASID 区分进程) > ✅ TLB Miss 代价高昂,可能导致显著性能下降 --- ### 18. MMU的原理? MMU(Memory Management Unit)是 CPU 内负责地址转换和内存保护的硬件单元。 #### 主要功能: 1. **地址转换**:VA → PA,通过页表查找 2. **权限检查**:判断访问是否合法(用户/内核态、读/写/执行) 3. **触发缺页异常**:若页不在内存,引发 Page Fault,由 OS 加载 #### 工作流程: ``` VA → CR3(页目录基址)→ 一级页表 → 二级页表 → ... → 页表项 → PA ↑ TLB 缓存加速 ``` > ✅ 启用分页前必须设置好页表并开启 CR0.PG 标志位 --- ### 19. 操作系统的调度算法? 调度算法决定哪个进程获得 CPU 资源。 #### 常见算法: | 算法 | 说明 | 适用场景 | |------|------|----------| | **FCFS(先来先服务)** | 按到达顺序排队 | 简单但平均等待时间长 | | **SJF(短作业优先)** | 优先执行预估时间短的任务 | 最优平均周转时间,难预测 | | **优先级调度** | 按静态/动态优先级调度 | 实时系统 | | **时间片轮转(RR)** | 每个进程运行固定时间片 | 分时系统,公平 | | **多级反馈队列(MLFQ)** | 多个 RR 队列,优先级动态调整 | Unix/Linux 主流 | | **CFS(完全公平调度器)** | Linux 使用,基于虚拟运行时间(vruntime) | ```c // Linux CFS 核心思想 if (curr->vruntime > se->vruntime) resched_curr(rq); ``` > ✅ 现代操作系统普遍采用抢占式、多级反馈调度策略 --- ### 20. 系统调用的实现? 系统调用是用户程序请求内核服务的唯一合法途径。 #### 实现机制: 1. 用户程序调用封装函数(如 `read()`) 2. 执行软中断指令(`int 0x80` 或 `syscall`) 3. CPU 切换到内核态,跳转至中断处理程序 4. 内核根据系统调用号查表调用对应函数(如 `sys_read`) 5. 执行完毕后返回用户态,恢复上下文 #### 关键点: - 使用 **trap** 进入内核,保证安全性 - 参数传递通过寄存器(如 RAX 存调用号,RDI/RSI 存参数) - 内核栈与用户栈分离,防止越权访问 ```assembly mov rax, 1 ; sys_write mov rdi, 1 ; fd=stdout mov rsi, msg mov rdx, len syscall ``` > ✅ 系统调用开销较大(模式切换、上下文保存),应尽量减少频繁调用 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值