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

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)或线程特定的内存分配器,以提高内存分配的效率。

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

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

相关文章:

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

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

Unity 大型手游碰撞性能优化指南

Unity 大型手游碰撞性能优化指南 版本: 2.1 作者: Unity性能优化团队 语言: 中文 前言 在Unity大型手游的开发征途中,碰撞检测如同一位隐形的舞者,它在游戏的物理世界中赋予物体交互的灵魂。然而,当这位舞者的舞步变得繁复冗余时,便会悄然消耗宝贵的计算资源,导致帧率下…...

Git仓库的创建

Git服务器准备 假设Git所在服务器为Ubuntu系统,IP地址10.17.1.5。 一. 准备运行git服务的git用户,这里用户名就直接设定为git。 1. 创建一个git用户组,并创建git用户。 sudo groupadd git sudo useradd git -g git 2. 创建git用户目录&…...

从零到一:Maven 快速入门教程

目录 Maven 简介Maven 是什么为什么使用 Maven? 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …...

DDD架构实战 领域层 事件驱动

目录 核心实现: 这种实现方式的优势: 在实际项目中,你可能需要: 事件驱动往往是在一个微服务内部实现的 领域时间是DDD架构中比较常见的概念 在领域层内部的一个模型更改了状态或者发生了一些行为 向外发送一些通知 这些通…...

c# List<string>.Add(s) 报错:UnsupportedOperationException

在使用c#读取目录下指定格式文件目录后&#xff0c;使用List<string>.Add 来保存文件名时&#xff0c;出现UnsupportedOperationException错误&#xff0c;找了好久不知道问题出在哪里。 以下是错误代码&#xff1a; using (var fbd new FolderBrowserDialog{Descripti…...

postman基础

前言 本次 Chat 将结合业界广为推崇和使用的 RestAPI 设计典范 Github API&#xff0c;详细介绍 Postman 接口测试工具的使用方法和实战技巧。 在开始这个教程之前&#xff0c;先聊一下为什么接口测试在现软件行业如此重要&#xff1f; 为什么我们要学习 Postman&#xff1f;…...

python训练营day45

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorbo…...

B+树知识点总结

核心目标&#xff1a;减少磁盘 I/O 数据库系统&#xff08;如 MySQL&#xff09;的主要性能瓶颈通常在于磁盘 I/O&#xff08;读取和写入数据到物理硬盘的速度远慢于内存访问&#xff09;。B 树的设计核心就是最大限度地减少访问数据时所需的磁盘 I/O 次数。 一、B 树的基本结…...

Halcon透视矩阵

在 Halcon中&#xff0c;透视变换矩阵用于将图像从一个视角转换到另一个视角&#xff0c;常用于图像校正和几何变换。以下是计算透视变换矩阵的步骤及代码示例。 透视形变图像校正的步骤 对图像左简单的处理&#xff0c;分割要校正的区域&#xff1b;提取区域的顶点坐标信息&…...

SpringCloud——OpenFeign

概述&#xff1a; OpenFeign是基于Spring的声明式调用的HTTP客户端&#xff0c;大大简化了编写Web服务客户端的过程&#xff0c;用于快速构建http请求调用其他服务模块。同时也是spring cloud默认选择的服务通信工具。 使用方法&#xff1a; RestTemplate手动构建: // 带查询…...

007-nlohmann/json 项目应用-C++开源库108杰

本课为 fswatch&#xff08;第一“杰”&#xff09;的示例项目加上对配置文件读取的支持&#xff0c;同时借助 第三“杰” CLI11 的支持&#xff0c;完美实现命令行参数与配置文件的逻辑统一。 012-nlohmann/json-4-项目应用 项目基于原有的 CMake 项目 HelloFSWatch 修改。 C…...

移动端测试岗位高频面试题及解析

文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别&#xff1f; 解析&#xff1a;网络波动&#xff08;弱网测试&#xff09;、设备碎片化&#xff08;机型适配&…...

gvim比较两个文件不同并合并差异

使用 gvim 比较两个文件的不同&#xff1a; 方式一&#xff0c;使用 gvim 同时打开两个待比较的文件。 比较通用方式是采用 gvim -d 选项&#xff0c;具体命令&#xff0c;如下&#xff1a; gvim -d <file1> <file2>方式二&#xff0c;先用 gvim 打开一个文件&am…...

App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离

引入webview的页面添加safeAreaInsets&#xff0c;对weview的webviewStyles做处理 在myApp中改造 entry.vue代码如下 template><view class"entry-page" :style"{ paddingTop: safeAreaInsets.top px }"><web-view :webview-styles"we…...

Git GitHub Gitee

一、Git 是一个免费、开源的分布式版本控制系统。 版本控制&#xff1a;一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。它最重要的就是可以记录文件修改历史记录&#xff0c;从而让用户可以看历史版本&#xff0c;方便版本切换。 1.和集中式版本控制…...

《深度体验 Egg.js:打造企业级 Node.js 应用的全景指南》

