【小米】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是如何解决内存碎片的问题的
「朱小哥」内碎片是设计的问题,解决不了,外碎片是一些空闲的连续内存区域太小,这些内存空间不连续,以至于合计的内存足够,但是不能满足一些的内存分配申请需求。
关于如何解决外部碎片,听好了!
- 采用一种各层遵守的规范,就是将不同大小的内存块分为不同的大小类别,每个大小类别包含一组相似大小的内存块。这样可以更有效地分配和管理内存,减少了内存碎片。
- Thread-Caching 层维护了每个线程的本地内存缓存,这意味着内存块通常在同一个线程内进行分配和释放。这种局部性有助于减少内存碎片,因为同一个线程通常会分配和释放相似大小的内存块,从而减少了碎片化的可能性。
- 对于不用的内存,也有必要来回收,实现了内存块的合并机制,可以合并相邻的空闲内存块,从而减少内存碎片。当内存块被释放时,tcmalloc会尝试合并相邻的空闲块,以创建更大的可用内存块,提高内存的利用率。
- 如果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. 深拷贝, 拷贝的时候先开辟出和源对象大小一样的空间, 然后将源对象里的内容拷贝到目标对象当中去, 这样俩个指针指向了不同的内存位置, 并且里面的值是一样的.
- 深拷贝的情况下, 不会出现重复释放同一块内存的错误
- 深拷贝的实现: 拷贝构造和赋值运算符重载实现
「面试官」指针和引用的区别
「朱小哥」简单哇
- 指针是一个实体,需要分配内存空间,引用只是个别名,不需要内存空间
- 指针在定义的时候不一定要初始化,引用必须初始化,并且不能改变所引用的变量
- 指针可以时空指针,引用不能是空
- 有多级指针,没有多级引用
- 引用的底层是指针
「面试官」一个类中是有成员变量和有构造函数和析构函数的,这些函数会不会占用内存空间呢
「朱小哥」我觉得你说的有问题,成员函数是存放在代码段的,当然占用内存,但是类对象的大小只包含成员变量,不包含成员函数,会将类对象的地址传递给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视频项目中需要分析图片,需要前台绘制区域,后端获取坐标然后识别图像,通过canvas 获取点然后连线绘图 HEML代码段 <div class"areaDrawing"><img src"/assets/images/snapPhotos…...

SELECT COUNT(*) 会造成全表扫描吗?
前言 SELECT COUNT(*)会不会导致全表扫描引起慢查询呢? SELECT COUNT(*) FROM SomeTable 网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小的辅助索引查询计数,其实反而性能…...
python考前复习(90题)
文章目录 1.Python特性的是( )。 A. 面向对象 B. 高可移植性 C. 开源、免费 2.临时改变Python语言安装源应当使用的选项是 –index-url 3.Python脚本文件的扩展名为( ) .py 4.安装Python语言的软件包使用的命令是( ) pip install 5 . (单选题)以下哪项是…...

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

waf、yakit和ssh免密登录
WAF安全狗 脏数据适用于所有漏洞绕过waf,但是前提条件垃圾信息必须放在危险信息前,是不能打断原有数据包的结构,不能影响后端对数据包的解析。 以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参考模型基本概念
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
ConnectTimeout和ReadTimeout所代表的意义
ConnectTimeout和ReadTimeout所代表的意义 ConnectTimeout 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。在java中,网络状况正常的情况下,例如使用HttpClient或者HttpURLConnetion连接时设置参数c…...
使用Python计算平面多边形间最短距离,数据需要从excel表格中导入
使用Python计算平面多边形间最短距离,数据需要从excel表格中导入, * 多边形种类包括(圆形、矩形、六边形、五边形、跑道形/胶囊形), * Python代码需要使用gjk算法进行判断两个多边形间是否重叠, * 如果未重…...

华为数通方向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进行,若支持UWB测距,也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase3进行介绍。 1) Phase0:准备阶段; 2) Phase1:启动流程࿱…...

开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单
源码下载:https://download.csdn.net/download/m0_66047725/88403340 源码下载2: 关注我留言 开源OA协同办公系统,集成Flowable流程引擎 可拖拽创建个性表单。基于RuoYi-VUE版本开发。 1、使用RuoYi-Vue的基础上开发。 2、集成flowable&a…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...