嵌入式软件C/C++(技术面试题)

目录

一,IO进程

二,Internet

三,C


一,IO进程

1.进程和线程区别

(1)共性:二者都为操作系统提供了并发执行能力 

(2)区别: 

调度和资源分配:线程是参与内核调度最小基本单位,进程是拥有资源的最小单位 

地址空间:进程间相互独立,而同一进程内的线程间共享进程内所有资源 

通信:多线程间通信简单,但是需要对临界资源进行互斥与同步操作,多进程间通信较难。 

安全:多线程安全性差,因为其中一个线程崩溃可能会对其它线程造成影响,多进 程间相互独立,安全

2.静态库和动态库的区别

静态库和动态库,本质区别是代码被载入时刻不同。

1) 静态库在程序编译时会被连接到目标代码中。

优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快

缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

2) 动态库是在程序运行时才被载入代码中。

优点:程序在执行时加载动态库,代码体积小;

程序升级更简单;

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行时还需要动态库的存在,移植性较差

3.进程间通信机制有哪些

1)早期的进程间通信:

无名管道、有名管道、信号

  1. systerm V IPC:

共享内存、消息队列、信号灯集

3)BSD:

套接字

4.Fork函数的作用

创建子进程,实现多任务编程

返回值,在父进程中:返回子进程的进程号 >0在子进程中:返回值为0

子进程几乎拷贝了父进程的全部内容

5.什么是僵尸进程和孤儿进程

若父进程先结束,子进程成为孤儿进程,被init进程收养,子进程变成后台进程。

若子进程先结束,父进程如果没有及时回收,子进程变成僵尸进程(要避免僵尸进程产生)

6.什么是守护进程?步骤是什么

特点:守护进程是后台进程;生命周期比较长,从系统启动时开启,系统关闭时结束;它是脱离控制终端且周期执行的进程

1) 创建子进程,父进程退出

2) 在子进程中创建新会话

3) 改变进程运行路径为根目录

4) 重设文件权限掩码

5) 关闭文件描述符

二,Internet

1.TCP和UDP的区别

1.共同点:

同为传输层协议

2.不同点:

TCP:有连接,可靠:无误、数据无丢失、数据无失序、数据无重复

UDP:无连接,不保证可靠

3.应用场合:

TCP:传输质量较高,如qq登陆操作

UDP:对传输质量要求不高,但要保证效率,如qq聊天、语聊、视频。广播和组播

2.Dos(拒绝式服务)攻击? (查阅)
要对服务器实施拒绝服务攻击,主要有以下两种方法: 
①迫使服务器的缓冲区满,不接收新的请求;
②使用IP 欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接,这也是DoS攻击实施的基本思想。

2.三次握手过程:

第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHEDTCP连接成功)状态,完成三次握手

3.TCP是如何保证可靠传输的

校验和:TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。

序列号:TCP 传输时将每个字节的数据都进行了编号,这就是序列号。(为了应对延时抵达和排序混乱)。每个连接都会选择一个初始序列号,初始序列号(视为一个 32 位计数器),会随时间而改变(每 4 微秒加 1)。因此,每一个连接都拥有不同的序列号。序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是 TCP 传输可靠性的保证之一。

确认应答:TCP 传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送 ACK 报文。这个 ACK 报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。

超时重传:超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到 ACK 报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行 ACK 应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送 ACK 应答。那么发送方发送完毕后等待的时间是多少呢?如果这个等待的时间过长,那么会影响 TCP 传输的整体效率,如果等待时间过短,又会导致频繁的发送重复的包。如何权衡?由于 TCP 传输时保证能够在任何环境下都有一个高性能的通信,因此这个最大超时时间(也就是等待的时间)是动态计算的。

连接管理:说白了就是三次握手四次挥手。

流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。

拥塞控制:拥塞控制是 TCP 在传输时尽可能快的将数据传输,并且避免拥塞造成的一系列问题。是可靠性的保证,同时也是维护了传输的高效性。

三,C

中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

  
  __interrupt double compute_area (double radius)
  {
   double area = PI * radius * radius;
   printf(" Area = %f", area);
   return area;
  }
  这个函数有太多的错误了,以至让人不知从何说起了:
  1). ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
  2). ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
  3).在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
  4).与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

