- 博客(50)
- 收藏
- 关注
原创 CPU资源争夺大战:内核的分配机制
本文深入探讨了操作系统内核如何管理CPU资源的分配与调度。文章首先分析了CPU资源稀缺性与多任务需求之间的矛盾。随后详细介绍了五种经典调度算法:先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)、优先级调度和完全公平调度器(CFS),分析了各自的优缺点及适用场景。文章还揭示了上下文切换带来的性能损耗,并提出了减少切换的优化方法。最后指出,内核调度本质上是在公平与效率等多重因素间寻找平衡的艺术,这种机制仍在不断演进以更好地满足计算需求。
2025-10-19 17:11:37
769
原创 揭秘多态的底层机制:虚函数表背后的高效奥秘
C++多态机制通过虚函数表(vtable)实现动态绑定,其核心是运行时通过虚指针(vptr)查找函数地址。vtable是类级别的只读函数指针数组,存储在.rodata段。单一继承时,派生类vtable会替换重写函数地址,保留未修改函数;多继承时,派生类包含多个vtable,新增虚函数存储在第一个基类vtable中。vtable的生成分为编译期(分析虚函数)、链接期(合并修正)和运行期(动态查找)三个阶段,通过O(1)复杂度实现高效多态调用,同时解决了继承中的函数重写问题。
2025-10-16 21:14:11
796
原创 中级软件设计师考试选择题——计算机网络典型真题
本文系统介绍了OSI网络模型的七层架构,重点解析了物理层、数据链路层、网络层和应用层的核心功能与主要设备。文章还详细讲解了TCP/UDP协议区别、电子邮件系统(SMTP/POP3)、IP地址查询顺序、DHCP协议等关键技术,并提供了实用的网络故障排查方法(如ipconfig命令)和路由查找原则(由近及远)。最后指出IPv6的128位地址空间解决了IPv4地址不足的问题。全文通过分层解析和实例说明,帮助理解计算机网络的核心概念和运作机制。
2025-10-12 18:29:02
880
原创 提高前端开发效率的利器:VUE常用组件及应用
菜单栏下面的轮播图和各个商品需要采用遍历的方式生成,依赖 Element Plus 的 el-carousel、el-row、el-col、el-card 等组件实现,使用轮播图容器el-carousel,遍历 bannerArr 数组渲染轮播项,固定高度 240px;el-row/el-col为24列栅格系统布局商品,span="6" 表示每列占 1/4 宽度(4 个商品 / 行)商品卡片容器el-card,包含商品图片、标题、价格,原价划掉,现价标红。一、基础 UI 组件:构建页面骨架的核心。
2025-09-27 20:40:46
980
原创 CSS网页设计实战——车辆购物页面
本文介绍了一个电脑购物页面的HTML和CSS实现方案。页面采用分块布局,分为上下两层共六个区块。上层左右两侧展示主打产品,包含产品图片、标题、参数说明和价格;下层左侧为分类导航(电脑整机、配件、外设等无序列表),右侧为三个相似的产品卡片。通过CSS设置公共样式(清除默认边距、链接样式等),并针对不同内容区块(标题、简介、价格)分别定义样式。重点处理了图片定位、文字排版和响应式布局,最终实现了一个结构清晰、样式统一的电脑产品展示页面。
2025-09-23 20:43:19
443
原创 Redis 缓存系统的三大“杀手”:穿透、击穿与雪崩 — 从原理到防御之道
本文分析了Redis数据库常见的三种缓存问题:缓存穿透、缓存击穿和缓存雪崩。缓存穿透是指查询不存在的数据导致请求直达数据库;缓存击穿是高并发访问失效的热点数据导致数据库过载;缓存雪崩是大量缓存同时失效引发的数据库崩溃。文章提出了针对性的解决方案:对不存在的数据设置空值缓存、使用分布式锁重建热点数据、为缓存设置随机过期时间等。这些问题的本质都是缓存失效导致数据库承受过大压力,需要通过合理设计缓存机制来保护数据库系统。
2025-09-19 20:16:05
829
原创 Redis:内存中的关系型数据库
Redis是一款高性能开源内存数据库,支持持久化,提供字符串、哈希、列表、集合、有序集合等多种数据结构,适用于高并发场景如缓存、会话管理等。其持久化机制包括RDB(定时快照)和AOF(记录操作命令),分别具有快速恢复和更高数据安全性的特点。Redis通过内存存储和高效数据结构显著提升访问速度,与MySQL等磁盘数据库形成互补。不同数据结构适用于特定场景:字符串用于简单键值,哈希存储结构化对象,列表实现队列,集合处理唯一性需求,有序集合支持排序功能。
2025-09-19 10:27:53
764
原创 如何安装Rocky Linux环境
在搭建Linux环境前请务必需要提前安装好VMware workstation pro 17软件。Linux下载链接如下:提取码为1234。接着打开已经安装好的虚拟机,搭建操作系统。
2025-09-16 20:41:38
263
原创 MySQL的底层数据结构:B+树
本文介绍了B树和B+树的基本原理及其在数据库索引中的应用。B树是一种平衡多路查找树,其特点是每个节点包含多个关键字,且所有叶节点位于同一层次。B树的插入和删除操作需保持平衡性,可能涉及节点分裂或合并。B+树是B树的优化版本,主要改进包括:非叶节点仅存储索引信息、叶节点形成有序链表存储完整数据。这种结构使B+树更适合数据库索引,具有更高存储效率、更低磁盘I/O次数(通常3次即可查询千万级数据)和更优的范围查询性能。文章还对比了聚簇索引与非聚簇索引,并解释了回表查询和覆盖索引的概念。
2025-09-16 20:28:48
778
原创 图形化编程:跑酷游戏开发实战
这篇文章介绍了一个基于EasyX图形库实现的简单跑酷游戏开发过程。文章首先说明了游戏的基本机制:玩家通过跳跃和下蹲躲避障碍物,存活时间越长得分越高。然后详细讲解了游戏各个模块的实现: 窗口初始化(800x600大小,白色背景) 游戏对象定义:玩家(包含位置、状态、跳跃速度等属性)和障碍物(位置、类型) 状态管理系统:玩家奔跑、跳跃、下蹲三种状态的切换逻辑 碰撞检测机制:判断玩家与障碍物的接触 游戏循环实现:包括用户输入处理、状态更新、障碍物生成和销毁 图形优化:使用图片资源替代简单矩形,实现更生动的视觉效果
2025-09-15 08:28:43
1120
原创 基于RAG的智能客服系统
《基于RAG的智能客服系统》通过检索增强生成技术,将企业知识库与大型语言模型结合,解决传统客服响应慢、纯AI模型"幻觉"问题。系统采用阿里百炼平台,后端仅需转发请求和知识库数据,前端提供交互界面。测试显示能基于知识库准确回答用户问题,相比本地搭建向量数据库方案更安全高效。阿里百炼通过HTTPS加密、静态存储加密、多租户隔离等技术保障数据安全,其安全性优于多数企业自建方案。
2025-09-12 19:21:24
972
原创 盘点git使用过程中常见问题及其解决方案
也有可能是提交到了错误的分支。首先找到丢失提交的 Commit ID,Git 的 reflog 会记录所有 HEAD 的移动记录(包括 reset、checkout、commit 等),即使提交被 reset --hard 覆盖,也能在 reflog 中找到。如果还是不能推送,问题可能是缓冲区里已经有一个其他提交 (本地有1个提交待推送),但工作目录中还有未暂存的更改(.idea目录下的IDE配置文件)当然也有可能本地分支名称是 master,但远程跟踪的是 origin/ma。
2025-09-12 17:31:35
1300
原创 Spring框架中的常见面试题
模型(Model)、视图(View)和控制器(Controller)。目的是通过这样的设计使程序结构更加简洁、直观,降低问题的复杂度。其中MVC各个组成部分为:视图(View) - UI设计人员进行图形界面设计,负责实现与用户交互,例如html、css、js等都属于这一层的技术控制器(Controller)- 负责获取请求,处理请求,响应结果,在java中充当控制器对象的一般是servlet。模型(Model) - 实现业务逻辑,数据逻辑实现。
2025-09-11 20:11:23
738
原创 搭建JAVA测试环境及常见问题
本文介绍了在Java业务开发中使用Knife4j搭建测试环境的步骤。首先需在pom.xml手动添加Knife4j依赖并刷新,然后在application.properties配置扫描路径等参数。运行项目后访问/doc.html即可验证是否配置成功。文中特别强调要检查controller包路径配置和数据库连接URL的正确性,列举了常见的配置错误案例,如包路径错误导致功能无法显示、数据库名称未更新导致连接失败等问题,提醒开发者注意细节配置。
2025-09-09 18:49:15
369
原创 spring框架中循环依赖问题的解决方式:三级缓存核心源码分析
若未移除二级缓存中 A 的旧引用,当 B 依赖 A 时,会直接获取二级缓存中的旧实例,而不是通过新工厂生成的新实例,导致 A 和 B 引用的不是同一个对象,最终循环依赖处理失败,所以这里remove掉二级缓存的旧的Bean对象是很有必要的。A在创建Bean A的时候发现依赖Bean B,好,实例化放到缓存中,但如果这个时候发生了线程切换,A还没来得及注入属性和依赖,就去执行线程B,那么B在创建Bean B的时候去一级缓存中找,发现有所依赖的Bean A,就拿着这个未完全初始化的Bean A,就会抛出异常。
2025-09-07 11:05:55
494
原创 用spring框架实现简单的MVC业务
为了完成后端和数据库交互的映射,需要创建必要的接口,这里在mapper包里面创建一个NoticeMapper的接口,所有的方法都只是在这声明而不实现,真正实现应该到对应的.xml文件中用SQL语句实现。接下来是真正处理插入业务,在NoticeMapper.xml文件中用SQL语句处理,在这之前先完成一些初始化工作,在namespace中应该填上正确的路径,也就是工程名.mapper.NoticeMapper,填好路径后就是简单的SQL语句,处理插入业务就在专门的insert标签中处理。
2025-09-05 11:46:55
645
原创 从spring MVC角度理解HTTP协议及Request-Response模式
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是一种通信规则,它定义了客户端(如浏览器、手机APP) 和服务器 之间如何交换信息,是用于在万维网(WWW)中传输数据的应用层协议,它定义了客户端与服务器之间如何通信、如何请求资源如网页、图片、视频,以及如何响应请求,是互联网信息交互的通用语言。一、HTTP协议的核心定位:应用层的通信规则在TCP/IP协议栈(互联网的基础通信框架)中,HTTP属于应用层协议,其底层依赖传输层的TCP协议提供可靠的数据传输通道。
2025-09-02 19:31:12
977
原创 Spring框架入门:从IoC到AOP
摘要:Spring框架通过控制反转(IoC)和面向切面编程(AOP)简化Java企业级开发。IoC容器自动管理对象创建和依赖注入,如通过@Autowired实现组件装配;AOP则通过切面处理横切关注点如事务管理。文章通过Person和Cloth示例演示了自动装配过程,并探讨了解决多实现类冲突的@Qualifier方案。此外还介绍了Bean作用域(单例/原型)、生命周期回调及外部配置(@PropertySource)等核心特性,展示了Spring
2025-09-01 20:21:48
688
原创 MySQL语句提高性能的方式
SQL性能优化核心在于减少资源消耗和提升查询效率。文章从查询语句、表结构设计、数据库交互三个维度展开优化建议:在SQL语句层面,应避免SELECT *、前导模糊查询和子查询,合理使用WHERE条件过滤,优化分页查询;在表设计层面,建议按业务拆分数据库,平衡范式化与反范式化,选择合适字段类型;在存储交互层面,推荐使用SSD存储,优化数据页组织方式,减少随机I/O。这些优化方法需结合业务场景和数据特性综合运用,才能实现最佳性能提升。
2025-08-31 12:32:26
813
原创 JAVA程序和MySQL连接的池化技术——连接池的核心源码剖析
通过这一步,验证了连接池 “优先复用空闲连接,必要时创建新连接” 的逻辑。如果是已经连接、空闲的就可以分配给接下来请求连接的使用而无需从未连接的建立连接,如果是已连接、忙碌,再次请求连接时先找有没有其他已连接空闲的,如果没有就从未连接中建立一个连接,但如果已经达到最大值,就只能让这个进程阻塞等待。在申请连接的时候,有可能会需要等待,当等待时间过长的时候,就需要考虑有没有可能是某些占用连接的进程出了问题,那么就有个对连接池中的空闲连接空闲检查与回收定时任务,负责定期清理长期闲置的连接,来维持连接池资源平衡。
2025-08-28 12:09:34
763
原创 MySQL基本语法及与JAVA程序建立连接
建立连接的这个操作,应该放到try括号里面,因为使用的是 try-with-resources 语法(Java 7 引入的特性),编译器会自动在代码块结束后(无论正常执行还是抛出异常)调用资源的。采用预编译SQL不仅能彻底防止 SQL 注入,避免数据泄露、越权等安全事故,还可以缓存执行计划,减少重复解析 / 编译开销,提升高频 SQL 的执行效率,所有涉及用户输入的 SQL 操作(如登录、查询、提交表单)都必须使用预编译 SQL。它属于 窗口函数,在保留原数据细节的基础上,添加汇总信息。
2025-08-26 19:43:24
589
原创 中级软件设计师考试选择题:程序语言基础(典型真题精析)
在编译程序对源程序(以 C 语言为例 )的处理流程中,除语法分析外,词法分析、语义分析、中间代码生成、代码优化、目标代码生成等阶段都涉及变量处理,具体如下,1. 词法分析阶段 :作用**:识别变量相关的词法单元(token),比如识别标识符(变量名、函数名等)。简单说:变量贯穿编译全流程,从词法分析识别名称,到语义分析明确“是什么、在哪里用”,再到中间代码转换、优化,最终生成目标代码的实际操作,每个阶段都围绕变量的“识别 - 语义 - 转换 - 执行”层层处理。解释程序是边解释边执行,不生成目标程序;
2025-08-21 11:43:51
888
原创 JAVA网络编程
客户端状态从 “FIN-WAIT-2” 进入 “TIME-WAIT(时间等待)” 状态,等待一段时间(通常为 2MSL,即两倍的最大报文段寿命,约 1-4 分钟)后关闭连接。客户端收到 ACK 后,从 “FIN-WAIT-1” 进入 “FIN-WAIT-2(等待结束 2)” 状态,等待服务器的 FIN 请求。端口号的作用是:当客户端连接到服务器的 IP 地址后,通过端口号找到服务器上对应的应用程序(如 Web 服务常用 80 端口,FTP 常用 21 端口,此处 8088 是自定义的服务端口)。
2025-08-19 20:19:35
634
原创 JAVA程序并发执行的方式——多线程
每个线程都是占有一定时间片,那么就有一种隐患,取钱判断余额已经够了,正准备修改账户余额的时候时间片结束了,去执行另外一个线程,这时候的余额还是没来得及更新,另一个线程也来取钱,发现余额足够,岂不成非法取款了吗。多线程是现代编程中非常重要的技术,现代CPU都是多核的,单线程只能利用一个核心,多线程可以并行利用多个核心,当一个线程在等待I/O(如网络、磁盘)时,其他线程可以继续执行计算任务,可以将大任务分解为多个小任务并行执行,加快整体处理速度。因此,在高并发系统中,线程安全是必须考虑的核心问题。
2025-08-18 13:22:01
740
原创 JAVA文件管理系统:如何玩转文件操作
在Java编程中,文件管理是一个至关重要的方面,它直接影响着应用程序的可靠性、安全性和性能。文件管理允许应用程序将数据永久保存在磁盘上,而不仅限于内存中的临时存储。确保数据在程序关闭或系统重启后仍然可用。实现配置信息、用户偏好和应用程序状态的长期保存。有效的文件管理可以防止资源泄漏,确保系统资源得到合理分配和释放,避免因文件处理不当导致的系统性能下降。文件作为不同应用程序间数据交换的通用媒介,支持多种数据格式(文本、二进制、XML、JSON等)的读写操作,便于与其他系统或平台进行数据集成。
2025-08-15 19:11:01
809
原创 JAVA实战小项目——输入验证码
数组作为一种引用类型,自然也继承了object类,而在object中的tostring就是转为一串地址,数组类中也没有去重写这个方法,固然使用的还是object中的tostring方法。在string类里面已经封装了一个忽略大小写的比较方法equalsIgnoreCase,直接用起来就很方便,不过有个细节需要注意,应该要让code去调用这个比较方法而不能用input,因为有的用户可能很坏,直接输入一个空的。这样就生成了随机的四位验证码。这时候它显示的不再是它的内容了,而是它的地址,那为什么会这样呢?
2025-08-13 19:14:44
976
原创 JAVA类和对象之继承
是面向对象编程中的核心概念,表示一组具有相同属性和行为的对象的抽象模板。它定义了对象的属性(成员变量)和方法(成员函数)。是类的实例,通过类创建的具体实体,拥有类定义的属性和行为。
2025-08-07 09:38:03
940
原创 JAVA语法基础
JAVA中的方法依旧和C/C++的函数类似,既有相同点,也有一些不同点。返回类型 方法名(参数列表) {// 方法体return 返回值;// 如果返回类型非void语法格式大体上都差不多,但JAVA中还可以指明这个函数是公有的还是私有的像这种函数名相同而参数类型或个数不同叫函数重载,(或者方法重载)出现方法重载时,编译器会自动匹配参数最匹配的那个方法。
2025-08-05 14:33:06
1028
原创 数据存储的底层原理及其计算
按位与:用于掩码操作(如提取特定位)。按位或:用于设置特定位为1。左移/右移:高效实现乘除2的幂运算,常用于性能优化。注意:移位操作需确保位数不超过数据类型位数(如32位整数的移位范围是0-31)。
2025-08-04 13:04:09
1028
原创 初始JAVA,JAVA基本类型和基本运算
Java的八大基本数据类型(Primitive Data Types)分为四类:整数型、浮点型、字符型和布尔型。这些类型直接存储数据值,而非对象的引用。运算符优先级决定了表达式中运算符的执行顺序。优先级高的运算符先于优先级低的运算符执行。若优先级相同,则根据结合性(从左到右或从右到左)决定计算顺序。
2025-08-04 09:04:41
716
原创 List的使用
首先可以知道的是,库里面的list是双向循环链表,那么在定义节点时,就有三个成员,指向上一个节点的prev,指向下一个节点的next和节点本身的数据。和vector一样,list也是一种容器,但vector的迭代器很容易实现,因为vector的物理空间都是连续的,而物理空间不连续的list容器,它的迭代器的实现不简单。在list迭代器中,我们期望他完成++,--,*等操作,而在判断迭代器是否继续走时时,不应该用<来判断,list不连续所以只能用!方法二:使用const引用或const容器。
2025-08-02 14:39:02
198
原创 Vector的实现
不能这样做的原因是这样会导致迭代器失效,_begin指向新空间后,新的_size,_capacity需要通过_size(),_capacity()返回的偏移量来确定位置,而此时_begin已经指向了新空间,_size,_capacity还指向旧空间,试图用两个毫不相关的指针相减显然是荒谬的。在c++标准库里面可以看到它的实现,和我们经常用的数组不同,库里面并不是使用我们熟知的指向首元素的指针+元素个数+容量大小,而是使用了三个指针,分别指向的是,首元素,最后一个元素末尾,容量结束末尾。
2024-08-09 23:49:46
351
原创 string类的模拟实现
接着来看查找,在字符串中查找子串或字符并返回它的下标,查找字符简单,直接挨个挨个去比较,相等就返回该处的下标,找不到则返回npos。类似地,string类里面的迭代器也非常简单,直接返回指向的字符,begin()就让指针指向第一个字符,end()就让指针指向最后一个有效字符的下一个字符,也就是说所有的end()都应该指向的是‘\0’。string作为存储字符串的基本类,根据库里面的描述,字符串是用于存储连续字符的容器,并且库里面已经有相关的函数及其使用,底层也并不复杂,现在来实现一些较为常用的函数。
2024-07-07 00:18:15
570
原创 C++模板
如果是同一个函数,他们call的地址应当是相同的,但这里 Swap(a, b)它call的是Swap<int>的地址,Swap(c,d)它call的是Swap<double>的地址。在类和对象中,类名代表类型,类模板的实例化需要在类模板的名字后面加<>,在将实例化的类型放入<>里面,类模板的名字不是真正的类,真正的类是那个实例化的结果。所以a和c是无法完成交换的,因为他们的类型都无法匹配。交换两个数很简单,可以直接在函数里面交换,但如果不只是int类型,假如要交换的是double类型甚至是自定义类型呢?
2024-02-24 17:32:13
321
原创 new/delete实现的原理
于是大胆猜测,malloc/free可能被封装到某个中间操作符里面,在这里对malloc开辟空间失败返回空指针的方式进行优化,申请空间的步骤完成,然后在调用析构/构造函数,再将这个中间操作符封装到new/delete里面,这样才是C++面向类和对象的编程。一定情况下,delete[],delete,free都可以使用,但这只是少数情况,内存的申请和释放匹配使用不仅可读性更好,也更安全,保险起见,建议申请释放匹配使用。可以明确的说,即使是用free来释放,这里也不会有任何的问题。
2024-02-23 11:17:18
634
1
原创 动态内存管理
对于动态内存的管理,可以使用malloc和free申请和释放空间, 并且对于内置类型它是有能力初始化的,那如果是自定义类型该怎么办,一般成员变量是私有,在外面不能轻易访问,这种方式仅仅只能做到开辟空间而不能初始化。并且,new开辟空间明显会比malloc方便许多,malloc每次开辟空间都要算大小,还要在前面强制类型转换一下,new不需要这些繁琐的步骤,如果是多个对象,直接在[]里面指定对象个数,类型也会自动识别。当new的初始化是不完全初始化,比如这里的int类型,后面的数据都会初始化为0。
2024-02-21 12:30:19
739
原创 数据的存储方式
其实这里的nums和ch1并没有直接指向1和'h'的地址,直接用数组+方括号初始化,中间会先做一次拷贝,在栈区创建一个临时数组后,将常量区上的内容拷贝到这个临时数组里面,最后让nums和ch1指向这个数组,所以nums和ch1一定存在栈区上。当我们向内存主动申请空间的时候,动态开辟的内存无疑是在堆这个区域内申请的,与栈区不同,堆里面的空间不会自动清理,需要我们主动释放,否则将会导致内存泄漏。栈区地址的存储规则是,向下增长,所以这里可以看到,先定义的a变量的地址比后定义的b的地址更大。
2024-02-20 17:16:49
1355
1
原创 friend友元
这既给我们带来了方便,也存在一些弊端:它增加了耦合度,毕竟每一个使用友元的地方都有可能改变原来的私有成员,频繁的使用只会更加破坏封装,所以 友元不宜多用。在类的内部可以随意访问私有成员,类的外部不能随意访问私有成员,但总会有时候我们想要从类外面访问私有成员,每次专门为得到这个成员变量而写一个函数过于繁琐,直接用友元函数会更加方便。另外,在一个类中定义了内部类以后,计算它的大小时,不会计算内部类,因为内部类的存储其实并没有存在外部类中。B可以访问A的成员,但A不能访问B的成员。
2024-02-13 21:31:26
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