面试复盘 - 腾讯云智移动客户端 一面
Q 那我问你一个问题qt,然后渲染图片那个组件叫什么
A 关于图片,我重新画了一下吧,当然对,重新画了一下。
分析1:
QPainter:QPainter是一个基于扫描线的图形渲染引擎,可以用于绘制各种图形和文本,包括图片。它与特定设备的 QPainterDevice对象交互,将二维图形呈现到窗口上。QPainter可以与QWidget或其他显示设备(如QImage或QPrinter)配合使用,因此你可以在屏幕上轻松地呈现复杂的几何图形和文本。
Q 重新画了一下,是他肯定要从客户端或者说你的服务端里面读一张牌信息,还是说你整个牌都是自己画的。
A 整个牌是存储在本地的牌的信息,然后把那个排的信息存储到本地之后,从本地第就是拿本地的图片去做。
Q 本地的图片去做,那你本地的图片怎么去都提升了?是你本地存了各种牌64章。
A 对本地存了64张牌。
Q 本地测试做对应的是吧?
A 对。
Q 有个小问题,那你本地的图片放在抽屉上,展示qt有组件可以,控件可以展示的。
A 这个不记,这个不记得。
分析2:
QPainter,同上一个分析
Q QT常见的生命周期函数。
A 生命周期函数。 没有印象。
分析3:
| 函数/机制 | 用途 |
|---|---|
| 构造函数 | 创建对象,初始化属性和资源。 |
| 析构函数 | 销毁对象,释放资源。 |
| deleteLater() | 延迟销毁对象,避免在事件处理过程中直接删除导致的崩溃。 |
| destroyed | 对象销毁时发出的信号,用于执行清理操作。 |
| show()和hide() | 显示或隐藏窗口或控件。 |
| 父子关系 | 父对象自动管理子对象的生命周期,确保子对象在父对象销毁时也被销毁。 |
| 事件循环 | 启动和管理应用程序的事件处理。 |
Q 这个项目是我看一下这个项目上周说的,这个项目是什么时候做的
A 比较早是去年到今年一月,是去年三月到今年一月。斗地主要是去年做的斗地主这块。
Q 好的,实习这块那我们再聊一下,在上面这边,然后一个是九月2024年9月月到十月份的一个森和森致远智能信息科技有限公司。对吧?对这个的话,涉及这个主要是做了一个什么事情来着?
A mito s系统实验相关的。
Q 为什么一个公司会让你去做操作?系统实验是公司学校安排的吗?
A 这个是在网上找远程实习,主要是做教育课件。现当类似于教育课件这种东西。
Q 那这个我就不太那我们聊一下讯兔,感觉这个时间是一些比较长,应该大概有次四个月是吧?
A 对。
Q 现在还在实习是吧?
A 现在不在,现在在学校。
Q 好的,讯兔这个主要是做了一个问答联网的,对这个能详细介绍一下吗?
A 这个背景是公司原来派问答是主要做金融垂直类的问答,从公司数据库里,夏粮库里,而拿那个信息,然后去给到大模型,大模型人回答,这样的话。存在几个问题,首先是那个实时信息不多,因为是公司向量库里不能及时的更新信息,对,然后是那个海外的信息没有太多,因为公司的向量库主要是在国内,主要是公司,主要是国内资料多。还有一个问题是有些,主要是做金融类的嘛,但是有些时候有些问题是常识性的,有些常识性的问题比较通俗的,答的不好,这是三个问题,所以就想到使用联网搜索这个方案来增加一下信息源。
Q 那我好奇,你们用的联网搜索这个事是有类似于coze之类的,这种已经封装好的一片,还是说你们自己在自己的服务器上部署了一套大模型。
A 使用在网上的api, 其他公司的api.
Q 是哪家公司的api呢?
A 好。是是那个一开始选的时候最后调研的时候,调研完之后使用的是智谱联网搜索。
Q 这个是吧?对,那你的。Rank的数据库是上传到他们的平台。
A 我这边联网搜索的话,是直接从直接问调用质谱的api 获得信息,对他信息进行处理,然后跟其他从公司现在会让给你拿的信息融合到一块,然后送给大模型。
Q 是一个后端的业务,对吧?
A 对。
Q 那它的准确性最后怎么样?
A 其实第一版的话,是大概有30%的30%的问题能够出现联网搜索的引用新闻之后,然后后来又改了一版,之后是70%,然后再后来最后做了一下调整,就是把原来取的是三个槽嘛。然后后来又调成四个槽,之后最后结果是最终的结果是90%。
Q 你说的这个叫修复了循环堵塞,循环的修复了视线循环堵塞的问题了,大模型时间获取的bug.这个能能详细介绍一下吗?
A 具体是什么问第一版的时候是我,那个我们最后是其他流程,结束之后我我还要联网搜索,还要等联网搜索,两秒钟最多,这个时候我外要循环里y直接调用,while循环反复的去查询。联网搜索是否结束了,那这个时候反复调用外要循环就卡住了,中间还有一个time加time判断是时间,是不是还有结束,反复调用,while循环里调用time点time time,然后就卡住了,最后在里面写的加了个sleep,短暂的睡一下,每次结束。每次查询一下。
Q 那这个业务在是公司内部状态。
A 联网搜索是已经上线了。
Q 就是公网外部用户也可以体验
A 对。
Q 我们聊一个大学的一些基础知识,然后首先问一下C。
A 因为三做手术主要是双方都确认一下,否则的话你一错两次握手的话,你只有一方确认了,那可能是历史消息的影响,必须双方都要确认一下,这个并不是历史消息。
分析4:
TCP 的三次握手之所以被称为“三次握手”,是因为它通过三次报文交换来建立一个可靠的连接。这种机制是 TCP 协议的核心之一,确保了通信双方在正式开始数据传输之前能够同步状态、确认对方的存在,并为后续的通信做好准备。
1. 确保双方都准备好通信:
三次握手确保了通信双方都清楚对方的存在,并且双方都同意建立连接。
如果只有两次握手,可能会出现以下问题:
客户端发送了`SYN`,但服务器可能没有收到。
服务器发送了`SYN-ACK`,但客户端可能没有收到。
如果没有第三次握手,服务器无法确认客户端是否已经准备好通信。
2. 同步序列号:
TCP 是基于字节流的协议,需要通过序列号来确保数据的顺序和完整性。
三次握手允许双方交换初始序列号(`ISN`),从而为后续的数据传输提供可靠的编号机制。
3. 避免历史连接的干扰:
如果网络中存在延迟或旧的报文段,三次握手可以避免因为旧的`SYN`报文重新到达服务器而误建立连接。
例如,如果客户端发送了一个`SYN`报文,但网络延迟导致这个报文在很久之后才到达服务器,服务器可能会误以为这是一个新的连接请求。通过三次握手,服务器可以确认客户端是否真的想要建立连接。
Q 大概答的是对的。应该理解了udp跟tcp的区别是什么?
A Tcp的话,它是面向自节的主要字,节流的,他那个更可靠。Udp的话,它是发报文,什么utc p的话,有一些机制,它传送的话,它比如说有些纠错,这些机制它也是顺序接顺序,有序号顺序接的。Udp的话,他没有这个,他是到他是所有报文到了之后,然后再去做那个检查重组。
Q 还有其他的。
A 其他的暂时记不清了。
分析5:
| 特性 | TCP | UDP |
| --- | --- | --- |
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(确认、重传) | 不可靠(无确认、无重传) |
| 传输效率 | 较低(有开销) | 较高(无开销) |
| 数据传输方式 | 基于字节流 | 基于数据报 |
| 应用场景 | 高可靠性场景(如 HTTP、SMTP) | 实时性场景(如视频流、游戏) |
| 拥塞控制 | 有拥塞控制 | 无拥塞控制 |
| 首部开销 | 较大(20-60 字节) | 较小(8 字节) |
Q 那udp可以做到tcp,就是可靠的协议吗?
A 其实也可以。现在比如说quic出来之后,其实现在http用的也是http 3.0用的,也是udp.
Q 那你有了解过假设,现在如果让你基于udp协议去做一个可靠的网络协议传输,你会打算怎么做?
A 可能也是顺序发放,然后以次接收了,中间可能会。中间可能会加入一些简检错重传,这种东西。
分析6:
序列号:确保数据顺序。
ACK 和 NACK:确认和否定确认机制。
超时重传:处理丢包。
累积确认:减少 ACK 数量。
拥塞控制:动态调整发送速率。
发送窗口:提高吞吐量。
连接管理:模拟 TCP 的连接机制。
错误检测:确保数据完整性。
乱序处理:重组乱序数据。
Q 你的检测跟重传的这块可以详细谈一谈,你打算怎么检测?怎么。
A 检测简单点,可以使用奇偶校验。然后从接口校验吗?有一个照相盒吗?
分析7:
在基于UDP协议实现可靠传输时,检测和重传机制是确保数据可靠传输的关键。以下是对检测和重传机制的详细探讨:
检测机制
1. 校验和检测:
UDP本身提供校验和字段,用于检测数据在传输过程中是否发生错误。发送方计算校验和并将其放入UDP数据包中,接收方收到数据包后重新计算校验和并与接收到的校验和进行比较。如果两者不匹配,则认为数据包损坏。
对于关键业务,可以使用更高级的校验机制,如CRC(循环冗余校验)或MD5哈希校验,以提高错误检测的准确性。
2. 序列号检测:
每个UDP数据包都包含一个序列号,用于标识数据包的发送顺序。接收方可以根据序列号检测数据包的丢失或乱序。
3. 时间戳检测:
在数据包中添加时间戳,用于检测数据包的时序和网络延迟。如果数据包的时间戳与当前时间相差过大,可能表明数据包已经过期或丢失。
重传机制
1. 超时重传:
发送方为每个未确认的数据包设置一个定时器。如果定时器超时且未收到确认应答(ACK),则认为数据包丢失,发送方重传该数据包。
超时时间(RTO)可以根据网络状况动态调整,通常基于RTT(Round-Trip Time)的平均值和方差来计算。
2. 否定确认重传(NACK):
接收方在发现数据包丢失或损坏时,主动向发送方发送否定确认(NACK)消息,请求重传特定的数据包。
3. 累积确认与选择性重传:
接收方发送累积确认(ACK),确认已收到的最后一个连续数据包的序列号。发送方根据累积确认确定哪些数据包需要重传。
选择性重传(Selective Repeat)机制允许发送方只重传丢失的数据包,而不是重传从丢失数据包开始之后的所有数据包,从而提高传输效率。
Q 这个校验和怎么设计的?
A 合适的话,可以,他每个可以使用,那个就是使用一串数字,然后去除以他每个阿斯卡码值,然后加起来这个可以吗?
分析8:
在基于UDP协议设计校验和时,可以参考以下方法:
1. 校验和的构造
伪首部的构造:校验和的计算需要包括一个伪首部,伪首部包含以下内容:
源IP地址
目的IP地址
协议类型(UDP为17)
UDP数据的长度。
UDP数据的分段:将UDP数据报文按16位(2字节)为单位进行分段。如果数据长度不是偶数,可以在末尾补一个字节的填充(值为0)。
2. 校验和的计算
求和:将伪首部、UDP头部和数据部分的所有16位字相加。
回卷处理:如果求和过程中出现溢出(超过16位),将溢出的部分加到结果的低16位上。
取反:将最终的和按位取反,得到校验和。
3. 校验和的验证
接收端验证:接收方将接收到的UDP数据包(包括校验和字段)按同样的方法进行计算。如果结果为全1(即0xFFFF),则认为数据包没有错误;否则,认为数据包可能已损坏。
4. 应用场景
错误检测:校验和用于检测UDP数据包在传输过程中是否发生错误,如位翻转或数据损坏。
数据完整性:确保接收方接收到的数据与发送方发送的数据一致。
Q 那你为什么不想直接用序号呢?标号1234给它标了没?一个包一个包的,对方按顺序校验,丢了一个,中间丢了一个,丢了,让他重传包,丢的包发过来,谢吗?
重新再发一次,前后面的标全部丢掉。
A 类似滑动窗口是吧。
Q 再问一下tcp跟http的区别是。
A tcp http不是一层吧。
Q 是不是一层它俩的区别是什么?
A Http是应用层tcp是在网络层。
分析9
| 特性 | TCP | HTTP |
|---|---|---|
| 协议层次 | 传输层 | 应用层 |
| 功能 | 可靠的、面向连接的传输 | 请求-响应模式的超文本传输 |
| 通信方式 | 面向连接、双向通信 | 无连接、请求-响应模式 |
| 可靠性 | 可靠(确认、重传) | 依赖 TCP 的可靠性 |
| 性能 | 较低(有开销) | 较高(基于 TCP) |
| 应用场景 | 高可靠性场景(如文件传输、邮件传输) | Web 服务(如网页浏览、API 请求) |
| 数据格式 | 基于字节流 | 基于文本协议 |
| 连接管理 | 三次握手、四次挥手 | 每次请求独立(HTTP/1.0)或持久连接(HTTP/1.1) |
| 安全性 | 无(可结合 TLS/SSL) | 无(可结合 HTTPS) |
Q http跟Tcp,或者换言之来讲,那你我问一个,就是你前面的,你前面用的那些就服务的话。更多是用tcp的协议还是用hdp的行为?就是,比如说就在讯兔实习部了。
A 拍拍搜索用的更多的话,是这是http吧?
Q Http是吧?
A 对。
Q http的错误码是吧?200代表什么意思?状态吗?
A 信息响应吗?
Q 什么信息响应?404呢?
A 404是在服务端没有找到资源。
分析10
2XX 成功
200 OK: 请求成功,服务器返回所请求的资源或数据
201 Created: 请求并成功创建了新的资源,常用于POST请求
204 No Content: 请求成功但服务器不返回任何内容
Q ai的模型24种设计模式。好,那我们再问一下那个计算机基础,就是假设有一个程序,有一个c加加的程序,对吧?然后就是里面有一个new的一个数据,这个数据每次是申请16次行,那个内存你写了个for循环申请1000次。对吧?
那这个时候这条进程里虚拟内存的增加是多少?那虚拟内存会增加吗?只申请不申名。
不会增产,物理预算不是虚拟内存会增加吗?
A 不会吧,我觉得。
Q 会是吧。
A 为什么会。
Q 不是我?是我问你说虚拟内存,如果这种循环申请,但是不使用的情况底下。虚拟内存会不会增加?虚拟内存有个for循环在那里?循环。循环申请,然后有一个。申请一个1616 kb的内存的大小。
A 不会吧,我觉得。
Q 虚拟内存不会增加是吧?对物理预测会。
A 物理内存的话,物理内存可能会。
Q 问题,没有什么。
A 适宜的时候可能会从页表里不停的去置换物理内存的话,需要真的存东西。
Q 不使用它会产生这种置换吗?或真实的物理。
A 没有了解过。
分析11
虚拟内存是否会增加?
是的,虚拟内存会增加。每次调用 `new` 操作符申请内存时,程序会向操作系统请求一块虚拟内存。即使你没有显式地释放这些内存(即没有调用 `delete`),这些内存仍然会被操作系统认为是程序正在使用的虚拟内存,因此虚拟内存的占用会增加。
虚拟内存的增加量是多少?
理论上,每次调用 `new` 申请 16 个字节的内存,1000 次循环后,虚拟内存的增加量应该是:
16000字节 = 16KB
但实际上,虚拟内存的增加量可能会稍微大于这个值,原因如下:
1. 内存对齐和管理开销:操作系统和内存分配器(如 `malloc` 或 C++ 的 `new`)通常会对内存分配进行对齐(例如 8 字节或 16 字节对齐),并可能添加一些管理元数据(如块大小、分配状态等)。因此,实际分配的内存可能会比请求的 16 字节稍大。
2. 分配器的优化:现代的内存分配器(如 glibc 的 `malloc` 或其他实现)通常会将小块内存合并管理,避免频繁向操作系统请求内存。因此,分配器可能会一次性从操作系统获取更大的内存块(例如 4KB 或更多),然后从中分割出小块内存供程序使用。这种情况下,虚拟内存的增加可能并不是完全线性的。
3. 操作系统的内存管理:操作系统可能会将未使用的虚拟内存标记为“保留”(reserved),但不会立即分配物理内存。只有当程序实际访问这些内存时,操作系统才会将虚拟内存映射到物理内存。
总结
虚拟内存会增加:每次调用 `new` 都会增加虚拟内存的占用。
具体增加量:理论上是 16KB,但实际值可能略大于这个值,具体取决于内存分配器和操作系统的实现细节。
物理内存的消耗:未使用的虚拟内存可能不会立即占用物理内存,但虚拟内存的占用仍然会计入进程的虚拟内存统计中。
如果你需要更精确地测量虚拟内存的变化,可以使用工具(如 Linux 的 `ps` 命令或 `top` 命令)来观察进程的虚拟内存使用情况。
Q 然后再问一下链表跟栈,然后或者数组栈哪个查询比较快。
A 数组是吧?
Q 哪个插入比较快?
A 栈。
Q 一般我们会发现。发现发生死锁都都会有哪些?就是思索的原因是什么?
A 死死的原因是对资源的争夺,卡住了,就是你需要的资源对面已经占用了,对面需要资源,你已经占用了,然后就卡。
Q 卡住了。就你有遇到过出手吗?你怎么去解决它?
A 编程过程现在现在的话,编程的话,遇到搜索比较少,一般都是使用raii,他那个新版本的那种锁。
Q
你可以分享屏幕,写一个思索的,用c++写一个思索的话。协场。
你电脑上有ide 或者如果没有ide的话,可以用文本写也行,然后简单就是就是写伪代码也可以。
A 好用记事本写行吗?
Q 对,可以的,没问题。
A 类似于这种。
Q 不应该先写两个线程的。
A 随便这样写吧。那样的话,感觉。
Q 你的c一跟c二里面各自起了一个县程是吧?对,那你的r一跟r二在哪?为什么c一跟c二可以存的访问r一跟r二。
A 在可能cc一跟c二的话,是在一个项目里,然后资源是存了一个,存了一个点h里。可能打不开了。
Q
等一下。
我再问一下,反正你现在在整个专业里面,你们专业大概有多少学生?
A
我们专业学生比较多二百。
Q
那你在整个专业里面。
A
排名大概到多前30%,我绩点不高。
Q 那没靠你分数比较高一点。
A 专业课专业课的话。计算机相关的话都八九十。
Q大点实升,我们现在就。
这是一个很简单,这个大模型,这里的话,你除了用一些跑mat的话,你还有了解,还有了解其他的信息吗?
A 其他的了解不多。
Q 所以你第一份工作里面就是不是迅速的那个实习。主要还是集中在应用。
A 对,主要是音乐,主要是使用。
Q c++这里的话,智能指针,然后有了。
A 有了解。
Q 对,那你呢?谈一下智能指针的share_ptr 实现的原理吗?
A Share_ptr的原理是以加入加入一个引用计数,每多指向一个计数,加一计数归零的时候再释放。


