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

C/C++ 面试复习笔记(4)

1.在多线程的 Linux 程序中,调用系统函数(如pthread_create 创建线程、pthread_mutex_lock 锁定互斥锁等)可能会返回错误码。 与单线程环境相比,多线程环境下的错误处理有哪些需要特别注意的地方?请举例说明如何在多线程程序中正确处理这些错误。

错误码的线程安全性:不同线程的错误码是独立的,不能依赖全局的errno变量来处理错误。 例如,pthread_create 函数返回的错误码直接通过返回值获取,而不是通过errno。

资源清理:一个线程出现错误可能需要清理其他线程已分配的资源,避免资源泄漏。比如, 如果一个线程成功创建了互斥锁,但在后续操作中失败,需要在错误处理中释放该互斥锁。

错误传播:需要确定如何将错误信息从一个线程传递到其他相关线程,以便整个程序能做出正确响应。

2.C语言中,sizeof运算符用于计算动态分配的内存空间大小。

答案: 错误

解析: sizeof运算符计算的是类型或变量的静态内存大小,无法用于获取动态分配的内存大小。如果需要获取动态分配内存的大小,必须使用其他方法,如malloc_usable_size() 等平台特定函数。

3.解释 Linux 中的 Swap 空间及其作用

Swap 空间是磁盘上的一块区域,作为物理内存的扩展。其作用主要有:

当物理内存不足时,操作系统会将不常用的内存页从物理内存交换到 Swap 空间,从而释放物理内存供其他程序使用。

支持运行比物理内存容量更大的程序,因为部分数据可以暂时存放在 Swap 空间中。

在系统多任务运行时,当物理内存紧张时,通过 Swap 空间可以保证系统的稳定性,避免因内存不足导致程序崩溃。

4.Linux 内存管理中的伙伴系统是如何工作的,它解决了什么问题?

伙伴系统是 Linux 内核用于管理物理内存页的算法。它将物理内存按照 2 的幂次方大小进行分组,例如 4KB、8KB、16KB 等不同大小的内存块。当内核需要分配内存时,会从最合适大小的内存块组中查找空闲块。如果没有合适大小的空闲块,就会将更大的空闲块分割成两个相等的 “伙伴” 块,直到找到满足需求的块。

例如,要分配一个 8KB 的内存块,若 当前没有 8KB 的空闲块,但有一个16KB 的空闲块,就将 16KB 块分割为两个 8KB 块。 当内存块被释放时,内核会检查其伙伴块是否也处于空闲状态。如果伙伴块空闲,就将它们 合并成一个更大的块,以此类推,不断向上合并,直到无法合并为止。伙伴系统主要解决了 内存碎片问题,通过这种方式能够高效地分配和回收连续的物理内存页,提高了内存的利用率,保证系统能够快速分配到所需大小的连续内存块,尤其是对于内核中对连续内存要求较高的操作(如 DMA 操作)非常重要。

5.在 Linux 中,如何查看某个进程的内存使用详情,包括虚拟内存和物理内存占用情况?

可以使用多种工具来查看进程的内存使用详情。

ps 命令:使用ps -p -o rss,vsize 命令,其中是要查看的进程 ID。rss(Resident Set Size)表示进程实际占用的物理内存大小(单位为 KB), vsize(Virtual Size)表示进程的虚拟 内存大小(单位为 KB)。例如,要查看进程 ID 为 1234 的内存使用情况,命令为ps -p 1234 -o rss,vsize。

top 命令:运行top命令后,按P键以 CPU 使用率排序,按M键则以内存使用率排序。找 到目标进程后,在显示的信息中,VIRT列表示虚拟内存大小,RES列表示物理内存(驻留集 大小)。

pmap 命令:使用pmap 命令,它会详细列出进程的虚拟地址空间映射情况,包括每个 映射区域的起始地址、结束地址、权限、偏移量以及对应的文件或共享库等信息,同时也能 看到每个区域占用的物理内存大小(通过rss字段)。例如pmap 1234会显示进程 ID 为 1234 的内存映射详情。

6.什么是内存颠簸(Thrashing),在 Linux 系统中如何避免或解决内存颠簸问题?

内存颠簸是指系统在频繁地进行内存页的换入换出操作,导致大量的磁盘 I/O,系统性能急剧下降的现象。当系统的物理内存不足,而进程对内存的需求又不断变化时,就容易出现内存颠簸。例如,一个进程频繁地访问不同的内存页,而这些页在内存中频繁地被换出和换入。

在 Linux 系统中,可以通过以下方法避免或解决内存颠簸问题:

