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

【小米】Linux 实习生

下午不准备去图书馆自习来着,中午就狠狠地多睡了一个小时,三点起床靠在椅子上剥柚子,太爽了,这秋天的下午。“邮件:小米公司邀请你预约面试时间”..........

我擦,投了一个月了,认真准备的时候没有面试,现在躺了,来了面了~~~预约到了第二天下午,怎么办呢,考不考算法哇,考不考设计模式哇,考不考命令哇.....炸裂哇~

还能说什么呢,机会不是每次都有,还能怎么着,快学,赶紧穿好衣服去自习室复习复习,开卷


开面!

「面试官」自我介绍吧,别愣着了

「朱小哥」好的哥....

「面试官」说说你的项目背景,自己做的吗

「朱小哥」不是我做的你做的吗?这就是google的tcmalloc的mini版...

「面试官」malloc函数有什么问题呢,为什么需要改进,你的tcmalloc如何解决的

「朱小哥」主要就是针对多线程环境下带来的锁竞争的问题,现代很多的开发环境都是多核多线程,在申请内存的场景下,必然存在激烈的锁竞争问题。那malloc可不就不行了

tcmalloc针对锁竞争这里采用的是,开始吟唱:

既然想要解决多线程环境下存在激烈的锁竞争的问题,就得需要加锁吧,可是如果加的锁粒度太大,是非常影响效率的,所以要想尽可能的不加锁或者少加锁的话,再结合内存池的这个思路,那我就可以实现一个分层的逻辑。

可以做一个多层架构,每一层针对不同大小的内存分配请求使用不同的方法。这种灵活性有助于提高内存的利用率和性能。

  • 每一个ThreadCache是线程独有的,这个地方不需要加锁。我还使用到了一种TLS技术,线程本地缓存,通过它我还可以在第一层就不需要加锁,
  • CentralCache层只有当多个线程同时访问central cache的同一个桶时才会存在锁竞争,如果是多个线程同时访问central cache的不同桶就不会存在锁竞争。
  • central cache的多个桶就可能同时向page cache申请内存的,所以page cache也是存在线程安全问题的,因此在访问page cache时也必须要加锁。但是在page cache这里我们不能使用桶锁,因为当central cache向page cache申请内存时,page cache可能会将其他桶当中大页的span切小后再给central cache。

「面试官」threadcache初识的内存是怎么拿到的,你是怎么拿到的threadcache的

「朱小哥」threadcache是怎么拿到内存的?从对应的哈希桶中去获取哇!第一次申请当然哈希桶中啥也没有,你得去向下一层要,下一层中心缓存也没有,就问PageCache要,PageCache没有就会向堆申请128页的内存

「面试官」PageCache是如何解决内存碎片的问题的

「朱小哥」内碎片是设计的问题,解决不了,外碎片是一些空闲的连续内存区域太小,这些内存空间不连续,以至于合计的内存足够,但是不能满足一些的内存分配申请需求。

关于如何解决外部碎片,听好了!

  1. 采用一种各层遵守的规范,就是将不同大小的内存块分为不同的大小类别,每个大小类别包含一组相似大小的内存块。这样可以更有效地分配和管理内存,减少了内存碎片。
  2. Thread-Caching 层维护了每个线程的本地内存缓存,这意味着内存块通常在同一个线程内进行分配和释放。这种局部性有助于减少内存碎片,因为同一个线程通常会分配和释放相似大小的内存块,从而减少了碎片化的可能性。
  3. 对于不用的内存,也有必要来回收,实现了内存块的合并机制,可以合并相邻的空闲内存块,从而减少内存碎片。当内存块被释放时,tcmalloc会尝试合并相邻的空闲块,以创建更大的可用内存块,提高内存的利用率。
  4. 如果central cache释放回一个span,则依次寻找span的前后page id的没有在使用的空闲span,看是否可以合并,如果合并继续向前寻找。这样就可以将切小的内存合并收缩成大的span,减少内存碎片。

「面试官」PageCache这里是如何合并内存的呢

「朱小哥」......

「面试官」你到底会不会啊

「朱小哥」忘了忘了