1.硬链接和软连接   
 1》 软链接 ln -s (符号链接) 利用文件的路径名来建立的,最好从绝对路径开始
       ln -s 被链接的文件(源文件) 生成的链接文件(目标文件)
       ln -s /home/hq/Desktop/test/1.c softlink.txt
           1) 软链接的属性是l 相当于快捷方式
           2)源文件删除,链接断开,建立源文件之后重新链接
           3)软链接可以链接目录
           4)修改内容都变化
       
    2》硬链接 ln  根据linux系统分配给文件的inode号(ls -i)进行建立的,没办法跨越文件系统
       ln 被链接的文件(源文件) 生成的链接文件(目标文件)
           1)硬链接的属性是- 相当于生成一个副本 起别名
           2)源文件删除链接依然存在
           3)不能链接目录
           4)修改内容都变化

2,typedef和define的区别?
typedef是重定义,只能给变量类型起别名,别名可以直接当这个类型使用。
define是宏定义,只能单纯替换,预处理阶段替换,不进行语法检查,替换的内容可以是常量、变量、表达式、代码段等。

3.new、delete、malloc、free关系
 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

4.Extern的作用
外部引用,引用其他文件中的全局变量或函数
5.指针和数组的区别
指针就是地址,指针变量就是存放地址的变量;指针可以使用简单的运算符操作;指针加一,代表指向下一个元素;对于32位系统,指针占4字节
数组是同类型数据的集合,内存连续。数组名是数组的首地址,是地址常量,不可以进行自加等操作了.
6.什么是指针数组和数组指针
指针数组的本质是数组,数组里存放的是指针。
数组指针的本质是指针,指向数组的指针称为数组指针。(操作二维数组的时候使用过,数组指针;当项目中同一类型的指针较多时,我会把这些指针写到一个集合里面即指针数组)
7.什么是函数指针?具体用法?
本质是指针,指向函数的指针,一般用做函数的参数,实现代码复用,也可以作为结构体成员,指向某个函数
在pthread_create和signal函数中都用过函数指针
8.结构体和共用体区别
二者都是构造数据类型
1)结构体:让C语言实现面向对象的思想。结构体使用的时候,结构体中每一个成员都有自己的内存空间,计算结构体大小的时候要注意内部字节对齐;
2)共用体又叫联合体,每一个成员都共享内存空间。因此,共用体大小等于成员中占内存最大的那个大小。


9.内存字节对齐
计算机中内存空间都是按照字节划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但是在程序实际编译过程中,编译器会对数据类型在编译过程中进行优化对齐,编译器会将各种类型数据按照一定的规则在空间上排列,而不是顺序的排放,这就是内存字节对齐。


10,OOP(面向对象编程)是一种强大的编程范式,它基于对象的概念,将数据和方法封装在一起,形成一个具有继承、多态和封装等特性的模块化结构。
OPP(面向对象编程的缩写)的三大优势:
    1.继承
    2.封装
    3.多态
oop主要有以下的概念和组件:

    组件: 数据和功能一起在运行着的计算机程序中形成的单元。组件在计算机程序中是模块和结构化的基础

     把组件的实现和接口分开,并且让组件具有多态性。

opp的优点:1.代码重用性高(省代码)  2.使程序的可维护性高(扩展性) 3.灵活性


11.什么是字节流?
传输过程中,传输数据的最基本单位是字节的流
流式套接字中字节流的理解?
答:
字节:意味着,无论物理层或链路层收到的数据是否为一个个二进制位的数据,在TCP层接收到的数据一定是一个个字节。也就是说,我们在进行socket编程时,只需要考虑接收一个个字节,而不是一个个位的数据。
流:意味着,socket的数据无头无尾,就像流水一样,如果从中间任意位置起,你无法知道一个消息包确切的开始或结束位置,除非从TCP的头开始算起。
    ① 也就是意味着,我们在应用层编程时,必须定义一个应用层的包头,从收到的第一个字节开始,通过该包头能确定一个包的长度,然后根据包的长度,确定一个个包的起止位置。这也就是我们看到所有的TCP的socket编程中,都需要定义一个包头,并在其中可以获得应用层包的总长度的原因。
    ② 同时也意味着,数据流不是一个个应用层的数据包,对于接收,可能收到的是一个完整的数据包,也可能了收到1/3个数据包,也可能收到4/5个数据包,或者一个完整的数据包,也可能收到1.5个或3.2个数据包,这是不确定的。需要自己在编程中,自己解析确定收到的是否完整的数据包,如果不足,需要继续接收;如果多余,需要分拆成多个包。

你可能感兴趣的:(技术题(C/C++),开发语言,c++,linux,c#,网络,数据结构,c语言)