&#x1f680; 核心亮点&#xff1a;Koa 的二次觉醒 企业级基因&#xff1a;阿里多年双十一验证的框架稳定性插件化架构&#xff1a;config.plugins 实现功能模块即插即用渐进式演进&#xff1a;从 50 行代码到 5 万行代码的无缝扩容能力 &#x1f527; 实战配置解析&#xff…...

蓝桥杯2118 排列字母

问题描述 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如&#xff0c;LANQIAO 排列后为 AAILNOQ。 又如&#xff0c;GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。 请问对于以下字符串&#xff0c;排列之后字符串是什么&#xff1f; WHERETHEREIS…...

Python应用break初解

大家好!作为 Python 初学者&#xff0c;控制循环的执行是编程中的基础技能之一。在本文中&#xff0c;我们将深入探讨break语句的用途和用法&#xff0c;帮助您更好地理解和掌握这一强大的工具。 定义: break是 Python 中的一个保留关键字&#xff0c;用于在循环中提前终止循环…...

PLSQLDeveloper配置OracleInstantClient连接Oracle数据库

PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 文章目录 PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 1. Oracle Instant Client下载与配置1. Oracle Instant Client下载2. Oracle Instant Client解压配置1. 解压2. 配置 2. PL/SQL Developer下载、…...

高股息打底+政策催化增强+永续经营兜底

通过分析农业银行&#xff08;政策红利高股息&#xff09;与长江电力&#xff08;垄断资源现金流堡垒&#xff09;的共性&#xff0c;提炼出以下策略框架&#xff1a; ​​1. 核心筛选标准​​ • 高股息防御性&#xff1a;股息率>3%&#xff0c;分红率稳定&#xff08;40%…...

双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制_可复现,有问题请联系博主

以下是一个双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360转向与速度控制。方案包含系统建模、控制策略和仿真实现。 系统模型 差速运动学模型: 线速度 ( v = \frac{v_r + v_l}{2} )角速度 ( \omega = \frac{v_r - v_l}{d} )其中 ( v_r, v_l ) 为右/左轮线…...

【Oracle】触发器

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 触发器基础概述1.1 触发器的概念与特点1.2 触发器的分类1.3 触发器的执行顺序 2. DML触发器2.1 基础DML触发器2.1.1 INSERT触发器2.1.2 UPDATE触发器2.1.3 DELETE触发器 2.2 高级DML触发器2.2.1 复合触发器2…...

基于深度学习的无人机轨迹预测

完整代码见文末 随着无人机技术的不断发展&#xff0c;无人机在农业、物流、监控等领域的应用日益广泛。精准的轨迹预测不仅能够提高无人机飞行的效率和安全性&#xff0c;还能在应对复杂环境下的突发状况时做出迅速反应。因此&#xff0c;基于深度学习的无人机轨迹预测已成为…...

git连接本地仓库以及gitee

参考:gitee创建新仓库并上传代码_gitee新建仓库导入代码-CSDN博客 git初始化以及添加git分支 在idea查看master主分支 报错 原因gitee推送更新失败问题记录&#xff1a;remote: error: hook declined to update refs/heads/master-CSDN博客 取消邮箱暴露...

使用Python和OpenCV实现图像识别与目标检测

在计算机视觉领域&#xff0c;图像识别和目标检测是两个非常重要的任务。图像识别是指识别图像中的内容&#xff0c;例如判断一张图片中是否包含某个特定物体&#xff1b;目标检测则是在图像中定位并识别多个物体的位置和类别。OpenCV是一个功能强大的开源计算机视觉库&#xf…...

麒麟v10系统的docker重大问题解决-不支持容器名称解析

今天给客户在麒麟v10Kylin-Server-V10-SP1下安装nextcloudonlyoffice的时候出现无法连接onlyoffice的问题,经过分析找到了是docker版本过低的原因,现在把解决思路和步骤分享给大家。 一、问题 用一键安装工具,给客户装好了系统,Nextcloud可以正常访问 但是访问nextcloud中的o…...

基于5G下行信号的模糊函数分析matlab仿真,对比速度模糊函数和距离模糊函数

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB部分程序 5.算法涉及理论知识概要 6.参考文献 7.完整算法代码文件获得 1.引言 模糊函数&#xff08;Ambiguity Function, AF&#xff09;是信号处理领域用于分析信号时频分辨能力的核心工具&#xf…...

Selenium自动下载浏览器驱动

为什么需要自动下载浏览器驱动&#xff1f; 血泪场景重现 新人入职第一天&#xff1a; 花3小时配置Chrome/Firefox驱动版本不匹配导致SessionNotCreatedException 浏览器自动更新后&#xff1a; 所有测试脚本突然崩溃手动查找驱动耗时长 终极解决方案&#xff1a;自动下载驱…...

数据库优化实战分享:高频场景下的性能调优技巧与案例解析

在实际开发与生产运维中&#xff0c;数据库的性能瓶颈往往是影响系统响应速度和用户体验的关键因素。尤其是在高并发访问、海量数据处理、复杂查询逻辑等高频场景下&#xff0c;数据库优化不仅仅是“锦上添花”&#xff0c;更是“雪中送炭”。本篇博文将结合实际项目经验&#…...