「面试官」噗~~~~,给你个双向链表,你有三个节点,a b c 如何删除节点b,说说操作步骤

「朱小哥」小意思

「面试官」常见的进程间通信的方式

「朱小哥」匿名管道、命令管道、消息队列、共享内存、信号、信号量、socket,你想让我说说哪个~

「面试官」说说进程间通信中的socket通信吧,使用socket进行俩个主机通信的步骤

「朱小哥」王德发!!!选了个最不熟悉的,好你......Socket 实际上不仅用于不同的主机进程间通信,还可以用于本地主机进程间通信,可根据创建 Socket 的类型不同,分为三种常见的通信方式,一个是基于 TCP 协议的通信方式,一个是基于 UDP 协议的通信方式,一个是本地进程间通信方式。

创建Socket:

通信的第一步是创建一个Socket对象,它充当通信的端点。使用socket函数创建一个Socket。

绑定Socket:

为了让Socket能够在网络上被其他计算机访问,需要将其绑定到一个IP地址和端口号。bind函数用于绑定Socket。

监听(对于服务器):

如果你正在编写服务器应用程序,需要使用listen函数来等待客户端的连接请求。

接受连接(对于服务器):

当客户端尝试连接到服务器时,服务器使用accept函数来接受客户端的连接请求,并创建一个新的Socket来处理与该客户端的通信。

建立连接(对于客户端):

客户端使用connect函数来连接到服务器的Socket。

发送数据:

使用send函数来将数据从一个Socket发送到另一个Socket。

接收数据:

使用recv函数来从一个Socket接收数据。

关闭Socket:

当通信结束时,使用close函数来关闭Socket连接。对于服务器端,还需要关闭原始的监听Socket。

这是Socket通信的基本流程。可以使用socket、bind、listen、accept、send、recv和close等系统调用函数来执行这些操作。

「面试官」C++中的默认构造函数有哪些,移动构造呢

「朱小哥」无参构造、一般构造、赋值运算符重载、拷贝构造函数、移动构造(忘了)

「面试官」你给我写一个拷贝构造,什么场景使用拷贝构造

「朱小哥」厚礼蟹!!!拷贝构造怎么写!!!

「面试官」这都不会,

「朱小哥」...

「面试官」拷贝构造是浅拷贝还是深拷贝,说说深浅拷贝的区别

「朱小哥」软了...,肯定是深拷贝哇

1. 浅拷贝, 又叫做值拷贝. 将源对象的值拷贝到目标对象中去. 本质上来说源对象和目标对象共用同一份实体, 只是所引用的变量名不同, 指向的地址是相同的.

  • 浅拷贝中, 如果目标对象的值修改了, 则源对象的值也会相应改变

2. 深拷贝, 拷贝的时候先开辟出和源对象大小一样的空间, 然后将源对象里的内容拷贝到目标对象当中去, 这样俩个指针指向了不同的内存位置, 并且里面的值是一样的.

  • 深拷贝的情况下, 不会出现重复释放同一块内存的错误
  • 深拷贝的实现: 拷贝构造和赋值运算符重载实现

「面试官」指针和引用的区别

「朱小哥」简单哇

  1. 指针是一个实体,需要分配内存空间,引用只是个别名,不需要内存空间
  2. 指针在定义的时候不一定要初始化,引用必须初始化,并且不能改变所引用的变量
  3. 指针可以时空指针,引用不能是空
  4. 有多级指针,没有多级引用
  5. 引用的底层是指针

「面试官」一个类中是有成员变量和有构造函数和析构函数的,这些函数会不会占用内存空间呢

「朱小哥」我觉得你说的有问题,成员函数是存放在代码段的,当然占用内存,但是类对象的大小只包含成员变量,不包含成员函数,会将类对象的地址传递给this指针,当调用一个对象的非静态成员函数时, 系统会把该对象的起始地址赋给成员函数的 this 指针, 另外,静态成员函数不属于任何一个对象, 所以静态成员函数没有 this 指针, 既然它没有指向某一对象, 也就无法对一个对象中的非静态成员进行访问

