嵌入式 1
1.结构体字节对齐?(给了个只有Int、char类型的结构体,32位机器,求大小,然后问字节对齐问题)
class A
{
int i;//4个字节
union U
{
char buff[13];
int i;
}u; //16个字节
void foo() { }
typedef char* (*f)(void*); //0字节
enum{red, green, blue} color; //4个字节
}a;
sizeof(a)的值是()
20
21
22
24
非以上选项
2手写字符串拷贝函数
char *strcpy_v2(char *dest , const char *src)
{
char *d = dest;
char c;
while((c=*src++) != '\0')
{
*(dest++)=c;
}
*dest='\0';
return d;
}
3.写单链表反转
4.TCP和UDP有什么区别
- 可靠性:TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
- 连接线:连接与无连接
- 时间延时不一样:对系统资源的要求(TCP较多,UDP少)
- 模式:流模式与数据报模式
- 大小:UDP程序结构较简单;
5.TCP如何保证可靠性传输?
1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。
2、数据校验
3、数据合理分片和排序:
4、流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
5、拥塞控制:当网络拥塞时,减少数据的发送。
6.TCP的四个定时器?
(1)超时重传定时器:在发送端发送数据后,启动超时重传定时器,在给定时间内没有收到对端发送的确认消息,此定时器超时,发送端重新发送数据,并将此定时器复位。
(2)坚持定时器:发送端给接收端发送一部分数据后,接收端的缓存已满无法在接收数据,就向接收端发送一个滑窗大小为0的ACK通知发送方停止发送数据,接收方收到此消息后,启动坚持定时器,并向接收方发送大小为1个字节的探测报文,在定时器超时后还未收到接收端窗口更新的消息,将坚持定时器加倍并复位,直到坚持定时器已达max=60s,接下来就每隔60s发送探测报文,直到收到接收端的窗口更新消息。
(3)保活定时器:在一个TCP成功连接后,接收端在收到一次发送方的数据后,会启动一个保活定时器,时间为2h,如果此定时器超时,发送方会每隔75s发送一个探测报文,在尝试10次以后,发送方就可以断开这个连接。
(4)2MS定时器:此定时器是为了处理TCP连接中主动断开连接的一方处于TIME_WAIT状态而设置的,大小为2MSL(数据包在网络上存活的最大时长的两倍,即一个往返时间),处于此状态的一方无法立即建立新的连接,设置此状态下的定时器有连个作用,其一,防止断开连接时的最后一个ACK丢失,保证TCP连接的可靠性;其二,防止旧的连接上传送的脏数据被新的连接收到。
7.如何TCP粘包问题?
方法:使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容;设置定长消息,服务端每次读取既定长度的内容作为一条完整消;设置消息边界,服务端从网络流中按消息编辑分离出消息内容;
8.如何查看耗时最大的函数?使用什么工具?
最常用的是opreport,这个可以给出image和symbols的信息,比如我想得到每个函数的执行时间占用比例等信息,用来发现系统性能瓶颈。opannotate可以对源码进行注释,指出哪个地方占用时间比较多;https://blog.csdn.net/davie1love/article/details/47044555
9.epoll和select的区别?
epoll不需要通过遍历的方式,而是在内核中建立了file节点,并且通过注册响应事件的方式,当有响应事件发生时采取相应的措施,并把准备就绪的事件放入链表中,从而epoll只关心链表中是否有数据即可;
select的效率低于epoll,因为它需要大量拷贝fd_set,并且需要不断遍历监听列表,而epoll这种基于响应事件的方式明显会更具优势;
10.http过程:一个完整的HTTP请求过程 整个流程 8个步骤
域名解析 —> 与服务器建立连接 —> 发起HTTP请求 —> 服务器响应HTTP请求,浏览器得到html代码 —> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片) —> 浏览器对页面进行渲染呈现给用户
11.linux内核启动先打开哪个文件?
arm为例arch/arm/kernel/head-armv.S
12.2c时序描述(从设备地址8位)
13.宏定义需要注意什么?https://blog.csdn.net/iteye_10770/article/details/81855069
宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换
宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用# undef命令
宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换
宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换
习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母
可用宏定义表示数据类型,使书写方便
14..C/C++编译程序内存分布:
堆,栈,常量,静态,数据
15.如何定义变长结构体?
定义一个成员是个指向数组的指针就行
16.函数指针和指针函数的区别?
函数指针:指向函数的指针;指针函数:返回为指针变量的函数
17.strcpy的弊端?
strcpy无法判断源字符串是否比目的字符串长度大,即无法判断数据溢出的情况
18.Linux启动过程:https://blog.csdn.net/perfect1t/article/details/81741531:
要包括: zImage 解压缩阶段、 vmlinux 启动汇编阶段、 startkernel 到创建第一个进程阶段三个部分,一般将其称为 linux 内核启动一、二、三阶段
19.TCP的退避机制,拥塞控制?
20.问OS的用户态和内核态的区别,什么情况下会触发从用户态到内核态的切换
a.系统调用 b.异常 c.外围设备的中断
21. C和C++的区别
1、语言bai使用难du度不同
C++难度大于C#大于C语言。
2、面zhi向的对dao象zhuan不同
C 语言是面向过程shu的,而 C++ 是面向对象的,C# 是一种完全面向对象的语言。
3、函数形式不同
C 语言有标准的函数库,它们松散的,只是把功能相同的函数放在一个头文件中;
而 C++ 对于大多数的函数都是有集成的很紧密,特别是 C 语言中没有的 C++ 中的 API 是对 Window 系统的大多数 API 有机的组合,是一个集体。
C++ 不允许在一个构造函数中调用另外一个构造函数(称为委派构造函数调用),而 C# 则允许。
4、图形处理能力不同
C 语言标准中不包括图形处理。
22.命名空间的作用
使用命名空间解决名字冲突
23.问怎么求一棵二叉树的最大路径
找到二叉树的一条路径使这条路径的和最大,这个路径可以从一个点开始也可以从任意一个点结束。
思路就是递归求出左右孩子路径的和,只要此路径的和大于0,那么就可以把这条路径加入到二叉树的最大路径当中。所以可能的情况就是,
1)root
2)root+左边某条路径
3)root+右边某条路径
4)root+左边某条路径+右边某条路径
24. 抛硬币吃苹果,抛到正面的人可以吃苹果,问先手的人吃到苹果的概率
假设第一个人抛中概率为P,第一次第一个人未中为1/2 ,而此人第二次的时候抛说明第二个人仍然未中,此人后续抛中概率为(1/2)*(1/2)*P.
而此人此处抛中为 P = 1/2 + 1/4 P ===> P = 2/3
上一篇: 嵌入式笔试知识点