中望一面凉经 25 min
先说下,面试官挺好的哈哈,调侃下,
忘记记录了😂....
25分钟,15分钟问C++和项目,10分钟闲聊....感觉是不是凉了,,,项目的很多东西没问,主要自己没引导好,而且八股没开始背,面试官问的几个问题答的都不好
(以下打乱顺序)
[1],
new 和 malloc 的区别
[2],
Windows下和Linux下,C++的区别,或者编译的区别
1,编译器差异:
1)Windows:主要有Visual C++编译器(MSVC),可以使用Visual Studio集成开发环境进行开发。也支持使用GNU编译器套件(如MinGW)或Clang进行编译
2)Linux:常用的是GNU编译器套件(GCC)和Clang。通常使用命令行进行编译,也可以使用各种集成开发环境(如Eclipse、Code::Blocks)
2,
系统调用差异:
1)Windows:通常使用Windows API进行系统调用,例如文件操作、进程管理等。
2)Linux:通常使用POSIX API进行系统调用,与UNIX系统兼容,例如fork()、exec()等。
3,
开发环境和工具链:
1)Windows:常用的集成开发环境有Visual Studio,也可以使用MinGW、Cygwin等工具链。
2)Linux:开发者可以选择使用命令行工具链、各种文本编辑器和集成开发环境。
4,
标准库和系统库:
[3],项目压测,每秒传输数据量 148万 bytes,为什么那么低
1,
实施负载均衡:
将数据流量均匀地分配到多个服务器上,避免单点故障,并提高数据传输速度和可靠性。
2,
优化数据结构:
使用数据库索引、缓存,加快数据查询速度
[4],压测数据,环境,具体的过程是
[5],常规算法都懂吗,说一下
[6],实习最早什么时候可以到岗,学校/家离公司远吗
[7],了解中望吗,CAD和CAx的区别,为什么想来中望
[8],大一大二学了什么课程
[9],为什么要投中望,对卷的定义是
[10],学校课程怎么办
[11],入伍经历
[12],公司氛围
[13],反问
#中望##一面##面经##实习##C++##日常实习#
忘记记录了😂....
25分钟,15分钟问C++和项目,10分钟闲聊....感觉是不是凉了,,,项目的很多东西没问,主要自己没引导好,而且八股没开始背,面试官问的几个问题答的都不好
(以下打乱顺序)
[1],
new 和 malloc 的区别
[2],
Windows下和Linux下,C++的区别,或者编译的区别
1,编译器差异:
1)Windows:主要有Visual C++编译器(MSVC),可以使用Visual Studio集成开发环境进行开发。也支持使用GNU编译器套件(如MinGW)或Clang进行编译
2)Linux:常用的是GNU编译器套件(GCC)和Clang。通常使用命令行进行编译,也可以使用各种集成开发环境(如Eclipse、Code::Blocks)
2,
系统调用差异:
1)Windows:通常使用Windows API进行系统调用,例如文件操作、进程管理等。
2)Linux:通常使用POSIX API进行系统调用,与UNIX系统兼容,例如fork()、exec()等。
3,
开发环境和工具链:
1)Windows:常用的集成开发环境有Visual Studio,也可以使用MinGW、Cygwin等工具链。
2)Linux:开发者可以选择使用命令行工具链、各种文本编辑器和集成开发环境。
4,
标准库和系统库:
[3],项目压测,每秒传输数据量 148万 bytes,为什么那么低
1,
实施负载均衡:
将数据流量均匀地分配到多个服务器上,避免单点故障,并提高数据传输速度和可靠性。
2,
优化数据结构:
使用数据库索引、缓存,加快数据查询速度
[4],压测数据,环境,具体的过程是
[5],常规算法都懂吗,说一下
[6],实习最早什么时候可以到岗,学校/家离公司远吗
[7],了解中望吗,CAD和CAx的区别,为什么想来中望
[8],大一大二学了什么课程
[9],为什么要投中望,对卷的定义是
[10],学校课程怎么办
[11],入伍经历
[12],公司氛围
[13],反问
#中望##一面##面经##实习##C++##日常实习#
全部评论
谢谢你
面试不过的原因(第 2 次反思):
项目不够熟悉,虽然自己花了实打实的100个小时,源码也手撕了2遍,也写了10多万字文字来分析记录总结,画了20~30个流程图来梳理,,,但是,没有说真正系统背过,很多东西只是有个印象,离在面试官面前侃侃而谈,还有段距离。。。。。加上八股没背,因为项目中的很多知识点,其实都可以联系到八股的,,,,如果八股背了,那么项目也会说的流畅很多
兄弟哪投的呀,为啥我一直没进度
[1]new和malloc区别(详解):
1)异常处理:new分配内存失败抛出 bad_alloc 异常;malloc分配内存失败返回 NULL
2)内存块:new不需要指定内存块大小,编译器会根据类型自动确认;malloc 需要显式指定内存块大小
3)初始化:new 是 C++运算符,调用构造函数初始化;malloc 是C语言库函数,不会调用构造函数,需要手动初始化
4)内存分配为止:new 在自由存储区,malloc 在堆区,当然自由存储区本质也是堆区,但是前者是逻辑概念,后者是物理概念
5)内存释放:delete 调用析构函数,并将指针设置为 nullptr;free 不会调用析构,不会将指针设为 nullptr,可能产生野指针
6)数组释放:delete 可正确释放 new[] 分配的数组;free 不了解数组大小,不能释放 malloc 分配的数组
关于 [3] 的补充(压测的 148万 bytes 每秒)(大写的 B 是 bytes,小写的 b 是 bit,也就是比特)
1)首先,这里的 1bytes = 8bit,所以 148万bytes/s = 1.48M/s = 1.48MB/s = 11.8Mb/s = 11.8Mbps
2)原因:
a. 传输协议:有些协议包含较大的控制信息头,会降低效率;高并发连接也会增加协议握手,保持连接,重传等机制带来的开销(措施:可以优化传输协议,比如TCP/IP协议栈窗口大小的调整,快速重传和恢复机制的优化)
b. 硬件:可以从增加带宽(千兆万兆网络或Wi-Fi 6),升级硬件(高速网卡,高性能存储设备SSD)两方面考虑
c. 并发模型:异步I/O,多线程,负载均衡,数据压缩等方向
d. 网络拥塞和流量控制
e. 服务器本身的处理能力:数据库连接池不足,线程池饱和,I/O瓶颈等
补充(虽然Mysql数据库和Linux,都学过,但是都快一年没碰了,所以面试时答得很差。。。还是得好好背下八股,回头复习下)
【14】Linux常用命令
ls:列出目录内容。
cd:改变当前工作目录。
pwd:显示当前工作目录的路径。
mkdir:创建新目录。
rm:删除文件或目录。
cp:复制文件或目录。
mv:移动文件或目录,也可用于重命名文件或目录。
cat:连接文件并打印到标准输出设备。
grep:在文件中搜索指定模式。
sudo:以超级用户权限执行命令。
面试不过的原因:
你简历写了熟悉C++,结果new和malloc的区别不懂,Linux和Windows下C++的区别也不懂。
写了熟悉Linux基本命令,结果问了你支支吾吾半天说不上来
(边面边记吧,争取上一次面试出现的问题,以后都能答上来)
【15】介绍下你的项目(之前答的很差,明明总结过两遍,还细细研究过,一个多月不看又忘的七七八八了,这里重新整理下):
1)
首先,最外层是线程池,是半同步/半反应堆线程池,这里的半同步/半反应堆的具体工作流程是,以 Proactor 为例:
主线程充当异步线程,如果 socket 上有事件发生,主线程读取后将数据封装成请求对象插入请求队列,然后请求队列上的工作线程,通过竞争获得任务接管权
这里通过一个工作队列,解除了主线程和工作线程的耦合关系
具体实现呢,有 5 部分,类定义,线程池的创建和回收,向请求队列添加任务,线程处理函数 work() 和 执行任务函数 run()
5 部分结合起来,就是常考的手撕线程池
2)
第二个呢,就是日志系统,项目中的日志系统是异步实现的,为什么不用同步呢,因为同步时,写入函数和工作线程是 串行的,当单条日志比较大,或者峰值的时候,写日志就会成为性能瓶颈。
而异步会将日志内容先存入阻塞队列,写线程先从阻塞队列取出内容,再写入,就可以避免阻塞。这里实际就是并发编程中经典的生产者/消费者模型,生产者线程和消费者线程共享同一个缓冲区,缓冲区底层是循环数组实现的阻塞队列。
3)
第三个就是定时器模块,可以定期检测非活跃连接,及时释放连接资源。
项目中,具体就是,服务器为每个连接创建一个定时器,定时器放在升序链表中,按超时时间升序排列,到期的定时器会从链表中删除,这里插入定时器的时间复杂度是O(n),删除的复杂度是O(1)
4)
第四个,http 连接的处理,也是本项目最复杂的一部分,整个项目约3000行代码,其中 http 的 .h 和 .cpp 两个文件,就占了800行
分 3 部分请求报文的读取,接收和响应
请求报文接收,涉及到对 http 报文格式和状态码的处理
解析部分,主要是主从状态机这个抽象模型
通过从状态机读取一行,然后由主状态机解析,分别对请求行,请求头和请求内容进行处理,其中解析请求头包含对GET的解析,解析请求内容,包含对POST的解析
响应部分,调用了sys/stat等多个头文件
5)
最后就是数据库连接池,类似前面提到的线程池,本质都是空间换时间,对资源的复用
项目中,使用局部静态变量的懒汉模式,来创建连接池
连接池的释放,通过 RAII 机制封装,避免了手动释放
【16】项目中让你印象最深刻的部分(3分钟)(实际就是,HR给机会你发挥,讲一下你最熟悉的部分,最好可以手撕,,比如线程池的5个部分,各种细节都能讲出来,然后触类旁通一下)
(第一次面试讲不出来情有可原,,,慢慢进步吧,每次面试,实际也是对项目的打磨,,,从支支吾吾到侃侃而谈/旁征博引)
发现一个面试前比较好的备考方法:
根据关键词,在B站,Youtube检索,看2个相关视频,效果还不错
比如“C++智能指针”“设计测试用例”“黑盒白盒”
谢谢
评论区的解答可以看出感觉的能力肯定没有问题,只是面试准备不够充分,不过方便问一下学历背景吗
日常实习吗
相关推荐
点赞 评论 收藏
分享
一笑而过2222:一、Redis 数据类型
1. 字符串(string):可以存储任何类型的字符串,如文本、数字等。可以进行自增自减等操作。
2. 哈希(hash):类似于 Python 的字典,存储键值对集合。适合存储对象信息。
3. 列表(list):按照插入顺序排序的字符串元素集合。可以进行从两端的插入和弹出操作。
4. 集合(set):无序的、不重复的字符串元素集合。支持交集、并集、差集等操作。
5. 有序集合(sorted set):每个元素都关联一个分数,可以按照分数进行排序。常用于排行榜等场景。
二、Redis 跳表
Redis 的有序集合(sorted set)是通过跳表实现的。跳表是一种可以替代平衡树的数据结构,具有以下特点:
1. 插入、删除、查找操作的时间复杂度均为 O(log n),与平衡树相当。
2. 实现相对简单,比起平衡树更易于理解和实现。
3. 可以在不同层次进行快速的遍历和查找,提高了查找效率。
三、抽象类和接口类区别
1. 定义:
- 抽象类是用 abstract 关键字修饰的类,可以包含抽象方法和具体方法。
- 接口是用 interface 关键字定义的,只包含抽象方法和常量。
2. 继承:
- 类只能单继承抽象类,但可以实现多个接口。
3. 方法实现:
- 抽象类可以有部分方法的具体实现,子类可以继承这些实现或者重写它们。
- 接口中的方法都是抽象的,实现接口的类必须实现所有的方法。
4. 变量:
- 抽象类可以包含成员变量,既可以是普通变量也可以是静态变量。
- 接口中只能定义静态常量。
四、重载和重写,子类能否对父类重载重写
1. 重载(Overload):是在同一个类中,方法名相同,但参数列表不同(参数类型、参数个数、参数顺序不同)。子类不能对父类进行重载,因为重载是在同一个类中的概念。
2. 重写(Override):子类继承父类,子类中的方法与父类中的方法具有相同的方法名、参数列表和返回类型,并且子类方法的访问权限不能小于父类方法的访问权限。子类可以对父类进行重写。
查看30道真题和解析
点赞 评论 收藏
分享
10-22 12:27
真理大学 测试开发 点赞 评论 收藏
分享