「面试官」memcpy和memmove使用过吗,具体说说

「朱小哥」不会

memcpy 函数用于从一个内存区域复制一定数量的字节到另一个内存区域。它将源内存区域的内容按顺序复制到目标内存区域,无论它们是否重叠。

void *memcpy(void *dest, const void *src, size_t n);

memmove 函数也用于从一个内存区域复制一定数量的字节到另一个内存区域,但与 memcpy 不同,它会处理重叠的内存区域。memmove 会检查内存区域是否重叠,如果重叠,通过使用一个临时缓冲区,将源内存区域的数据复制到这个缓冲区,然后再将缓冲区的数据复制到目标内存区域。这种方法确保数据的正确复制而不会破坏原始数据。

void *memmove(void *dest, const void *src, size_t n);

由于需要使用额外的内存来存储临时缓冲区,所以 memmove 可能比 memcpy 性能稍差,但它保证了数据的完整性和正确性。

「面试官」呼~,反问吧,有什么就问

「朱小哥」组是做什么的

「面试官」巴拉巴拉........

「朱小哥」我可以进入二面吗

「面试官」别问,问就是回家等消息~,怎么说呢,回答还凑活,指针和引用是背八股的吧,简直和网上回答是一样,你不得理解理解?不能光背哇,背还背不熟.....拷贝构造都不会写就有点太离谱了

「朱小哥」面试结束我学还不行嘛,找个实习太难了

相关文章:

【小米】Linux 实习生

下午不准备去图书馆自习来着,中午就狠狠地多睡了一个小时,三点起床靠在椅子上剥柚子,太爽了,这秋天的下午。“邮件:小米公司邀请你预约面试时间”.......... 我擦,投了一个月了,认真准备的时候…...

python一点通:coroutine (协程)是什么和重要知识点?

协程已经成为Python用于编写并发和异步代码的重要工具之一。在这篇博客文章中,我们将深入探讨协程是什么,它们的优点,以及它们与传统的线程和进程有何不同。 什么是协程? 协程是用于合作式多任务处理的子程序(或函数…...

QCC51XX-QCC30XX系列开发教程(实战篇) 之 12.1-空间音频相关模块的概述

查看全部教程开发请点击:全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中) ==================================================================== 版权归作者所有,未经允许,请勿转载。 ==========================================...

Servlet的生命周期

2023.10.18 WEB容器创建的Servlet对象,这些Servlet对象都会被放到一个集合当中(HashMap),这个集合当中存储了Servlet对象和请求路径之间的关系 。只有放到这个HashMap集合中的Servlet才能够被WEB容器管理,自己new的Ser…...

2.4 如何在FlinkSQL使用DataGen(数据生成器)

1、DataGen SQL 连接器 FLinkSQL中可以使用内置的DataGen SQL 连接器来生成测试数据 官网链接:DataGen SQL 连接器 2、随机数数据生成器 随机数数据生成器支持随机生成 char、varchar、binary、varbinary、string 类型的数据 它是一个无界流的数据生成器 -- TO…...

Gin + Ant Design Pro JWT认证

文章目录 一:介绍二:Gin JWT 后台1. Claims 定义2. 创建和解析Token3. Gin中间件编写4. 辅助函数 三:Ant Design Pro JWT认证四:Gin中间件和使用示范 一:介绍 JWT现在比较流行的认证方式,微服务中使用特别…...

canvas实现图片标注,绘制区域

使用canvas绘制通过多边形标注区域 AI视频项目中需要分析图片&#xff0c;需要前台绘制区域&#xff0c;后端获取坐标然后识别图像&#xff0c;通过canvas 获取点然后连线绘图 HEML代码段 <div class"areaDrawing"><img src"/assets/images/snapPhotos…...

SELECT COUNT(*) 会造成全表扫描吗?

前言 SELECT COUNT(*)会不会导致全表扫描引起慢查询呢&#xff1f; SELECT COUNT(*) FROM SomeTable 网上有一种说法&#xff0c;针对无 where_clause 的 COUNT(*)&#xff0c;MySQL 是有优化的&#xff0c;优化器会选择成本最小的辅助索引查询计数&#xff0c;其实反而性能…...

