从各个网站上看到的面试题

嵌入式面试题

大华

  1. UART串口通信的波特率,常用波特率有哪些,串口通信校验方式是什么,有校验和无校验的区别
    4800/9600/115200/460800
    校验方式:和校验、奇偶校验、无校验

  2. iic收发数据的流程
    起始信号(信号跳变)->发送设备地址(7位地址+1位读写位)->ACK->收发数据->再次ACK->停止信号(信号跳变)

  3. iic子系统的组成部分
    我觉得iic子系统主要由三部分组成,首先是iic核心,负责各类信号的起始信号,应答信号,终止信号的产生,然后是iic驱动,负责实现iic从机读取和写入,然后是iic应用层,实现具体的应用。

  4. SPI收发数据的流程
    片选信号拉低->发送数据->接收数据->片选信号拉高

  5. wifi协议的通讯过程
    wifi协议在网络连接中主要工作在物理层和数据链路层,通过路由器发射出来的2.4G/5G信号的SSID,
    发送建立连接的请求,接着通过加密算法进行通讯,通过多个数据包进行数据的传输,最后通过断开连接的请求断开连接。

感觉大华主要是以通讯协议为主

联想

  1. 物理地址和虚拟地址
    主要想问的应该是物理地址在实际的内存条上,虚拟地址由CPU生成,每个程序都以为自己拥有一个连续的内存空间,但是实际上是不连续的,由操作系统进行管理。
    物理地址和虚拟地址的映射由MMU实现

  2. 进程调度算法有哪些
    先来先服务,短作业优先,优先级制度,时间片轮转,多级反馈队列

  3. 什么是上下文,上下文切换
    这里想问的应该是在进行上下文切换的时候需要保存的信息,比如说寄存器的值,程序计数器的值,栈指针的值,还有一些其他的信息,比如说进程的状态,进程的优先级等等。
    寄存器状态:这包括程序计数器(PC)和所有其他寄存器的当前值。
    堆栈信息:程序运行过程中的局部变量、返回地址以及函数调用的堆栈信息。
    内存状态:包括代码、数据、堆和栈等的内存布局和状态。
    全局变量:程序中所有的全局变量及其值。
    文件和I/O状态:包括程序打开的文件描述符、网络连接以及其他I/O设备的状态。
    其他运行时信息:比如程序优先级、信号处理状态、资源使用信息等。

  4. 什么是死锁,死锁的必要条件,死锁的解决方法
    死锁是指两个或者多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些进程都将无法向前推进。
    死锁的必要条件:互斥条件、请求和保持条件、不剥夺条件、环路等待条件

  5. new和malloc的区别,new分配内存的时候一定是调用的malloc吗
    new和malloc的区别:new是C++的运算符,malloc是C的库函数,new会调用构造函数,malloc不会,new返回的是对象类型的指针,malloc返回的是void*类型的指针,new分配内存失败会抛出异常,malloc分配内存失败会返回NULL。不一定,看编译器的实现,一般是调用更底层的sbrk或者mmap

  6. c语言函数的esp(堆指针)和ebp(基指针 )的变化过程
    保存旧的ebp,然后设置新的ebp,然后压栈,然后执行函数体,然后出栈,恢复旧的ebp
    而esp会从当前旧的ebp开始,不断向下,当函数返回时候,esp会恢复到函数调用前的位置

  7. 普通二叉搜索树的缺点,bfs、红黑树是为了解决什么问题的
    普通二叉树在插入和删除的时候,可能会导致树的不平衡,从而导致查找的效率降低,bfs和红黑树都是为了解决这个问题的

其他

  1. 为什么要有多层地址
    多层地址是计算机网络中的一个概念,是指在计算机网络模型中,包括OSI模型或TCP/IP模型等,数据包在不同的网络层级上会有不同的地址表示形式。这些地址在每一层上都有其特定的意义和功能

  2. 目的 判断内存泄漏 通过查看多个时间线的未释放内存大小来判断
    内存池、检查工具、代码审查、重载new和delete、智能指针

  3. 公有函数知道谁调用
    没看懂

  4. 函数调用栈追溯原理
    程序在运行过程中,每当调用一个函数时,都会将该函数以及相关信息(如函数的参数值,返回地址等)压入一个叫做调用栈(或执行堆栈)的数据结构中。

当一个函数执行完毕后,其信息会从调用栈中弹出,程序执行权返回给之前调用这个函数的函数(也就是这个函数的返回地址所指向的位置)。

如果在程序运行过程中发生错误(如异常或错误的触发),我们可以查看此时的调用栈,也就是从当前正在执行的函数开始,一直追溯到最初启动程序的函数,这个过程就叫做函数调用栈的追溯。
5. 函数地址获取函数名
可以通过函数名获取地址,但是反过来好像是不ok的
6. 不同进程的main栈帧地址
7. map里面存放各个动态库始末地址
8. map程序运行记录一次就可以?
在Linux系统中,每一个进程都有一个/proc/<pid>/maps文件,该文件记录了进程的内存映射,其中就包括各个动态库的加载地址范围。
这个maps文件中的每一行,都对应了一段内存区域的映射信息。每行的格式如下:
9. 动态库和可执行文件分开运行 代码段分开的 数据段共享
当动态库和可执行文件一起工作时,它们的代码段是分开的,它们各自在内存中有自己的代码段。这是因为,可执行文件和动态库的代码是分别编译的,它们的代码逻辑和指令都可能完全不同,因此需要分开存储。

