面试遇到问题干货整理(一)

 对于很多问题的答案,部分从网络上拿过来,或者是在书上看到的,也包括自学的一部分内容。有错误可以提出。
 有些是面试中经常遇到的,但就是记不住,没有深刻理解。不断更新中。。。。。

1.简述ARM指令和Thumb指令(大疆)

解答:在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。而ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已。
ARM状态:arm处理器工作于32位指令的状态,所有指令均为32位;
Thumb状态:arm执行16位指令的状态,即16位状态;
thumb-2状态:这个状态是ARM7版本的ARM处理器所具有的新的状态,新的thumb-2内核技术兼有16位及32位指令,实现了更高的性能,更有效的功耗及更少地占用内存。总的来说,感觉这个状态除了兼有arm和thumb的优点外,还在这两种状态上有所提升,优化;
调试状态:处理器停机时进入调试状态。
也就是说:ARM状态,此时处理器执行32位的字对齐的ARM指令;Thumb状态,此时处理器执行16位的,半字对齐的THUMB指令。
几个注意点:
ARM处理器复位后开始执行代码时总是只处于ARM状态;
Cortex-M3只有Thumb-2状态和调试状态;
由于Thumb-2具有16位/32位指令功能,因此有了thumb-2就无需Thumb了。
另外,具有Thumb-2技术的ARM处理器也无需再ARM状态和Thumb-2状态间进行切换了,因为thumb-2具有32位指令功能。

2.下面代码片段中有哪些隐患或者错误(云从)

void *get1(){
char buf[12] = {“abc”};
return buf;
}
void get2(int *p){
p = new int[10];
}
int main(){
int *m;
get2(m);
m = get1();
memcpy(m, “aaa”, 3);
return 0;
}
1.首先调用get2(m)的时候,因为是值传递,无法修改m的实际值,即无法将new申请的内存地址传出。
2.再者调用get1(m)的时候,函数内定义的数组是局部变量,对应的内存在这个函数结束的时候就会被释放,因此返回的地址是无效的,调用这样的地址造成严重错误。
3.最后调用memcpy(m,“aaa”,3)往一个没有权限的无效内存空间拷贝数据是非法的。
如果函数的参数是指针,避免用该指针去动态申请内存。如果想用记得使用二级指针。(云从面试)

3.简述SPI IIC UART接口的区别和各自收发数据的方法(大疆)

1、名字上的区别:
 SPI: (Serial Peripheral Interface),串行外设接口
 IIC: (INTER IC BUS),IC之间的总线
 UART: (Universal Asynchronous Receiver Transmitter),通用异步收发器
2、电气信号上的区别
A.SPI总线主要由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设备互相连接。主从设备可以实现全双工通信,当有多个从设备是,还可以增加一条从设备选择线。
B.IIC总线是双向、两线(SCL、SDA)、串行、多控接口标准,具有总线仲裁机制,非常适合器件之间近距离、非经常性的数据通信。
C.UART总线是异步串口,一般由波特率产生器、UART接收器、UART发送器组成,硬件上有两根线,发送与接收各占一根线。
3、SPI和UART可以实现全双工,但是IIC不行。
1.UART是全双工通信方式,两根数据线RX和TX,通信时双方需要共地,数据的传输速度由波特率决定,所以每位数据的收发完全依靠精确的时间来控制。
2.IIC总线是半双工通信方式,支持一个主机多个从机,在通信时主机必须固定,通过地址来区分从机,两根数据线SCL,SDA,数据的收发依靠时钟线进行控制。 3.SPI总线是全双工通信方式,支持一个主机多个从机,通信是主机可以发生改变,是真正的多主机总线,4跟数据线,CS,MISO,MOSI,SCL,通过片选线来控制与哪个从机进行通信,通过时钟线控制数据收发。

4.简述static关键字对于工程模块化的作用(阿里,华为,支付宝)

