标签: #操作系统

操作系统复习笔记(III):虚拟内存

虚拟内存基于局部性原理,通过多次性、对换性、虚拟性特征,解决了传统存储管理“一次性装入”“驻留性”导致的内存浪费问题。其实现以离散分配为基础,主要采用请求分页、请求分段等方式,依赖页表机制、缺页中断机构等硬件支持。页面置换算法(如LRU、CLOCK)旨在减少缺页率,分配策略包括固定/可变分配、全局/局部置换。页面调入分预调页和请求调页,需考虑对换区与文件区选择。频繁页面调度(抖动)需通过驻留集大于工作集缓解。内存映射文件则将文件映射至虚拟地址空间,由OS自动处理数据读写,支持进程共享。

操作系统复习笔记(II):内存管理

内存管理核心功能包括空间分配回收、地址转换(逻辑到物理)、内存扩充(覆盖/交换技术)、共享与保护。进程内存映像含代码段(只读共享)、数据段、堆(高地址扩展)、栈(低地址扩展)等。链接分静态、装入时动态、运行时动态;装入分绝对、静态重定位(需一次性分配内存)、动态重定位(支持内存移动,需重定位寄存器)。连续分配有单一(单任务,利用率低)、固定分区(内部碎片)、动态分区(外部碎片,算法有首次/最佳/最坏适应)。非连续分配包括分页(页表映射,快表加速,两级页表解决页表过大)和分段(按逻辑段划分,二维地址),段页式结合两者优势。内存保护通过上下限寄存器或重定位+界地址寄存器实现。

操作系统复习笔记(I):进程管理

本章系统讲解操作系统进程与线程管理核心内容:进程作为资源分配单位,具有动态性、并发性特征,包含运行、就绪、阻塞等状态及控制机制;线程作为CPU调度单位,分用户级与内核级实现,提升并发效率。CPU调度涵盖三级调度体系(作业/内存/进程调度),重点分析FCFS、SJF、优先级、RR及多级反馈队列算法。同步与互斥通过信号量机制解决,并深入生产者-消费者、读者-写者等经典同步问题。死锁部分阐述互斥、不剥夺、请求并持、循环等待四大条件,以及预防、避免(银行家算法)和检测策略。

操作系统复习笔记(IV):文件管理

本文系统阐述了文件系统的核心概念与机制。文件是以磁盘为载体的信息集合,由文件名、数据、类型等组成,通过create、read等系统调用操作。文件目录通过FCB实现“以名存取”,结构包括单级、两级、树形及无环图,后者支持文件共享但需计数器防误删。索引节点(inode)分离文件名与描述信息,提升目录检索效率。文件逻辑结构分无结构(流式)和有结构(顺序、索引等),物理结构则采用连续分配(高效但碎片多)、链式分配(支持扩展但随机访问差)及索引分配(灵活需多级管理)。存储空间管理通过空闲表、链表或位视图法实现。文件共享分硬链接(基于inode)与软链接(符号链),保护机制包括口令、加密及访问控制列表(ACL)。最后,文件系统层次结构从用户接口到设备管理,虚拟文件系统(VFS)统一不同文件系统接口,挂载机制实现跨系统兼容。

操作系统复习笔记(V):I/O系统

本文系统概述了计算机I/O管理核心内容。I/O设备按使用特性(人机交互、存储、网络)、传输速率(低速、中速、高速)及交换单位(块设备支持随机读写,字节设备用中断驱动)分类;控制器通过寄存器实现命令识别、状态报告及数据交换。I/O控制方式从程序直接控制(CPU轮询)到中断驱动(并行工作)、DMA(直接内存访问,块传输)及通道控制(硬件执行通道程序),逐步降低CPU干预,提升效率。I/O软件分用户层(系统调用接口)、设备独立性软件(实现调度、保护、分配、缓冲)、驱动程序及中断处理。磁盘管理涵盖结构(柱面/盘面/扇区)、调度算法(如SCAN、C-SCAN优化寻道)及SSD特性(基于闪存,支持随机访问,需磨损均衡)。

JVM基础:内存结构与垃圾回收

本文详细介绍了JVM内存结构与垃圾回收机制。内存结构分为线程共享(堆区、方法区)和线程私有(程序计数器、JVM栈、本地方法栈)区域,其中堆存储对象,方法区存放类元信息(JDK8后移至元空间),直接内存用于NIO优化。垃圾回收基于可达性算法,通过GC Root(如线程对象、类加载器等)判断对象存活,并支持强、软、弱、虚、终结器五种引用类型。回收算法包括标记清除(存在碎片)、复制(高效但空间利用率低)、标记整理(无碎片但效率低)及分代GC(年轻代复制算法+老年代标记整理),主流垃圾回收器有Serial(单线程)、CMS(低延迟)、Parallel(高吞吐)和G1(平衡延迟与吞吐)。

JVM基础:字节码文件与类加载器

JVM是Java虚拟机的核心,负责解释执行字节码、管理内存(含自动GC)和通过JIT编译优化热点代码。其规范支持多种语言运行,常见实现包括HotSpot、GraalVM等。JVM由类加载器、运行时数据区、执行引擎和本地接口组成。字节码文件包含魔数、版本号、常量池等结构,可通过jclasslib、javap或Arthas工具查看。类生命周期包括加载、连接(验证、准备、解析)、初始化等阶段,类加载器采用双亲委派机制保证安全,也可通过自定义类加载器、线程上下文类加载器等方式打破。