增加物理内存:如果物理内存不足是导致内存颠簸的主要原因,增加内存条可以直接提 高系统的可用内存,减少页交换操作。

调整 swappiness 参数:swappiness参数控制着系统将内存页交换到磁盘交换空间(swap) 的倾向程度,取值范围是 0 - 100。可以通过修改/etc/sysctl.conf 文件,添加或修改 vm.swappiness = (例如 vm.swappiness = 10)来降低系统使用 swap 的频率,让系统更倾向于使用物理内存。修改后执行sysctl -p使配置生效。 优化进程内存使用:检查并优化应用程序的内存使用情况,避免不必要的内存占用。例 如,及时释放不再使用的内存,优化算法以减少内存的频繁分配和释放。

调整进程优先级:通过调整进程的优先级,让重要的进程优先获得内存资源,减少它们被换出的可能性。可以使用nice或renice命令来调整进程的优先级。

拓展:

/etc/sysctl.conf中内容:

配置项所属模块核心作用典型取值建议
vm.overcommit_memory=1内存管理允许系统超额分配内存,提升资源利用率,但需警惕 OOM 风险。适用于容器 / 数据库场景
net.core.somaxconn=511网络内核参数增大 TCP 监听队列长度,应对高并发连接请求,减少连接丢弃。511-4096(视负载而定)

7.在多线程环境下,Linux 内存管理需要注意哪些问题?

在多线程环境下,Linux 内存管理需要注意以下问题:

内存共享与同步:多线程通常共享进程的地址空间,包括堆、全局变量等内存区域。这就需要特别注意内存的同步问题,以避免数据竞争和不一致。例如,多个线程同时对共享的 全局变量进行读写操作时,可能会导致数据错误。可以使用同步机制(如互斥锁、条件变量、 信号量等)来保证同一时间只有一个线程能够访问共享内存。

线程栈的管理:每个线程都有自己独立的栈空间,用于存储局部变量、函数调用信息等。 线程栈的大小可以通过ulimit -s命令或pthread_attr_setstacksize 函数进行设置。如果线程栈空间设置过小,可能会导致栈溢出错误;如果设置过大,又会浪费内存资源。

内存分配的性能:在多线程环境下,频繁的内存分配和释放操作可能会导致性能问题。 因为内存分配函数(如malloc)通常不是线程安全的,多个线程同时调用可能会产生竞争条件。可以考虑使用线程本地存储(TLS)或线程特定的内存分配器,以提高内存分配的效率。

避免内存泄漏:由于多线程共享进程的内存空间,一个线程分配的内存,如果在其他线 程中没有正确释放,就会导致内存泄漏。需要确保在所有线程结束时,所有分配的内存都被 正确释放。可以使用智能指针或内存管理类来帮助管理内存的生命周期,减少内存泄漏的风 险。

页表管理:虽然多线程共享进程的页表,但不同线程可能会有不同的内存访问模式,这 可能会影响页表的命中率。操作系统需要合理地管理页表,以提高内存访问的效率。例如, 通过合理的页面置换算法,减少缺页中断的发生。

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

相关文章:

  • npm install的原理
  • 传统业务对接AI-AI编程框架-Rasa的业务应用实战(5)--Rasa成型可用 rasa服务化部署及识别意图后的决策及行为
  • 企业私有化部署的平价革命:五步实现“低成本高可控”AI落地——破除百万投入迷思,中小企业也能玩转私有化大模型
  • JDBC(二) 综合案列、SQL注入问题、封装工具类、ORM
  • Windows Server 2016 域环境搭建
  • 类Transformer架构
  • 【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
  • Linux LVM与磁盘配额
  • RFID推动新能源汽车零部件生产系统管理应用案例
  • React---day10
  • Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法
  • Spring Cloud核心组件深度解析(2025终极指南)
  • 数学复习笔记 28
  • 2123:图的存储与访问
  • Java -jar命令运行外部依赖JAR包的深度场景分析与实践指南
  • 内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式
  • 哈希(Hash)
  • 使用VSCode开发Django指南
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南
  • 飞算 JavaAI 与国内外一些常见 AI 编程工具对比的优势:
  • JavaSec-SPEL - 表达式注入
  • 数据结构之常用排序算法(冒泡、选择等)
  • 使用 Docker Compose 部署 Jenkins(LTS 版)持续集成环境
  • uniapp 开发ios, xcode 提交app store connect 和 testflight内测
  • 学习STC51单片机29(芯片为STC89C52RCRC)
  • RabbitMQ 学习
  • Gerrit+repo管理git仓库,如果本地有新分支不能执行repo sync来同步远程所有修改,会报错
  • 因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力
  • 使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现
  • Python: 操作 Excel折叠