然而,它们的数据段是可以共享的,但这需要满足以下条件:一是动态库必须是以共享方式加载的,也就是说,多个程序可以同时链接到同一个动态库并使用它的数据;二是具体的数据项必须被声明为共享的,也就是说,这个数据项是可以被多个运行的程序共享的。这样,当一个程序修改了这个数据项,其他链接到这个库的程序也能看到这个改变。
10. 动态库在不同进程虚拟地址不一样 物理地址一样 库的副本共享代码段和常量
动态库在不同进程虚拟地址不一样 物理地址一样 库的副本共享代码段和常量
11. 动态库和静态库
12. 虚拟地址和物理地址
13. 虚拟内存的好处
程序内存隔离、内存管理简化、程序装载和运行灵活、支持多任务和并发执行、保护系统内存
14. TCP协议收发数据需要应答
连接建立:在发送数据之前,发送方和接收方需要先建立TCP连接。这个过程通常称为“三次握手”。发送方首先发送一个SYN报文段来请求建立连接,接收方收到后回复一个SYN+ACK报文段,然后发送方再回复一个ACK报文段,至此,连接建立成功。

数据传输:连接建立后,发送方可以开始发送数据。每发送一个TCP报文段,就会启动一个定时器,如果在定时器超时之前没有收到接收方的ACK应答,发送方就会重新发送该报文段。

连接终止:数据传输完成后,任何一方都可以发起断开连接的请求。这个过程通常称为“四次挥手”。发送方首先发送一个FIN报文段来请求断开连接,接收方收到后回复一个ACK报文段并发送一个FIN报文段,然后发送方再回复一个ACK报文段,至此,连接成功断开。
15. init函数为什么在main函数之前
16. dlopen和dlsym
dlopen动态加载动态链接库,dlsym获取动态链接库中的函数地址
17. 符号表
符号表(Symbol Table)是编译器或链接器用来存储程序中定义和引用的所有符号(如变量名,函数名)的数据结构。符号表会记录符号的名称、类型、作用域以及其他重要信息。

在编译阶段,当源代码中的每个新的变量或函数被声明时,编译器就会在符号表中为其设置一条记录。当源代码中的符号被引用时,编译器会查找符号表以确定该符号的属性和位置。

在链接阶段,链接器会使用编译单元中的符号表来解决源代码中的外部符号引用,即在一个文件中定义,在其他文件中引用的符号。

在动态链接过程中,动态链接器还会使用符号表来解析共享库中的符号引用。

总的来说,符号表在编译、链接以及程序运行时的动态链接过程中都发挥着重要作用,可以看作是源代码到可执行代码转换过程的"桥梁"。

  1. C++的多态的实现
    编译时多态:这是通过函数重载和运算符重载实现的。函数重载是在同一作用域内定义多个函数名相同但参数列表不同的函数。运算符重载是给已有的运算符赋予多种运算性能。

运行时多态:这是通过虚函数来实现的。虚函数是在基类中定义的,通过在函数前加上关键字virtual来声明。在派生类中可以对基类的虚函数进行重写。当指针或引用指向的对象在运行时改变时,调用的虚函数也会相应改变,这就实现了运行时多态。

RTOS

  1. 请介绍一下你有哪些嵌入式系统的开发经验?
  2. 你能解释一下实时操作系统RTOS是什么吗?能否举例说明其在嵌入式系统中的应用?
  3. 嵌入式系统中常常会使用到中断。能否解释一下什么是中断以及中断服务例程(ISR)?
  4. 当一个中断发生时,处理器会保存其当前执行的任务的上下文,包括程序计数器、处理器状态字及部分或全部寄存器的内容,然后跳转到一个预设的地址开始执行中断服务程序。此过程被称为“中断处理”。

中断服务例程(ISR)是当中断事件发生时由处理器执行的程序。
4. 请解释一下什么是微控制器(Microcontroller)?它与微处理器有什么不同?
5. 你是如何理解嵌入式系统中的多任务并发问题的?如何处理这种问题?
任务调度:这是处理并发问题的主要方法,也是最复杂的部分。任务调度是操作系统的核心功能之一,它负责决定哪个任务应该在什么时候运行。嵌入式系统中常用的任务调度策略有优先级调度、轮询调度、时间片轮转调度等。
资源管理:在多任务并发的环境中,任务之间可能会出现对同一资源的争用,这就可能会导致数据不一致或者其他问题。为了解决这个问题,需要引入资源管理机制,如信号量、互斥量等,来控制对资源的访问。
中断处理:在嵌入式系统中,中断是一种常见的并发事件。对中断的处理需要尽可能快,以避免阻塞其他任务。中断服务例程(ISR)作为一种特殊的任务,其设计和实现需要特别注意。
实时性考虑:嵌入式系统往往要求具有较高的实时性,即对任务的响应和处理需要在一定的时间内完成。为了满足这个要求,可以采用实时操作系统(RTOS)来管理和调度任务,确保关键任务的实时性。
6. 请解释什么是I2C和SPI,它们在嵌入式系统中有什么作用?
7. 请解释一下 watchdog timer 的工作原理以及其在嵌入式系统中的应用。
8. 你能否解释一下什么是DMA(Direct Memory Access)?在嵌入式系统中它有什么应用?
9. 请解释一下在嵌入式系统开发中,为什么要考虑功耗和能耗的问题?
10. 请问你有没有使用过任何嵌入式开发环境或工具,比如:KEIL,IAR,CooCox等?

机器学习

  1. 当训练集与测试集的loss不一致,怎么解决
    判断为过拟合,可以通过增加训练集,增加正则化项,减少特征数,增加dropout等方法来解决

  2. Layer Normalization的作用
    Layer Normalization是对每个样本的每个特征进行归一化,保持数据的稳定性,防止梯度消失

  3. 什么是SVM

操作系统

进程通信和进程同步
互斥锁加锁失败后,线程释放CPU,给其他线程;
自旋锁加锁失败后,线程会忙等待,直到它拿到锁;