自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(533)
  • 收藏
  • 关注

原创 从Intel开发手册看x86指令格式(含手动将指令转化为机器码的方法)

本文介绍了x86汇编指令翻译为机器码的方法,重点讲解了操作码、ModR/M字段、SIB字段的查找和使用。通过7个具体例题,详细演示了mov和add等指令的机器码转换过程,包括寄存器编号查找、寻址方式确定、偏移量和立即数处理等关键步骤。文章还提供了Intel开发手册和在线反汇编工具作为参考,帮助读者理解x86指令编码格式,并验证翻译结果的正确性。

2025-03-24 09:50:52 1454

原创 【x86汇编】C语言的switch&case结构的反汇编分析

push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。

2024-10-29 19:57:40 1794

原创 OS47.【Linux】进程间通信 进程池项目的改进版(1)

本文分析了Linux进程池项目中子进程继承父进程管道写端导致的问题及改进方法。测试发现后创建的子进程会继承更多文件描述符,包括之前创建的管道写端,导致clean_process_pool时waitpid阻塞。提出了两种解决方案:1)倒序关闭子进程管道写端,使read不再阻塞;2)在子进程中主动关闭继承的所有写端。这两种方法都有效解决了进程池中子进程无法正常退出的问题,为进程间通信的管道管理提供了优化思路。

2026-01-28 07:45:00 15

原创 OS46.【Linux】进程间通信 管道的应用场景和进程池项目

介绍如何实现支持管道命令的自制Shell以及进程池项目。主要内容包括:1. 管道应用场景和实现思路,通过fork创建子进程并使用pipe建立通信管道;2. 进程池的实现,预先创建多个子进程并通过管道进行任务分配;3. 两种负载均衡策略(随机选择和轮询)的实现;4. 父子进程间通过管道传递任务码的通信机制;5. 进程池的清理过程,包括关闭管道和等待子进程退出。文章提供了完整的C++代码实现,展示了如何高效管理多个子进程执行任务。

2026-01-27 08:00:00 768

原创 OS45.【Linux】进程间通信 管道通信代码部分(2)

实验研究了Linux管道通信的特性:1. 管道容量在不同内核版本中存在差异(4KB-64KB);2. 管道是面向字节流的通信方式;3. 读写行为会受管道状态影响:空管道时读操作会阻塞,满管道时写操作会阻塞;4. 当读端关闭时,继续写入会触发SIGPIPE信号终止写进程;5. 管道随进程退出自动回收。这些实验验证了管道作为进程间通信机制的关键特性。

2026-01-26 08:00:00 1092

原创 面试题: bss节占可执行文件的大小吗? 在内存中的数据是怎样的?

三个实验探讨了.bss节在可执行文件和内存中的特性。实验1通过汇编代码定义.bss节,使用readelf工具确认.bss节不占用可执行文件空间,仅记录所需大小。实验2通过gdb调试发现.bss节在程序启动时被初始化为0。实验3验证了C语言中未初始化的全局变量和静态变量都存放在.bss节。结论表明.bss节在可执行文件中不占空间,但在内存中会被初始化为0,用于存放未初始化的全局变量和静态变量。

2026-01-23 08:00:00 1142

原创 OS23.5.【Linux】实验: 分页机制下,代码段和数据段的权限和页的权限有关

验证了Linux分页机制下内存页权限控制机制。首先回顾了物理内存权限由页表决定的原理,以及代码段默认只读不可写的特性。通过使用mprotect系统调用和页对齐操作,成功将代码段权限修改为可读可写可执行,并实现了对代码段的直接修改。实验使用/proc/pid/maps验证了权限修改前后的变化,证实了内存页权限与段权限的关联性。结果表明:在分页机制下,内存段的访问权限实际由其所在页的页表权限位控制,通过修改页表权限可以改变段的默认访问特性。

2026-01-21 08:00:00 565

原创 OS40.【Linux】软链接和硬链接

本文摘要: 本文详细介绍了Linux系统中的软链接和硬链接。软链接类似于Windows快捷方式,是一个独立文件,存储目标文件路径,删除不影响原文件;硬链接则与原文件共享inode,删除时需要链接数为0才会真正删除文件。文章还探讨了两者的创建方法、查看方式、删除技巧及应用场景,特别指出目录硬链接数的计算方式(子目录数+2)和系统禁止用户创建目录硬链接的原因(避免环路问题)。最后通过图表对比了两者的核心区别:软链接是路径引用,硬链接是inode共享。