python考前复习(90题)

文章目录 1.Python特性的是( )。 A. 面向对象 B. 高可移植性 C. 开源、免费 2.临时改变Python语言安装源应当使用的选项是 –index-url 3.Python脚本文件的扩展名为( ) .py 4.安装Python语言的软件包使用的命令是&#xff08; &#xff09; pip install 5 . (单选题)以下哪项是…...

根据SpringBoot Guides完成进行示例学习(详细步骤)

目录 1.打开Spring | Guides官网&#xff0c;或者直接搜索springboot都可 2.选择要学习的内容 3.根据提示的网址&#xff0c;Git到本地 4.将文件用IDEA打开&#xff0c;根据教程完成示例&#xff0c;这里不做细致讲解 5.运行项目 6.在终端查看运行结果 以Scheduling Task…...

waf、yakit和ssh免密登录

WAF安全狗 脏数据适用于所有漏洞绕过waf&#xff0c;但是前提条件垃圾信息必须放在危险信息前&#xff0c;是不能打断原有数据包的结构&#xff0c;不能影响后端对数据包的解析。 以DVWA靶场文件上传为例 新建php文件 上传文件被安全狗拦截 使用bp抓包查看 在数据包Content-…...

【AIGC核心技术剖析】大型语言和视觉助手——LLaVA(论文+源码)

