目录
一、大华
1. 一面(电话面):
- 介绍项目;
- 项目细节:
- LiteOS与其他操作系统有什么区别?
- 实时操作系统与非实时操作系统的区别?
- 对操作系统内核和原理了解吗?
- 通信协议怎么制定的?
- C++八股:
- new/delete和malloc/free的区别?
- 虚函数和纯虚函数的区别?
- 为什么基类的析构函数要是虚函数?
- 有遇到过死机吗?
1.1 反问:
- 后续流程多久?
- 新人培养?
- 进入公司,工作是怎么分工的?
2. 解析:
1. 华为LiteOS是面向物联网的轻量级物联网操作系统。
优势:高实时性、超小内核,基础内核体积可裁剪至不到10K、低功耗、支持功能静态裁剪
2. 实时操作系统相比于非实时操作系统,它能够在较短时间内对任务进行处理,即实时性。
3. 华为LiteOS基础内核包括 不可裁剪的极小内核 和 可裁剪的其他模块。
极小内核包含任务管理、内存管理、中断管理、异常管理和系统时钟。
可裁剪的模块包括信号量、互斥锁、队列管理、时间管理、软件定时器等。
华为LiteOS的内核详见——《操作系统》
4. 终端和服务器之间除了使用CoAP协议外,还需要指定私有的通信协议。指定的通信协议分为消息头和消息体,消息头由消息类型、响应类型和消息体长度构成,消息体则根据具体的任务进行指定。 补充:项目中使用CoAP协议是因为其更适用于资源受限的情况。
5. new和delete是关键字,而malloc/free是库函数;new无需指定开辟空间的大小且会调用对象的构造函数进行初始化,而malloc需要;delete指令会先调用对象的析构函数,然后调用free进行内存释放。
6. 虚函数必须实现,否则将编译报错;纯虚函数一定没有定义。虚函数,子类可以(也可以不)重写基类的虚函数;对于纯虚函数,子类必须对纯虚函数进行实现
7. 在C++中使用多态,如果使用基类的指针来删除指向派生类的对象,那么只有基类的析构函数会被调用,将导致派生类中资源无法正确释放,进而导致内存泄露或资源泄露等问题。为了避免这些问题,通常需要将C++类中的析构函数声明为虚函数,使得基类指针指向派生类对象时能正确调用派生类的析构函数。
8. 对于嵌入式处理器,导致死机的软件操作一般有:1)访问非法内存(程序对flash直接进行写操作,即把flash的存储空间当成了内存空间,直接进行了写操作);2)各种外设的寄存器操作不正确导致的硬件故障。需要找到对内存进行非法访问的代码。
3. 二面(视频面):
- 自我介绍;
- 介绍课题;
- 使用的什么操作系统,对操作系统的原理、内存管理熟悉吗?
- 研究生期间有数据结构和算法课程吗?
- 联合体用过吗?有什么优点?
- 链表怎么排序?可以使用哪些排序算法?
- 野指针怎么产生的?
- 访问释放的内存的场景?回答了深浅拷贝,多线程存在这种情况吗?
- 能返回局部变量的地址吗?
- malloc 和 strcpy会导致内存泄露吗?
- 二级指针用过吗?
4. 解析:
1. 操作系统原理、内存管理详见——《Huawei LiteOS内核讲解》;
内存大小计算规则:最大成员所占字节且为最大数据类型所对应字节的最小整数倍进行计算。
联合体的优缺点:
- Union联合体中各变量时互斥的,任何两个成员不会同时有效,内存使用更加精细灵活,节省内存空间;(当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体)
- 共用体所有成员占用同一段内存,修改一个成员会影响其余所有成员。
2. 排序算法详见——《排序细说》
3. 野指针产生的原因:
1)指针未进行初始化;2)指针访问的地址空间被释放;3)指针操作超越了作用域;
解决方法:1)初始化置NULL;2)指针释放后置NULL;3)使用智能指针;
4. 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一摸一样的对象,新旧对象不共享内存,修改新对象不会改到原对象。
浅拷贝容易导致内存的重复释放,多线程可能存在对同一资源的共享。
5. c语言函数是不能返回局部变量地址(特指存放在栈区的局部变量地址),局部变量的作用域指在函数内,程序调用完函数后,局部变量会被释放。其地址指向的内容不确定。
6. malloc为动态内态内存分配函数,可以申请一块连续的内存空间,可以根据需要指定申请内存的大小。1)若申请内存后,未调用free进行释放,那么会出现“内存泄露”的问题;
strcpy是把要复制的字符串复制到目标地址,需要注意的是如果目标数组内存空间不够大,可能会造成缓冲溢出的情况。
7. 二级指针就是指向指针的指针,是一种多级间接寻址的形式。二级指针的使用:1)传参(需要在函数内部改变指针的值)、2)链表操作(删除链表)
二、迈普(已凉)
1. 一面:
- 自我介绍;
- 项目介绍和细节:
- 通信协议怎么制定的?
- 使用的什么通信协议?回答的MQTT,基于TCP协议
- 为什么不直接用TCP?
- 项目难点?
- 华为LiteOS是抢占式的实时操作系统,那么高优先级任务的资源被正在运行的低优先级占用,该如何处理呢?
1.1 反问:
- 后续流程速度?
- 新人培养?
2. 解析
1. 终端和服务器之间除了使用CoAP协议外,还需要指定私有的通信协议。指定的通信协议分为消息头和消息体,消息头由消息类型、响应类型和消息体长度构成,消息体则根据具体的任务进行指定。 补充:项目中使用CoAP协议是因为其更适用于资源受限的情况。
2. 项目中使用CoAP协议是因为其更适用于资源受限的情况;
3. 一个是传输层、一个是应用层;
4. 项目难点,说了摆药的重量问题
5. 抢占式的实时操作系统,那么高优先级能够对需要的资源进行抢占。