联发科 嵌入式开发 一面 面经总结
1. 先做个自我介绍吧
参考答案:
面试官您好,我叫XXX,目前是XX大学计算机专业的研究生/本科生。我主要的技术方向是嵌入式Linux开发和C++编程。
在项目经验方面,我做过基于Linux的HTTP服务器项目,使用了epoll实现高并发,用多线程处理请求,还实现了一个高性能的异步日志库。另外我还参与过XX项目,负责XX模块的开发。
技术栈方面,我熟悉C/C++、Linux系统编程、多线程编程、网络编程,了解常用的数据结构和算法。我对嵌入式系统很感兴趣,特别是底层驱动和系统优化方面,希望能在贵公司学习和成长。
2. 你准备实习多长时间?对我们公司有什么了解?
参考答案:
我可以实习6个月左右,如果项目需要可以更长时间。
关于贵公司,我了解到联发科是全球领先的IC设计公司,在手机芯片、物联网、智能家居等领域都有很强的技术实力。特别是天玑系列芯片在性能和功耗方面表现出色。我很希望能加入贵公司,在实际的芯片和嵌入式系统开发中积累经验,学习业界最前沿的技术。
3. 详细介绍一下你的项目,包括背景、开发思路、框架和具体实现
参考答案:
我做的是一个高性能HTTP服务器项目。
项目背景是想深入理解网络编程和并发处理,所以从零开始实现了一个支持高并发的Web服务器。
开发思路上,我采用了Reactor模式,主线程负责监听连接和IO事件,工作线程池负责处理业务逻辑。
框架分为几个模块:网络模块负责socket管理和epoll事件循环,HTTP模块负责协议解析和响应生成,线程池模块负责任务调度,日志模块负责记录运行状态。
具体实现上,主线程使用epoll的边缘触发模式监听所有socket,当有新连接时accept并注册到epoll,当连接可读时读取HTTP请求,解析后封装成任务提交给线程池。工作线程从任务队列取出任务,处理业务逻辑,生成HTTP响应,写回socket。
为了提高性能,我使用了非阻塞IO、连接池、内存池等技术。日志系统采用异步设计,业务线程只写内存队列,专门的日志线程负责刷盘。
整个项目用C++11实现,大概3000行代码,经过压测可以支持上万并发连接,QPS达到几万。
4. 在项目开发过程中,你遇到的最困难的问题是什么?怎么解决的?
参考答案:
最困难的问题是处理高并发时的性能瓶颈。
一开始我用的是水平触发模式,发现并发量上去后CPU占用率很高,但吞吐量上不去。通过性能分析发现,epoll_wait频繁返回相同的事件,导致大量无效的系统调用。
我的解决方案是改用边缘触发模式,配合非阻塞IO。边缘触发只在状态变化时通知一次,需要一次性把数据读完或写完。我修改了读写逻辑,用循环读取直到EAGAIN,写入时如果缓冲区满了就注册EPOLLOUT事件,等可写时继续写。这样改完后,性能提升了好几倍。
另一个问题是多线程访问共享数据的竞争。我一开始用一个全局的连接map,所有线程都要加锁访问,锁竞争很严重。后来我改成每个连接有独立的状态,用原子操作管理引用计数,减少了锁的使用。还用了线程局部存储,每个线程有自己的内存池,避免了内存分配的竞争。
通过这些优化,最终性能达到了预期目标,也让我深刻理解了高并发编程的要点。
5. 说说C++中const关键字的作用和用法
参考答案:
const主要用于定义常量和保护数据不被修改。
const修饰变量表示这个变量不能被修改,必须在定义时初始化。
const修饰指针有两种情况:
const int* p表示指针指向的内容不能改,但指针本身可以改int* const p表示指针本身不能改,但指向的内容可以改const int* const p表示都不能改
const修饰函数参数,表示函数内部不会修改这个参数,常用于引用和指针参数,既避免拷贝开销,又保证不被修改。
const修饰成员函数,表示这个函数不会修改对象的成员变量,可以被const对象调用。const成员函数内部不能修改成员变量,除非成员变量声明为mutable。
const还可以用于函数返回值,返回const引用可以避免拷贝,同时防止返回值被修改。
在类中,const成员变量必须在初始化列表中初始化,不能在构造函数体内赋值。
const的好处是提高代码安全性,编译器会检查是否违反const约束,帮助发现潜在的错误。在接口设计中,合理使用const可以明确表达意图,提高代码可读性。
6. 进程的内存空间一般分为哪几个区?各自存储什么内容?
参考答案:
进程的内存空间从低地址到高地址一般分为几个区:
代码段(text segment):
- 存储程序的机器指令
- 是只读的
- 多个进程可以共享同一份代码段
数据段(data segment):
- 分为初始化数据段和未初始化数据段(BSS)
- 初始化数据段存储已初始化的全局变量和静态变量
- BSS段存储未初始化的全局变量和静态变量
- BSS段在程序加载
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。
查看16道真题和解析