欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

嵌入式 1

程序员文章站 2022-07-12 10:18:27
...

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.写单链表反转

嵌入式 1

4.TCP和UDP有什么区别

  1. 靠性:TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
  2. 接线:连接与无连接
  3. 时间延不一样:对系统资源的要求(TCP较多,UDP少)
  4. 流模式与数据报模式 
  5. 小: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位)
嵌入式 1

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