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

C/C++后端开发面试表述、技术点摸底——基础组件篇

前端时间笔者系统学习了基础组件中的池式结构(包括线程池、内存池、连接池),原子操作,锁,无锁队列,网络缓冲区,定时器设计,分布式锁,有些内容笔者已经总结整理成了相关技术文档,读者若感兴趣可以翻看笔者的个人空间进行查阅,剩余没写的笔者会在近期总结整理。

本文是笔者在阶段性学习后进行的一次全面总结整理,旨在对之前没整理到的技术细节以及面试常问的问题表述进行查漏补缺,并且分享给大家。

一、线程池

问:聊一聊线程池(这种问题问的很泛,要先回答重点,像这种很泛的问题如果都能描述的到位,说明掌握的不错)

围绕三个方面展开:线程池是什么?解决了什么问题?运行原理是什么?

线程池是一个维护着固定数量线程的池式结构,池式结构的主要作用是复用资源。

线程池解决了什么问题:1、用户线程可以将耗时任务交给线程池中的线程进行处理,避免了用户核心线程的阻塞;2、避免了线程的频繁创建和销毁,从而影响系统性能。

线程池的运行原理:大部分我前面文章都说了,这里补充一个需要优先表述的重点:用户线程和线程池对应一个生产者-消费者模型,因此需要一个任务队列,生产者线程(用户线程)往里push任务,消费者线程(线程池中线程)从里pop任务来消费,当队列为空时阻塞消费者线程,解放cpu。

可能的追问:线程池中线程的数量如何确定?

回答可参见之前的线程池文章,如果没追问可以自己视情况决定是否自己额外补充。

二、内存池

问:聊一聊内存池

继续围绕这三方面展开:内存池是什么?解决了什么问题?运行原理是什么?

内存池是一个维护着预分配内存块的池式结构,池式结构的主要作用是复用资源。

内存池解决了什么问题:1、避免了用户频繁的申请和释放内存操作,提高系统性能;2、集中管理内存块,避免了内存泄漏和内存碎片的问题。

内存池的运行原理:前面的文章已有介绍,回答时可以主要讲内存池的数据类型、构成等。

可能的追问1:内存碎片是什么?如何产生?(这里可以细讲内部碎片和外部碎片,下面只讲了外部碎片)

内存碎片是指在内存管理过程中,随着内存分配和释放,系统中出现的无法利用的空闲内存区域。碎片可能会影响程序的性能和内存使用效率,甚至导致系统崩溃。

内存碎片产生的原因是当系统进行动态内存分配(如 mallocnew)时,操作系统会在空闲内存区域中找到一个合适的空闲块并分配,这可能导致分配的内存块之间存在很小的未分配的内存块,但其大小不满足后续的内存申请。

可能的追问2:讲一下malloc的实现细节

malloc是一个库函数,通过操作系统的底层系统调用来向程序分配内存。malloc自己本身也维护着一个内存池,malloc函数本身是暴露给用户使用的接口。当malloc分配的内存<128k时,通过brk系统调用从堆区分配内存(优先从malloc内存池中分配以减少系统调用,free后还给内存池,可复用);当>128k时,通过mmap系统调用从文件映射区分配内存(每次都会系统调用,free后归还操作系统)。

malloc分配的是虚拟内存,若分配的内存没有被访问,则不会映射到物理内存,即不访问就不占用物理内存,访问则通过缺页异常机制从磁盘加载缺失的页面,从而建立虚拟内存和物理内存的映射关系。

可能的追问3:malloc自身已经维护一个内存池,为什么还要在用户态自己设计一个内存池?

因为malloc的内存池是通用的设计,并不一定满足用户在某个业务场景下的最优需求,因此可以针对性优化。

三、连接池

问:聊一聊连接池

同样分三点阐述:连接池是什么?连接池解决了什么问题?连接池的运行原理?

连接池一般都是指数据库连接池,可以以MySQL举例,即连接池是一个维护着一定数量的MySQL连接的池式结构,池式结构的主要作用是复用资源。

连接池解决了什么问题:1、避免了频繁建立和断开连接所需要的耗时操作(tcp三次握手建立连接,MySQL认证、sql执行、tcp四次挥手断开连接);2、统一的连接管理,避免数据库连接泄露。

运行原理:具体可参见连接池的文章,这里补充一步表述:同步连接池是一个链接绑定一把锁,异步连接池是一个连接绑定一个线程。

先写到这儿,未完待续……


文章转载自:

http://A2Od8XdK.crkmm.cn
http://bVSl2hSN.crkmm.cn
http://cAddseOB.crkmm.cn
http://2vXH9iwc.crkmm.cn
http://bz5Bii46.crkmm.cn
http://EwcezLd3.crkmm.cn
http://FVBuRbMT.crkmm.cn
http://XYVDqZqQ.crkmm.cn
http://FGxUy3Jn.crkmm.cn
http://NITQdHeq.crkmm.cn
http://ItnLFc6e.crkmm.cn
http://ZdTh3Cy7.crkmm.cn
http://d8RbHaPv.crkmm.cn
http://pyzKUHuF.crkmm.cn
http://shEx9nd9.crkmm.cn
http://LQXqEzlW.crkmm.cn
http://yrCG1HZC.crkmm.cn
http://W3wggUQ3.crkmm.cn
http://kEQTBNyE.crkmm.cn
http://GqE7dbve.crkmm.cn
http://t9LqZvzJ.crkmm.cn
http://HBrZ7KdI.crkmm.cn
http://XEe3n4HV.crkmm.cn
http://JBBh4hTi.crkmm.cn
http://NXx3jGeN.crkmm.cn
http://PfsBo8W0.crkmm.cn
http://zbhZvmyC.crkmm.cn
http://qmYWQEwP.crkmm.cn
http://2oM1K68m.crkmm.cn
http://pl34FHmv.crkmm.cn
http://www.dtcms.com/a/36140.html

相关文章:

  • VM C#脚本 调用命令行 以python为例
  • Python在大数据AI领域的优势分析【为什么使用Python开发】
  • git设置本地代理
  • 基于深度学习的SSD口罩识别项目完整资料版(视频教程+课件+源码+数据)
  • 矩阵乘积态简介
  • 设备能够连接WiFi,能ping通百度,但是网页无法打开显示没有网络
  • 力扣leetcode 21. 合并两个有序链表 递归 C语言解法
  • 如何生成traceid以及可视化展示
  • 【Java毕业设计】商城购物系统(附源码+数据库脚本)
  • Directed acyclic graph [DAG]有向无环图 应用场景汇总与知名开源库实现细节说明
  • Junit+Mock
  • Tag标签的使用
  • 一篇文章学懂Vuex
  • 汽车4S行业的信息化特点与BI建设挑战
  • Docker 的安全配置与优化(一)
  • deepseek 导出导入模型(docker)
  • GO 进行编译时插桩,实现零码注入
  • 数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
  • Unity制作游戏项目——Unity项目如何导出安装包(Inno Setup Compiler的使用)——附有Inno Setup Compiler软件安装包
  • 利用开源AI智能名片2+1链动模式S2B2C商城小程序构建企业私域流量池的策略与实践
  • 尚硅谷爬虫note010
  • PostgreSQL:更新字段慢
  • 在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)
  • Vue03
  • 20250223下载并制作RTX2080Ti显卡的显存的测试工具mats
  • Java数据结构第十三期:走进二叉树的奇妙世界(二)
  • git branch
  • Kafka集群性能测试实战指南:从规划到验证,全面掌握高效测试方案
  • 基于deepseek的AI知识库系统搭建
  • STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)