当前位置: 首页 > news >正文

面经总结池

一.线程池

1.线程池为什么要动态扩容

线程的创建开销大
线程的创建和销毁本身是有较大系统开销的。如果每来一个任务都新建线程,会频繁消耗CPU和内存资源,影响系统性能。动态扩容可以在任务量增加时适当增加线程数,避免频繁创建销毁线程,提高效率。

线程占用内存较大
每个线程都会占用一定的内存(如栈空间),线程数过多会导致内存消耗大,业务可用内存变少,甚至引发OOM。动态扩容可以根据实际任务量合理控制线程数量,避免内存资源被大量空闲线程占用。

线程的上下文切换开销
线程数过多时,CPU需要频繁进行线程上下文切换,带来额外的性能损耗。动态扩容可以在高并发时适当增加线程数,但不会无限制扩展,避免因线程过多导致的频繁切换,保证系统整体性能。

服务器的锯齿状负载
服务器的负载通常是波动的,有高峰和低谷。固定线程数无法适应负载变化,容易在高峰时处理不过来、低谷时资源浪费。动态扩容可以根据负载变化自动调整线程数,既能应对高峰压力,又能在低谷时节省资源。

2.线程池是怎么实现动态扩容的?

任务队列监控
当有新任务提交到线程池时,如果发现当前所有线程都在忙,且任务队列长度超过一定阈值,线程池就会自动创建新的工作线程,直到达到设定的最大线程数。

线程回收机制
动态扩容的线程在空闲一段时间后(比如通过条件变量等待超时),如果没有新任务,就会自动退出,释放资源,避免线程长期空闲造成资源浪费。

参数配置
一般线程池会设置核心线程数、最大线程数和线程空闲存活时间等参数。线程池会根据任务压力和这些参数动态调整线程数量。

实现方式
在C++中,常见的做法是用std::thread结合任务队列和条件变量实现线程池的动态扩容和回收。也有一些开源库(如ThreadPool、BS::thread_pool等)已经支持动态扩容。

 二.内存池(nginx内存池模块)

1.为什么nginx要设计内存池模块?

nginx高性能的一个关键点是减少内存分配和释放的系统调用次数。内存池可以批量分配和回收内存,降低碎片,提高分配效率,适合nginx这种高并发、短连接的场景。

 2. nginx内存池的基本原理是什么?

nginx内存池会预先分配一块较大的内存区域,后续小块内存分配直接在这块区域上进行,避免频繁调用malloc/free。释放时可以一次性回收整个内存池

3.nginx内存池如何处理大块内存分配? 

对于大于预设阈值(如4K)的内存分配,nginx不会从内存池分配,而是直接调用系统的malloc分配,并单独管理,释放时也单独释放。

4..nginx内存池如何释放内存? 

内存池释放时,不会逐个释放小块内存,而是直接释放整个内存池分配的内存块和所有大块内存,效率很高。

5. nginx内存池如何避免内存碎片? 

通过统一管理和批量分配,nginx内存池可以有效减少内存碎片,提升内存利用率。

6. nginx内存池适合什么场景? 

适合生命周期明确、短时大量分配和释放的场景,比如HTTP请求处理、连接管理等。

 三.连接池(mysql连接池)

1. 为什么要用MySQL连接池?

MySQL连接的建立和释放开销很大,连接池可以复用已有连接,减少频繁创建和销毁连接的性能损耗,提高系统吞吐量。

2. 连接池的核心参数有哪些? 

常见参数有:最小连接数、最大连接数、初始连接数、最大空闲时间、最大等待时间、获取连接超时时间等。

3. 连接池的工作原理是什么? 

应用请求数据库时,从连接池获取空闲连接,用完后归还连接池。没有空闲连接时可等待、阻塞或抛出异常,具体行为由配置决定。

4. 连接池如何处理连接泄漏? 

可以通过设置连接最大使用时长、检测连接归还、定期回收长时间未归还的连接等方式防止连接泄漏。

5. 连接池如何保证连接可用性? 

连接池会定期检测连接的健康状态(如执行简单SQL),发现不可用则销毁并新建连接,保证连接池中都是可用连接。

 

http://www.xdnf.cn/news/1022833.html

相关文章:

  • Trae国内版使用技巧
  • 通关JUC:Java并发工具包从入门到精通 | 深度源码解析​
  • 720云vr全景怎么制作?720全景制作费用?
  • 什么是PostCSS
  • 【Python 进阶系列】第4篇:初探 Python Pandas 数据分析的世界
  • 数理化学习杂志社数理化学习杂志数理化学习编辑部2025年第3期目录
  • 习惯养成、亲子互动、分龄对话,声网AI撑起儿童产品三大核心
  • 基于通义灵码2.5的智能天气预警系统开发全记录
  • Data URI Scheme 详解:将数据嵌入 URL 的技术方案
  • 5、Spring AI(MCPServer+MCPClient+Ollama)开发环境搭建_第一篇
  • shell(2)
  • Mysql官方下载地址
  • AndroidStudio下载gradle依赖很慢的解决方法之一
  • LeetCode 704 二分查找 Java
  • 如何关闭WordPress中的评论通知
  • PostgreSQL的扩展moddatetime
  • 数据结构与算法:贪心(一)
  • 性能测试报告怎么写?要包括哪些内容
  • RAG详解
  • 26考研 | 王道 | 计算机组成原理 | 五、中央处理器
  • Linux重置root用户密码
  • 基于springboot旅游管理系统+源码+文档+视频
  • 快递接口调用选择:快递鸟、快递100、阿里云大对比
  • Mybatis-增删改查-删除操作
  • 完美解决openpyxl保存Excel丢失图像/形状资源的技术方案
  • UE5场景漫游——开始界面及关卡跳转
  • 勒贝格测度、勒贝格积分
  • 如何实现一个登录功能?
  • Go语言中的可重入函数与不可重入函数
  • 30个供应链指标与计算公式汇总,直接套用