2026-01-19 08:00:00 539

原创 CD71.6.【C++ Dev】二叉树练习题6 (翻转二叉树 、相同的二叉树)

本文包含两个二叉树算法题解:1.翻转二叉树问题,通过前序遍历递归交换每个节点的左右子树指针实现翻转;2.判断相同二叉树问题,采用递归方法比较两棵树的结构和节点值是否完全相同。两个问题都给出了详细的分析思路、完整代码实现和边界条件处理,适用于处理节点数在0-100范围内的二叉树。

2026-01-18 15:56:04 624

原创 从Redis 8.4.0源码看快速排序(1) 宏函数min和swapcode

本文分析min和swapcode宏函数的设计。该宏函数采用类似模板的方式实现类型安全的数组元素交换,通过(n)/sizeof(TYPE)计算交换次数,使用do-while循环完成批量交换。特别指出宏函数外层花括号的必要性,它能避免变量名冲突。文章还通过测试代码演示了swapcode的实际应用,并对比了预处理前后的代码差异。最后讨论了do-while(0)在宏定义中的作用,通过示例说明其能有效解决悬垂else问题,是编写复杂宏函数的良好实践。

2026-01-14 08:00:00 1185

原创 CD71.5.【C++ Dev】二叉树练习题5 (左叶子之和、叶子相似的树)

探讨二叉树遍历中叶子节点处理的两个相关问题。左叶子之和的解法,通过递归遍历二叉树并判断左叶子节点,详细讨论了代码鲁棒性处理,包括空指针判断和父节点判空问题。接着针对变式训练872题"叶子相似的树",提出通过生成叶子序列并比较的方法,证明不同遍历方式(前序、中序、后序)产生的叶子序列相同。文章提供了完整的代码实现和提交结果验证,为处理二叉树叶子节点相关问题提供了实用解决方案。

2026-01-12 08:00:00 1856

原创 我的Chip8模拟器项目(C++,无图形库,Windows 命令行)

本文介绍了一个基于C++实现的CHIP-8模拟器开源项目,该模拟器在Windows终端运行,无需GUI库支持。项目提供了x86和x64版本的可执行文件,用户可通过命令行加载ROM文件运行游戏(如BRIX示例所示)。键盘映射采用CHIP-8原始布局,按ESC键可退出模拟器。文章还推荐了ROM资源下载网站Zophar.net,并展示了游戏运行效果图。该项目适合对模拟器开发和复古游戏感兴趣的开发者学习参考。

2025-12-26 11:23:05 271

原创 纪念人生提交的第一个即将并入Linux内核的补丁

作者分享了提交首个Linux内核补丁的喜悦经历。虽然补丁技术含量不高,但标志着正式参与开源社区开发。文章附上了补丁提交链接和社区讨论记录

2025-12-19 22:40:04 467

原创 OS39.5.【Linux】分析ar命令生成的归档文件的格式

