八股第四期(内汉百度测开面试题和GDB调试速记图)
UDP报文头
- 源端口
- 目的端口
- 长度:整个数据报的长度
- 检验和:整个数据报的检验和
TCP头部
TCP头部长度有20字节的固定部分
接口测试通常包括以下步骤:
- 定义测试用例:确定测试目标、输入数据和期望输出。
- 选择工具:常用的工具有Postman、SoapUI、JMeter等。
- 配置测试环境:设置测试环境,包括接口地址、请求头和认证信息。
- 执行测试:使用选择的工具发送请求并记录响应。
- 验证结果:对比实际响应与预期结果,检查状态码、响应时间和数据有效性。
- 报告问题:记录和报告发现的缺陷或问题。
- 重复测试:在修复问题后,重复测试以确保接口功能正常。
编写测试用例的一般步骤包括:
- 明确测试目标:确定需要测试的功能或接口。
- 定义测试条件:包括输入数据、前置条件和环境配置。
- 编写测试步骤:详细描述每一步的操作,包括请求的具体内容和操作顺序。
- 预期结果:描述每一步的期望结果或输出。
- 整理测试数据:准备必要的输入数据和测试环境。
- 审查用例:检查用例是否完整、准确并覆盖所有功能点。
- 记录和维护:确保用例文档清晰,便于执行和维护。
内存映射,频繁访问内存,需要使用什么关键字
volatile:这个关键字用于告知编译器,变量的值可能会在任何时刻被外部因素改变,因此编译器在优化时不能假设其值不会变化。
const:如果你希望确保一个内存地址的内容不会被修改,
同步和异步的优点和缺点
同步优点:
简单易理解:代码的执行顺序是线性的,容易跟踪和调试。
数据一致性:由于调用方在等待结果时,数据的一致性较高。
无回调地狱:不需要使用复杂的回调函数,降低了代码复杂度。
缺点:
阻塞:主线程在等待操作完成时会被阻塞,导致效率低下。
响应速度慢:在高延迟操作(如网络请求或文件读写)中,会影响程序的整体响应时间。
不适合高并发:在处理大量并发请求时,同步模型容易造成性能瓶颈。
异步
优点:
非阻塞:主线程可以继续执行其他任务,提升程序的响应速度和效率。
高并发处理:能够同时处理多个任务,适合高负载和高延迟的场景(如网络请求)。
资源利用率高:通过异步编程,能够更好地利用系统资源,尤其是在I/O密集型应用中。
缺点:
复杂性:代码结构较复杂,容易出现“回调地狱”,使得代码难以维护。
调试困难:异步执行的任务顺序不确定,调试时可能难以追踪问题的根源。
状态管理:需要更加小心地管理状态,以防止数据竞态条件和不一致性。
总结
同步适合简单、对实时性要求高、数据一致性重要的场景。
异步适合处理高并发、延迟高的任务,以提高程序性能。
抢占式调度和非抢占式调度的方式
抢占式:
- 时间片轮转:每个任务被分配一个固定的时间片,时间到后强制切换。
- 优先级抢占:如果有更高优先级的任务到达,系统会立即中断当前任务,转而执行高优先级任务
非抢占式调度:
- 先来先服务(FCFS):按照任务到达的顺序依次执行。
- 最短作业优先(SJF):优先执行预计运行时间最短的任务。
嵌入式的地址分布
malloc底层实现是什么 malloc内存分配算法是什么
malloc通常使用一块预先分配的内存区域作为内存池,管理动态内存请求。
分配算法
首次适应(First Fit)
从开头开始搜索,找到第一个合适的空闲块并分配。
b. 最佳适应(Best Fit)
搜索所有空闲块,选择最小的能够满足请求的块,减少碎片。
c. 最差适应(Worst Fit)
选择最大的空闲块进行分配,以期保留较大空间给后续请求。
- 管理空闲块
通过链表或树结构管理空闲内存块,维护它们的大小和状态(已分配或空闲)。
- 合并空闲块
当内存释放时,malloc
会检查相邻的空闲块,合并它们以减少碎片。
- 内存对齐
为提高性能,分配的内存通常会对齐到特定边界(如 8 字节或 16 字节)。
阻塞式I/O与非阻塞式I/O
阻塞式I/O
在阻塞式 I/O 中,I/O 操作会阻塞程序的执行,直到操作完成为止。这意味着程序会在执行 I/O 调用时等待数据的传输完成。
- 简单易用:程序的逻辑流程清晰,易于理解和实现。
- 等待时间:在 I/O 操作期间,程序无法执行其他任务,可能导致效率低下。
- 适用场景:适合对实时性要求不高的应用,如文件读取、简单的网络请求等。
非阻塞式I/O
在非阻塞式 I/O 中,I/O 操作不会阻塞程序的执行。程序可以继续执行其他任务,而 I/O 操作在后台进行。
- 提高效率:允许程序在等待 I/O 完成时执行其他任务,适合高并发场景。
- 复杂性增加:需要管理异步事件和状态,程序逻辑可能变得复杂。
- 适用场景:适合对响应时间要求高的应用,如网络服务器、实时系统等。
C语言内置函数
strcpy() 函数用来复制字符串;strncpy()用来复制字符串的前n个字符,所以要多传一个参数n
char *strcpy(char *dest, const char *src);
char * strncpy(char *dest, const char *src, size_t n);
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。
**strncmp的功能是:**用来比较指定长度两个字符串的大小
int strncmp(const char str1, const char str2, size_t num)
strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串,故要多传一个长度参数,这也使得strncmp比strcmp更加精细。
int memcmp(const void *str1, const void *str2, size_t n)把 str1 和 str2 的前 n 个字节进行比较。void *memcpy(void *dest, const void *src, size_t n)从 src 复制 n 个字符到 dest。
char *strcat(char *dest, const char *src)把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
GDB调试
232和485通信方式
RS-232短距离 低速率
- 单工通信:通常是单向通信,即数据只能在一个方向上传输。
- 点对点通信:通常连接一个发送设备和一个接收设备。
RS-485长距离 高速率
- 双工通信:支持半双工和全双工通信,允许数据在两个方向上同时传输。
- 多点通信:可以连接多个设备,适合网络中多个设备的通信。
电平标准不一样
c++11新特性
自动类型推导(auto
)
范围基于的for循环
智能指针(Smart Pointers)
线程库:C++11引入了对多线程编程的支持
引入了右值引用(&&
)
C++11引入了nullptr
,用于替代NULL
,提供了类型安全的空指针表示。
可以在类中直接为成员变量提供默认值。
在传统的C++中,当对象需要从一个地方传递到另一个地方时,通常是通过值传递,这意味着需要复制对象。对于重对象来说,这种复制代价可能很高,导致性能下降。
右值引用允许你在转移资源时避免不必要的数据副本,提高程序效率。
报文录制:
syslog
journald
journalctl来查看
BFS是一种用于遍历或搜索树或图的算法,它会先访问离起始节点最近的节点,然后再访问下一层的节点,逐层向外扩展。
- 找到最短路径:在无权图中,BFS可以用来找到从起始节点到目标节点的最短路径。
- 广泛应用于网络广播、社交网络分析等场景。
DFS是一种用于遍历或搜索树或图的算法,它会沿着一条路径深入到尽头,然后再回溯到上一个节点,继续探索其他路径
DFS适合用于路径探索、回溯问题。
BFS使用队列结构,通常需要更多的空间来存储待访问节点;DFS则使用栈结构或递归,在深度较大时可能导致栈溢出,但其空间复杂度通常较低。
#通信硬件人笔面经互助##软件开发薪资爆料##我的实习求职记录#心得和八股文(含面试真题) 全部免费