问题71
面试官:
在FreeRTOS中,二值信号量和互斥量的区别?
学生:
互斥型信号量必须是同一个任务申请,同一个任务释放
,其他任务释放无效。同一个任务可以递归申请。二进制信号量,一个任务申请成功后,可以由另一个任务释放
问题72
面试官:
什么情况下会栈溢出,如何避免?
学生:
- 1、
局部数组过大
。当函数内部的数组过大时,有可能导致堆栈溢出 - 2、
递归调用层次太多
。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出 - 3、
指针或数组越界
。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等
解决这类问题的办法有两个, 一是增大栈空间
,二是改用动态分配
,使用堆(heap)而不是栈(stack)
问题73
面试官:
深复制和浅复制的区别?
学生:
浅复制
:被复制对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象深复制
:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不再是原有的那些被引用的对象
问题74
面试官:
C语言结构体怎么定义节省内存?
学生:
- 1、在保证值域足够的情况下,
用小字节变量代替大字节变量
,如用short替代int - 2、
将各成员按其所占字节数从小到大声明
,以尽量减少中间的填补空间(字节对齐) - 3、
可以取消字节对齐
,#pragma pack(1),当然这会牺牲效率,谨慎采用
问题75
面试官:
STM32 中断是怎么进入到中断服务程序的?
学生:
在STM32中,为了区分不同的中断,每个设备有自己的中断号
。系统有0-255一共256个中断。系统有一张中断向量表,用于存放256个中断的中断服务程序入口地址。每个入口地址对应一段代码,即中断服务程序
问题76
面试官:
为什么局部变量未赋值时,每次初始化的结果是不确定的?
学生:
定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定
。因为这段内存空间在栈上,而栈内存是反复使用的,上次用完没清零的,所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是不确定的
问题77
面试官:
Linux的锁机制?
学生:
- 1、互斥锁:mutex,保证在任何时刻,
都只有一个线程访问该资源
,当获取锁操作失败时,线程进入阻塞,等待锁释放 - 2、读写锁:rwlock,
分为读锁和写锁
,处于读操作时,可以运行多个线程同时读。但写时同一时刻只能有一个线程获得写锁 - 3、自旋锁:spinlock,
在任何时刻只能有一个线程访问资源
。但获取锁操作失败时,不会进入睡眠,而是原地自旋,直到锁被释放。这样节省了线程从睡眠到被唤醒的时间消耗,提高效率 - 4、条件锁:就是所谓的条件变量,某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态。一旦条件满足了,即可唤醒该线程(常和互斥锁配合使用)
- 5、信号量
问题78
面试官:
常用的gdb命令?
学生:
- quit:退出gdb,结束调试
- list:查看程序源代码
- reverse-search:字符串用来从当前行向前查找第一个匹配的字符串
- run:程序开始执行
- help list/all:查看帮助信息
- break:设置断点
- break get_sum:以函数名设置断点
- break 行号或者函数名
- if 条件:以条件表达式设置断点
- watch 条件表达式:条件表达式发生改变时程序就会停下来
- next:继续执行下一条语句 ,会把函数当作一条语句执行
- step:继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码
问题79
面试官:
C++ 什么情况下必须用初始化列表?
学生:
- 1、成员类型是
没有默认构造函数的类
。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败 - 2、
const 成员或引用类型的成员
。因为 const 对象或引用类型只能初始化,不能对他们赋值
问题80
面试官:
linux用户态怎么进入内核态?
学生:
linux从用户态到内核态的切换通过系统调用接口来实现
,而系统调用切换时通过软件中断来完成,该中断是程序人员自己开发出的一种正常的异常,那么在Linux下,这个异常具体就是调用int $0x80的汇编指令,这条汇编指令将产生向量为0x80的编程异常
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距
转载:https://blog.csdn.net/qq_42078934/article/details/128785922
查看评论