嵌入式常见面试简答题

1、阻塞与非阻塞的区别
阻塞就是在执行相关函数命令时,如果条件不满足那么该线程就会阻塞再那里不动,直到等待条件满足才继续运行 ,但是在线程在等待的期间会交出CPU调度,因此并不影响cpu效率;
非阻塞就是在执行非阻塞属性的函数命令时,并不会等待条件满不满足,调用后直接返回,因此在用非阻塞的时候要注意非阻塞执行的时候可能是执行失败的,因为他没有等待条件就执行了。而阻塞式则返回肯定是成功的,

阻塞式执行一定是成功的相对于非阻塞而言,但是阻塞式在多路IO的时候就会出现并发式IO问题。因为阻塞式卡线程,让该线程阻塞在那里而不进行执行。

2、Http是长连接还是短连接
短连接 连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

长连接 连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。 长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。 
HTTP也可以建立长连接的,使用Connection:keep-alive,长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况

2、Tcp连接的过程
三次握手过程;
服务器;调用socket获取一个网络插口,调用bind将本地IP与端口绑定,调用listen进入监听模式
客服端;调用sokcet并绑定同一个网络插口,调用connect进行连接;就是向服务器发送syn信号,然后等待服务器调用accept接收则给客服端会syn+ack信号,客服端再次想服务器发生ack信号保证确认,这样就完成了TCP连接,他们之间就可以通过socket端口进行数据通信。

四次挥手
客服端调用close请求关闭socket就是向服务器发生FIN信号请求服务器关闭,并进入FIN-WAIT-1状态
服务器收到FIN信号,将要传输的数据传送完后,发生ACK信号。
客服端收到ACK后进入FIN-WAIT-2状态等待服务器发生FIN信号
服务器发送FIN信号,
客服端回ACK信号,进入TIME-WAIT。

3、进程通信与线程通信的方式
多进程通信其实就是多个程序之间的通信,又因为MMU虚拟地址映射的问题,因此导致多进程通信困难,
方法有;无名管道,有名管道,消息队列,信号量,共享内存,socket套接字
多线程通信就是同一个程序之间的不同函数通信,一个全局变量就可以搞定,因此比较简单,
线程同步的方法有;信号量,互斥锁,条件变量,

4、管道通信是怎么实现的
无名管道就是父子进程之前,通过在内核中建立管道完成通信。
具体做法;在父进程fork之前创建pipe管道,则在子进程中也有对应的pipe的读写fd,从而达到通信的效果,注意pipe被阉割成单向通信了。

5、创建线程的方法
pthread_creat 自己创建一个线程
一个进程就是一个主线程
fork一个子进程同时也就产生了一个子线程

一个线程的最终去处要么被父线程回收,要么被分解
pthread_join回收
pthread_detach分离

6、进程与线程的区别
linux中线程式轻量级的进程,一个进程可以有多个线程,线程依赖与进程而存在。
进程相当与一个程序,而线程相当于一个函数,线程的核心就是创建的时候绑定的那个函数。

进程是资源分配的最小单位,线程是程序执行的最小单位。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段
一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

https://www.cnblogs.com/zhehan54/p/6130030.html

7;交换机和路由器的区别;
交换机;完成MAC地址与主机的通信,在集线器的基础上增加了地址表,在局域网内工作
路由器;主要完成路由功能,作用在互联网上,对内管理子网,对外实现联网,

工作层次不同  
	最初的的交换机是工作在OSI/RM开放体系结构的数据链路层,也就是第二层,而路由器一开始就设计工作在OSI模型的网络层。

数据转发所依据的对象不同  
交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用不同网络的ID号(即IP地址)来确定数据转发的地址。

功能能不一样。
	交换机本质功能 是 学习MAC地址,进行帧的转发
	路由器的本质功能 是包转发和路径选择。
  1. 问:构造函数的作用?并把构造函数的定义格式写出来。
    在创建这个对象的时候,就是new的时候会自动调用其对应的构造函数来完成填充该对象的相关数据
    构造函数没有返回值,函数名和类名一样,可以传入值,可以重载
    构造函数的作用:初始化对象的数据成员。

  2. 问:谈谈对多态的理解。
    多态;就是在继承和重写,虚函数的基础上完成的;
    就是可以利用父类的指针指向子类的对象,从而调用子类对象的相关函数。

  3. 问:虚函数和纯虚函数的区别。
    C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化。

    纯虚函数就是该类的所有函数都是虚的,则不能进行new操作就是类似于java里面的抽象类,只有实现了虚函数的子类才能new出对象来。

    普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。

  4. 问:静态链接库和动态链接库的区别。
    静态链接库,在使用的时候就是直接将库的对应函数体复制到程序中来。因此多调用几次则多复制几次,则有重复。 -static表示进行静态链接,.a表示
    动态链接库,在使用的时候就是只将对应的链家放到程序中来。.so表示

    使用时要注意;
    包含对应头文件,编译时可能要加额外用-lxx来指向链接
    动态库要注意-L指定动态库的地址。
    -l表示指向链接库的名字。-L表示指向链接库的地址

  5. 问:const放在函数的前中后分别有什么区别。
    函数后;int GetY() const;该函数为只读函数,不允许修改其中的数据成员的值。
    函数中;int GetY(){const修饰具体变量是否可变}
    函数前;const int * GetPosition();修饰的是返回值,表示返回的是指针所指向值是常量。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值