分析Linux/Unix中ar命令生成的归档文件格式。通过十六进制编辑器解析test.a归档文件,发现其包含文件头魔数"!<arch>\n"和60字节的元数据结构体ar_hdr。该结构体存储了文件名、时间戳、权限、大小等元数据,并以`\n结尾。文件内容保持原样未压缩,按偶字节对齐。文章详细解析了各字段含义,包括16字节文件名(以/结尾)、12字节时间戳、6字节UID/GID、8字节权限、10字节文件大小(ASCII形式)等元数据,展示了归档文件的具体存储结构。

2025-12-18 08:00:00 1124

原创 CE16.【C++ Cont】练习题组16(堆专题)

设用sum来存储总和,如果堆顶为奇,正常将堆顶元素加到sum中,之后删除堆顶元素;如果堆顶为偶,看看k是否为正,k如果为正,先用tmp保存堆顶元素,再删除堆顶元素,将除以2后tmp的再入堆,k如果为负,正常将堆顶元素加到sum中,之后删除堆顶元素。录入所有数后,建小堆,由于堆顶是最小的元素,如果只从堆顶取出第k小的元素,那么需要删除堆顶元素(k-1)次,之后堆顶就是第k小,之前删除的元素保留在临时数组中,待打印第k小的元素后将删除过的元素再入堆。,发现超出了int的存储范围!文章中讲过建大堆的算法。

2025-12-12 08:00:00 1020

原创 OS44.【Linux】进程间通信 管道通信代码部分(1)

本文介绍了Linux系统中匿名管道通信的实现方法。通过pipe系统调用创建管道文件,使用fork创建子进程实现父子进程通信。父进程负责读取管道数据,子进程负责写入数据。文章详细讲解了write_pipe和read_pipe函数的实现,包括字符串处理、管道读写操作以及进程同步机制。特别强调了管道通信中父子进程的协同工作关系,以及数据传输过程中用户空间与内核空间的交互流程。最后通过完整代码演示了管道通信的实际应用,展示了父子进程间数据传输的动态过程。

2025-12-09 08:00:00 951

原创 OS43.【Linux】进程间通信 管道通信理论部分

本文摘要:进程间通信(IPC)是不同进程间数据交互的方式,本质是让进程共享同一份资源。操作系统作为第三方提供和管理这些资源,通过系统调用实现资源创建、使用和释放。重点讲解了匿名管道的实现原理:父子进程通过继承文件描述符共享内存级管道文件,实现单向通信。管道通信要求进程间必须存在血缘关系,且建议严格遵循单向通信原则(关闭不使用的端口)。文章还解释了tty的含义,并指出双向通信需使用两个管道。

2025-12-01 08:00:00 668

原创 OS42.【Linux】动态库文件的位置无关、深入分析PLT和GOT

深入探讨动态库和静态库的工作原理。主要内容包括:1) 动态库使用位置无关代码(PIC)技术,通过-fPIC选项编译,使库函数能加载到任意虚拟内存地址;2) 分析ASLR机制使动态库每次加载地址随机化;3) 详细解析PLT(过程链接表)和GOT(全局偏移表)的协作机制,PLT实现延迟绑定,GOT存储动态链接函数地址;4) 通过Cutter和GDB工具验证加载器通过DynamicLoaderOperation修改GOT表数据的过程。文章揭示了动态库加载的核心原理:使用相对地址偏移,通过基地址+偏移量的方式

2025-11-28 08:37:56 931 2

原创 OS41.【Linux】程序的入口地址、可执行文件的位置无关的解释

文章摘要:本文首先回顾了虚拟地址与物理地址的区别,解释了程序编译后内部地址的概念。通过分析可执行文件的ELF文件结构,说明了如何通过readelf命令查看程序入口地址。重点比较了位置无关(PIE)和位置相关(no_pie)可执行文件的区别:PIE类型(DYN)在运行时加载到随机虚拟地址(基址+偏移),而传统EXEC类型(no_pie)加载到固定地址。通过gdb调试验证了两种类型在内存中的地址映射差异,为理解程序加载执行机制提供了实践参考。

2025-11-26 08:23:17 690

原创 OS40.【Linux】动态库和静态库 自制动态库

文章摘要:文章探讨了C语言静态库和动态库的实现与使用问题。在静态库部分,通过除法函数示例展示了错误处理机制(如除零错误)的实现方式,并分析了Linux默认从右向左传参带来的问题及解决方法。动态库部分详细讲解了制作过程、权限要求、加载机制和共享特性,介绍了四种让操作系统找到自制动态库的方法:环境变量设置、启动脚本修改、系统目录拷贝和ldconfig配置。文章还涉及汇编代码分析、Pascal调用约定对比等底层细节,为开发者提供了全面的库文件开发实践指导。

2025-11-19 08:33:05 904

原创 OS39.【Linux】动态库和静态库 自制静态库

介绍Linux下静态库的制作和使用方法。主要内容包括:1)回顾静态链接原理,对比动态链接;2)演示如何创建静态库文件(.a文件)并通过Makefile自动化构建;3)详细讲解发布静态库的正确方式,包括头文件和库文件的组织;4)重点说明使用静态库时的三个关键参数:-I指定头文件路径、-L指定库路径、-l指定库名;5)补充gcc的默认搜索路径机制。文章通过多个代码版本逐步解决静态库使用中的常见问题,最终给出了完整的静态库编译命令示例。

2025-11-11 08:13:41 835

原创 CC56.【C++ Cont】差分算法

摘要:本文介绍了差分数组的概念及其在一维数组中的应用。差分是前缀和的逆运算,可将区间修改操作优化为O(1)时间复杂度。通过模板题展示了两种解法:暴力解法(O(n^2))和差分数组优化法(O(n))。重点讲解了差分数组的性质:区间[l,r]加k等价于差分数组d[l]+k和d[r+1]-k,最后通过前缀和还原原数组。给出两种实现方式(创建两个数组或仅用差分数组)并比较了优劣,指出差分适用于批量操作后统一查询的场景,但需注意long long防溢出和数据边界处理。

2025-11-07 08:00:00 678

原创 L60.【LeetCode题解】面试题 08.06. 汉诺塔问题

汉诺塔问题递归解法解析 本文详细分析了汉诺塔问题的递归解法。汉诺塔问题要求将N个盘子从起始柱A移动到目标柱C,遵循三个规则:每次移动一个盘子、只能移动最上面的盘子、小盘子不能放在大盘子下面。 关键点: 当n=1时,直接移动盘子 当n>1时,分解为三个步骤: 将n-1个盘子从A移动到B(C为辅助) 将第n个盘子从A移动到C 将n-1个盘子从B移动到C(A为辅助) 通过递归调用和归纳法,可以将问题不断分解为更小的子问题。文章提供了C++实现代码,适用于LeetCode平台,时间复杂度为O(2^n-1)。该

2025-11-04 08:07:28 726

原创 CC54.【C++ Cont】二维前缀和(模版题+矩阵区域和题)

本文介绍了两种处理二维矩阵区域和的方法:暴力解法和前缀和优化。暴力解法采用双重循环直接计算每次查询的区域和,时间复杂度较高易超时。前缀和方法通过预处理构建前缀和矩阵dp[i][j],利用状态转移方程dp[i][j] = arr[i][j] + dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1],将每次查询的时间复杂度降至O(1)。文章还以LeetCode矩阵区域和问题为例,展示了如何利用前缀和处理边界条件,通过max/min函数管控有效区域范围,并给出了四种不同边界情况下的计算公式

2025-10-31 07:45:00 2010

原创 OS38.【Linux】EXT2文件系统实验1 格式化+超级块的重要性

本文通过两个实验探讨EXT2文件系统的关键特性。实验1详细演示了在Linux下格式化U盘为EXT2文件系统的过程,包括卸载挂载点、备份数据等操作,并分析了文件系统结构参数。实验2重点研究了超级块的重要性,通过人为破坏主超级块验证了备份超级块的恢复机制,介绍了使用e2fsck和dd命令从备份超级块恢复主超级块的方法。研究揭示了EXT2文件系统中超级块的关键作用和备份机制,为理解文件系统损坏与修复提供了实践参考。

2025-10-28 07:45:00 915

原创 OS37.【Linux】简单理解EXT2文件系统(2)

浅析了EXT2文件系统的核心机制。首先介绍了i_block数组的三级索引结构,推导出单个文件最大存储容量的计算方法;其次详细阐述了inode和block位图的管理机制,解释了删除文件时仅需修改位图而无需清空数据块的原理。文章还分析了文件系统"满"的三种情况,并重点讲解了超级块和组描述符的关键作用。在文件操作层面,系统性地揭示了新建、删除、查找和修改文件时内核的底层处理流程,特别强调了目录作为特殊文件的实现方式及其inode查找机制。最后,针对文件访问效率问题,介绍了EXT

2025-10-25 08:00:00 789

原创 CC55【C++ Cont】枚举算法之枚举对象的方法(NOIP2016 普及组 T2)

分析NOIP2016普及组T2题目,探讨了四种计算两个日期间回文日期的算法。方法1直接枚举所有数字效率最低;方法2枚举合法日期并判断回文,耗时1.05s;方法2.5优化日期拆分和回文判断,耗时95ms;方法4通过枚举月份和日期生成回文年份,仅需44ms且无需特别处理闰年情况。最终推荐方法4,其时间复杂度最优,代码简洁高效。

2025-10-23 08:00:00 702

原创 OS36.【Linux】简单理解EXT2文件系统(1)

Ext2文件系统采用分层结构管理磁盘数据,主要包括启动块、数据块、inode表等区域。数据块以4KB为单位存储文件内容,inode表则记录文件属性(不含文件名),每个inode有唯一编号。文件系统通过三级索引机制管理大文件:前12个直接索引指向数据块,第13个为二级索引(指向块号表),第14个为三级索引(多级间接寻址)。关键结构体ext2_inode包含文件权限、大小、时间戳等信息,其中i_block数组实现索引功能。inode数量在格式化时固定,无法动态调整。这种设计通过多级索引平衡了小文件存储效率和大文

2025-10-20 08:00:00 1821

原创 L59.【LeetCode题解】面试题 16.26. 计算器(方法1: 中缀转后缀+计算后缀表达式)

介绍如何计算逆波兰表达式(后缀表达式)和中缀表达式的方法。首先通过LCR036题解析了后缀表达式的计算过程:使用栈结构,遇到数字入栈,遇到运算符则取出栈顶两个元素计算后结果入栈。接着讲解了面试题16.26中将中缀表达式转换为后缀表达式的算法,包括处理运算符优先级的问题,通过建立运算符优先级映射来确保运算顺序正确。最后给出了完整的代码实现方案,包括字符串解析、中缀转后缀和最终计算的完整流程。

2025-10-17 08:00:00 2008

原创 CD81.【C++ Dev】判断二叉搜索树是否是红黑树

介绍如何通过前序遍历构建二叉搜索树,并验证其是否为红黑树的方法。首先通过LeetCode 1008题练习构建二叉搜索树,使用单调栈算法处理前序序列中的递增和递减关系。随后针对PAT 1135题,在构建二叉搜索树的基础上,重点实现红黑树的四个性质验证:根节点黑色、无连续红节点、所有路径黑节点数量相同等。文中详细分析了算法思路,包括递归验证黑节点数的实现,并提供了完整的C++代码实现和提交结果。该解决方案适用于处理输入的前序遍历序列,能够高效判断给定的二叉搜索树是否符合红黑树性质。

2025-10-15 07:45:00 1416

原创 CD80.【C++ Dev】模拟实现红黑树的插入

本文主要介绍了红黑树的插入操作实现。首先回顾了红黑树的性质,包括根节点和空节点为黑色、无连续红节点、每条路径黑节点数相同等。然后对比了AVL树和红黑树的特性差异,指出红黑树通过牺牲部分平衡性换取更好性能。重点讲解了插入节点的三种情况处理:1)当uncle节点为红色时进行变色处理;2)当uncle节点为黑色或不存在时进行旋转操作;3)详细分析了各种旋转情况下的抽象图例。最后给出了红黑树插入操作的代码实现框架,包括节点结构、插入函数和测试方法。文章强调红黑树通过颜色标记和旋转操作来维持平衡,相比AVL树具有更好

2025-10-11 08:00:00 703

原创 OS35.【Linux】文件系统前置知识

介绍磁盘存储和文件系统的基本原理。首先将文件分为打开和未打开两类,指出存储文件需要保存文件内容和属性。然后详细讲解了磁盘的物理结构,包括盘片、磁头等组件,并解释了磁盘利用磁性存储数据的原理。在抽象层面介绍了CHS/LBA两种寻址方式,说明扇区是磁盘访问的基本单位。最后初步探讨了文件系统的概念,指出操作系统通过分区管理硬盘空间,每个分区可以用结构体描述其地址范围,而文件系统的核心任务就是管理分区中的文件。文章还附有机械硬盘工作原理的视频链接作为补充学习资源。

2025-10-09 08:00:00 1020

原创 OS34.【Linux】文件IO (3) 缓冲区的补充和模拟实现fopen、fwrite、fclose函数

探讨C语言和操作系统缓冲区的区别与作用,解释了缓冲区存在的必要性(提高效率和格式化支持),分析了代码运行结果与缓冲策略的关系。通过模拟实现fopen、fwrite、fclose函数,详细讲解了如何为FILE结构体添加缓冲区,并比较了不同刷新策略的效率差异。实验证明,减少刷新次数(即减少系统调用)能显著提升效率,这解释了为什么缓冲区机制对程序性能至关重要。文章还包含缓冲区的三种刷新策略(立即刷新、行缓冲、全缓冲)的具体实现细节。

2025-09-29 08:00:00 702

原创 L58.【LeetCode题解】模拟算法习题集2(数青蛙)

提出两种方法计算字符串中模拟青蛙鸣叫所需最少青蛙数量。方法1使用青蛙数组记录每只青蛙的状态,通过遍历字符串匹配字符序列"croak",但时间复杂度较高。方法2优化为使用croak[5]数组统计各状态青蛙数量,通过检查前驱字符数量确保序列有效性,降低时间复杂度。两种方法均需处理无效字符串情况(如字符不匹配或序列不完整时返回-1),方法2通过位运算检查最终状态确保正确性。

2025-09-25 10:08:28 1109

原创 OS33.【Linux】文件IO (3) 缓冲区

本文探讨了C语言缓冲区的相关概念,通过对比不同示例代码的运行结果,分析了缓冲区在文件操作中的作用。文章指出C语言提供的缓冲区与操作系统内核缓冲区不同,并通过实验验证了close(1)会阻止缓冲区内容输出到屏幕。同时介绍了FILE结构体的组成,特别是其中的文件描述符字段。最后讨论了exit和_exit函数的区别,以及C语言缓冲区的三种刷新策略:行缓冲、全缓冲和无缓冲,并说明不同输出设备对应的刷新机制。文章为理解C语言文件操作和缓冲区机制提供了详细的技术分析。

2025-09-24 07:45:00 913

原创 CD78.【C++ Dev】以AVL项目的bug讲讲调试技巧

介绍AVL树实现中遇到的空指针访问错误及其调试过程。项目源代码包含AVLTree.h和main.cpp,在插入数据时出现RotateLight函数空指针异常。通过调用堆栈回溯、监视窗口查看变量和设计辅助函数is_balance()等方法定位问题。重点展示了如何使用条件断点、内联汇编和__debugbreak()进行调试,最终发现旋转操作后平衡因子未正确更新的问题。文中还提供了LeetCode平衡二叉树问题的解法,并给出了完整的调试代码和修复方案。

2025-09-23 07:45:00 1516

原创 【Linux】LRU缓存(C语言模拟实现)

介绍C语言实现LRU缓存算法的方法,重点讲解了如何结合uthash哈希表库来优化性能。主要内容包括:1) uthash哈希表的基本操作(创建、添加节点、查找、销毁);2) LRU缓存的实现思路,使用双向链表维护访问顺序;3) 详细代码实现,包括缓存初始化、get/put操作和内存释放;4) 提交结果展示。该实现通过哈希表快速查找,结合链表维护访问顺序,达到了O(1)时间复杂度的操作效率。

2025-09-22 08:00:00 688

原创 OS32.【Linux】文件IO (3) 重定向和理解“一切皆文件“

本文主要探讨Linux系统中的重定向机制及其底层实现原理。文章首先回顾了文件描述符和read系统调用的基本概念,详细解释了重定向的两种实现方法:通过close+open组合以及使用dup2系统调用。随后分析了输入/输出重定向在shell中的具体应用,包括如何为自制shell添加重定向功能。文章深入剖析了"Linux一切皆文件"的设计理念,通过虚拟文件系统(VFS)和文件操作结构体(file_operations)解释了不同设备的统一访问机制。最后,从面向对象的角度解读了Linux文件系统

2025-09-19 08:00:00 1010

原创 【Linux】LRU缓存(C++模拟实现)

本文介绍了LRU缓存的设计与实现。LRU(最近最少使用)是一种常见的缓存淘汰算法,当缓存满时淘汰最近最少使用的数据。文章以LeetCode 146题为例,提出使用哈希表(unordered_map)存储键值对,双向链表(list)维护访问顺序的高效实现方案:链头存放最新访问数据,链尾存放LRU数据。通过哈希表存储链表迭代器,实现O(1)时间复杂度的查找和更新操作。具体实现包括:1)get操作需将被访问数据移至链头;2)put操作区分键存在(更新值)与不存在(插入新值,若缓存满需先删除链尾数据)两种情况。文章

2025-09-16 08:52:47 1084

原创 OS31.【Linux】文件IO (2) 文件描述符

介绍Linux文件IO中的文件描述符机制。首先回顾了文件描述符的基本概念,指出操作系统通过struct file结构体管理文件属性,并用链表组织打开的文件。重点分析了文件描述符的分配规则:默认从3开始编号,0-2被stdin、stdout、stderr占用;系统会寻找最小的未使用数组下标作为新文件描述符。通过实验验证了FILE结构体包含_fileno成员,与文件描述符关联。最后解释了文件引用计数机制,说明只有当引用计数归零时内核才会真正关闭文件。文章还提供了查看标准流文件描述符的两种方法,并建议进一步

2025-09-14 09:29:19 651

C语言指针文章(H)的入口函数的测试程序

入口函数的测试程序

2025-04-24

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

2025-04-19

8086汇编用栈来分解并显示数字的bin文件

用栈来分解并显示数字文章的bin文件,可以写入vhd

2024-10-26

C语言模拟试卷1第一大题要点提示

C语言模拟试卷1题目+答案

2024-10-01

汇编实现从1加到1000的bin文件

这是汇编实现从1加到1000文章的配套资源,bin文件写入主引导扇区后可在VirtualBox上运行

2024-09-14

汇编语言在虚拟机中输出“Hello World!”的bin文件

bin文件

2024-09-05

VS 2022的float.h

float.h详细内容

2024-07-15

VS 2022的limits.h

limits.h详细内容

2024-07-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除