解答:static主要定义全局静态变量、局部静态变量、静态函数。
定义全局静态变量,有以下特点:在全局数据区分配内存。如果没有初始化,其默认值为0.该变量在文件内从定义开始到文件结束可见。
局部静态变量:该变量在全局数据区分配内存,如果不显示初始化,那么将被隐式初始化为0,它始终驻留在全局数据区,直到程序运行结束,其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。
定义静态函数:静态函数只能在本源文件中使用,在文件作用域中声明的inline函数默认为static类型 。
Extern:将变量和函数声明为外部链接,仅仅是一个变量的声明,其并不是定义,因为不会分配内存空间。定义多次的话会报错。

5.复位电路的原理(诺瓦)

复位电路

6.TCP和UDP的区别?(诺瓦)

1)UDP是无连接的,即发送数据之前不需要建立连接。
2)UDP使用尽最大努力交付,即不保证可靠交付,同时也不能使用拥塞控制。
3)UDP是面向报文的,UDP没有拥塞控制,很适合多媒体通信要求。
4)UDP支持1对1,1对多,多对1和多对多的交互通信。
5)UDP的首部开销小,只有8个字节。
6)TCP是面向连接的运输层协议
7)每一条TCP连接智能有两个端点,每一条TCP连接只能是点对点
8)TCP提供可靠的交付的服务
9)TCP提供全双工通道
10)TCP是面向字节流的
11)首部最低20字节

7.试描述TCP建立和断开连接时的三次握手和四次挥手(阿里)

网上更详细

8.打开一个网站的时候,发生了什么(小米)

  1. 在浏览器里输入要网址:
  2. 浏览器查找域名的 IP 地址
  3. 浏览器给 web 服务器发送一个 HTTP 请求
  4. facebook 服务的永久重定向响应
  5. 浏览器跟踪重定向地址
  6. 服务器“处理”请求
  7. 服务器发回一个 HTML 响应
  8. 浏览器开始显示 HTML
  9. 浏览器发送获取嵌入在 HTML 中的对象
  10. 浏览器发送异步(AJAX)请求

9.子进程 父进程(诺瓦,大疆)

子进程继承父进程
○ 用户号 UIDs 和用户组号 GIDs
○ 环境 Environment
○ 堆栈
○ 共享内存
○ 打开文件的描述符
○ 执行时关闭(Close-on-exec)标志
○ 信号(Signal)控制设定
○ 进程组号
○ 当前工作目录
○ 根目录
○ 文件方式创建屏蔽字
○ 资源限制
○ 控制终端
子进程独有
○ 进程号 PID
○ 不同的父进程号
○ 自己的文件描述符和目录流的拷贝
○ 子进程不继承父进程的进程正文(text),数据和其他锁定内存(memory locks)
○ 不继承异步输入和输出
● 父进程和子进程拥有独立的地址空间和 PID 参数。
● 子进程从父进程继承了用户号和用户组号,用户信息,目录信息,环境(表),打开的
文件描述符,堆栈,(共享)内存等。
● 经过 fork()以后,父进程和子进程拥有相同内容的代码段、数据段和用户堆栈,就像父
进程把自己克隆了一遍。事实上,父进程只复制了自己的 PCB 块。而代码段,数据段和用
户堆栈内存空间并没有复制一份,而是与子进程共享。只有当子进程在运行中出现写操作
时,才会产生中断,并为子进程分配内存空间。由于父进程的 PCB 和子进程的一样,所以
在 PCB 中断中所记录的父进程占有的资源,也是与子进程共享使用的。这里的“共享”一词
意味着“竞争”
● 父进程和子进程拥有独立的地址空间和 PID 参数,所以子进程不会继承父进程的地址空

● 子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程 ID 和父进程 ID 不同
父进程和子进程拥有独立的地址空间和 PID 参数
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。

10.孤儿进程和僵尸进程(CVTE)

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为
孤儿进程。孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集
工作。
僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或
waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称
之为僵死进程。

你可能感兴趣的:(面试经验总结)