🔥 [新!LLaVA-1.5 在 11 个基准测试上实现了 SoTA,只需对原始 LLaVA 进行简单的修改,利用所有公共数据,在单个 1-A8 节点上在 ~100 天内完成训练,并超越使用数十亿级数据的方法。 LLaVA代表了一种新颖的端到端训练大型多模态模型,结合了视觉编码器和骆马 对于通用的视…...

IBM的WAS简介与基本使用手册

IBM的WAS简介与基本使用手册 1. 基本介绍 WebSphereApplication Server(简称WAS)是IBM的应用服务器 基本结构:单元(cell) ——> 多个节点(node) ——> 多个服务(server) ——> 多个应用(app) 单元是整个分布式网络中一个或多个节点的逻辑分组单元是一个配置概念, 是…...

Deno 快速入门

目录 1、简介 2、安装Deno MacOS下安装 Windows下安装 Linux 下安装 3、创建并运行TypeScript程序 4、内置Web API和Deno命名空间 5、运行时安全 6、导入JavaScript模块 7、远程模块和Deno标准库 8、使用deno.json配置您的项目 9、Node.js API和npm包 10、配置IDE…...

【计算机网络笔记】OSI参考模型基本概念

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

ConnectTimeout和ReadTimeout所代表的意义

ConnectTimeout和ReadTimeout所代表的意义 ConnectTimeout 指的是建立连接所用的时间&#xff0c;适用于网络状况正常的情况下&#xff0c;两端连接所用的时间。在java中&#xff0c;网络状况正常的情况下&#xff0c;例如使用HttpClient或者HttpURLConnetion连接时设置参数c…...

使用Python计算平面多边形间最短距离,数据需要从excel表格中导入

使用Python计算平面多边形间最短距离&#xff0c;数据需要从excel表格中导入&#xff0c; * 多边形种类包括&#xff08;圆形、矩形、六边形、五边形、跑道形/胶囊形&#xff09;&#xff0c; * Python代码需要使用gjk算法进行判断两个多边形间是否重叠&#xff0c; * 如果未重…...

华为数通方向HCIP-DataCom H12-831题库(多选题:1-20)

第01题 如图所示,路由器所有的接口开启OSPF,图中标识的ip地址为设备的Loopback0接口的IP地址,R1、R2,R3的Loopback0通告在区域1,R4的Loopback0通告在区域0、R5的Lopback0通告在区域2,下列哪些IP地址之间可以相互Ping通? A、10.0.3.3和10.0.5.5 B、10.0.4.4和10.0.2.2 …...

CCC数字钥匙设计【NFC】--通过NFC进行车主配对Phase3

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase3进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…...

开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单

源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88403340 源码下载2&#xff1a; 关注我留言 开源OA协同办公系统&#xff0c;集成Flowable流程引擎 可拖拽创建个性表单。基于RuoYi-VUE版本开发。 1、使用RuoYi-Vue的基础上开发。 2、集成flowable&a…...

为什么嵌入通常优于TF-IDF:探索NLP的力量

塔曼纳 一、说明 自然语言处理&#xff08;NLP&#xff09;是计算机科学的一个领域&#xff0c;涉及人类语言的处理和分析。它用于各种应用程序&#xff0c;例如聊天机器人、情绪分析、语音识别等。NLP 中的重要任务之一是文本分类&#xff0c;我们根据文本的内容将文本分类为不…...

oracle-AWR报告生成方法

AWR报告生成方法 1. 以oracle用户登陆服务器 2. 进入到要保存awr报告的目录 3. 以sysdba身份连接数据库 sqlplus / as sysdba4. 执行生成AWR报告命令 ?/rdbms/admin/awrrpt.sql5. 选择AWR报告的文件格式 6. 选择生成多少天的AWR报告 7. 选择报告的快照起始和结束ID 8. 输入生…...

笙默考试管理系统-MyExamTest----codemirror(37)

笙默考试管理系统-MyExamTest----codemirror&#xff08;36&#xff09; 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试…...

【Unity3D编辑器拓展】Unity3D的IMGUI、GUI、GUILayout、EditorGUI、EditorGUILayout、OnGUI【全面总结】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;常常会遇到要使用OnGUI的地方。 也会遇到…...

11. 机器学习 - 评价指标2

文章目录 混淆矩阵F-scoreAUC-ROC 更多内容&#xff1a; 茶桁的AI秘籍 Hi, 你好。我是茶桁。 上一节课&#xff0c;咱们讲到了评测指标&#xff0c;并且在文章的最后提到了一个矩阵&#xff0c;我们就从这里开始。 混淆矩阵 在我们实际的工作中&#xff0c;会有一个矩阵&am…...

Nginx的代理和负载均衡

一、nginx的代理方式 1.1 七层代理 七层代理&#xff1a;基于http协议&#xff0c;对请求的内容进行处理&#xff0c;然后转发到后端服务器 七层代理是客户端请求代理服务器&#xff0c;由代理服务器转发客户端的http请求&#xff0c;转发到内部的服务器进行处理(服务器可以是…...

Oracle发布支持Vscode的Java插件

Oracle 发布对 Visual Studio Code 的 Java 插件支持&#xff0c;这个扩展插件通过基于 OpenJDK 的 javac 编译器和调试器接口的语言服务器&#xff0c;为流行的多语言集成开发环境提供 Java 支持。 VS Code 扩展的核心是Java语言服务器&#xff1a;这是一个使用语言服务器协议…...

互联网Java工程师面试题·Java 总结篇·第九弹

目录 75、阐述 JDBC 操作数据库的步骤。 76、Statement 和 PreparedStatement 有什么区别&#xff1f;哪个性 能更好&#xff1f; 77、使用 JDBC 操作数据库时&#xff0c;如何提升读取数据的性能&#xff1f;如何提升更新数据的性能&#xff1f; 78、在进行数据库编程时&a…...

SpringCloud学习笔记-gateway网关自定义全局过滤器

需求&#xff1a;定义全局过滤器&#xff0c;拦截请求&#xff0c;判断请求的参数是否满足下面条件&#xff1a; 参数中是否有authorization&#xff0c; authorization参数值是否为admin 如果同时满足则放行&#xff0c;否则拦截 实现&#xff1a; 在gateway中定义一个过…...

数字图像处理实验记录四(图像的空间域增强-平滑处理)

前言&#xff1a;要是是实验报告赶工的话&#xff0c;建议总结上网抄&#xff0c;或者重构我的总结&#xff0c;仅供学习参考&#xff0c;不要照抄 文章目录 一、基础知识1&#xff0c;噪声2&#xff0c;椒盐噪声3&#xff0c;高斯噪声4&#xff0c;滤波器5&#xff0c;均值滤…...