嵌入式软件开发面试题总结三.

1.动态库和静态库的区别,后缀格式,以及函数的相对地址区

解题思路

区别 命名方式不同: 静态库libxxx.a:库名前加“lib”,后缀用“.a”,“xxx”为静态库名。动态库 libxxx.so:库名前加“lib”,后缀变为“.so”。链接时间不同: 静态库的代码是在编译过程中被载入程序中。动态库的代码是当程序运行到相关函数才调用动态库的相应函数 链接方式不同: 静态库的链接是将整个函数库的所有数据在编译时都整合进了目标代码。动态库的链接是程序执行到哪个函数链接哪个函数的库。(用哪个链接哪个)
优缺点? 静态库: 优点是,在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些; 缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。动态库 : 优点是,动态库的改变并不影响你的程序,所以动态函数库升级比较方便; 缺点是,因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。

2. 说说你了解的进程调度算法

解题思路
不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。批处理系统 批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。先来先服务 第一来-serverd(FCFS) 按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。短作业优先 shortest job first(SJF) 按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。最短剩余时间优先 剩余最短时间 next(SRTN) 按估计剩余时间最短的顺序进行调度。交互式系统 交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。时间片轮转 将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。时间片轮转算法的效率和时间片的大小有很大关系:因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。而如果时间片过长,那么实时性就不能得到保证。优先级调度 为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。多级反馈队列 一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。实时系统 实时系统要求一个请求在一个确定时间内得到响应。分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。包括公平调度、RR、FIFO等。

3.SPI是什么?有几条线?几种模式?

解题思路
SPI,是一种高速的,全双工,同步的通信总线,在芯片的管脚上只占用四根线。SPI总线有四种工作方式,通过行同步时钟极性和相位可以进行组合配置。

4.常见的操作系统进程调度策略有哪些?

解题思路
常见的调度策略有6种,先来先服务调度(FCFS)。短进程优先调度(SPF)。高响应比优先调度(HRN)。时间片轮转调度(RR)。多级反馈队列调度(RRWMF)。最高优先权优先调度(FPF)。

5.逻辑地址、线性地址、物理地址、总线地址、虚拟地址的区别?

解题思路
逻辑地址指的是与内存段相关的偏移地址部分。线性地址:线性地址 = 逻辑地址 + 基地址。如果启用了分页机制,那么线性地址使用页表项变换后就是物理地址。如果没有启用分页机制,那么线性地址就是物理地址。总线地址其实就是物理地址。虚拟地址是通过MMU内存管理虚拟映射出来的地址。

6.用户空间与内核空间有哪些通信方式?

解题思路
1、系统调用,提供特定的用户空间与内核空间的信息传递。
2、信号,内核空间出现一些异常时候会发送信号给进程,如SIGSEGV、SIGPIPE等。
3、/proc,proc可以读取内核空间的配置信息和运行状态并且设置部分属性的值。
4、文件,可以通过指定文件的读写操作来实现通信。
5、netlink,类似socket通信方式,可以读写大量的数据,实现稍微复杂。
6、ioctl,可以实现数据量比较少时候的通信

7.怎样预防死锁?

解题思路
打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。

8.硬链接与软链接的区别?

解题思路
硬链接与原文件公用一个inode号,他们是同一个文件,而软链接与原文件拥有不同的inode号,他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写 出来,因为在本质上硬链接文件和原文件是完全平等关系;软链接的链接数目不会增加,硬链接每增加一个,链接数目就会加1;硬链接文件显示的大小是跟原文件是一样的,软连接不一定。

9.Linux系统的挂起、待机、休眠?

解题思路
挂起:CPU、内存工作,而硬盘、显示器等外部设备停止工作。待机:只对内存供电,CPU、外设停止工作。休眠:CPU、内存停止工作,内存中的数据保存在硬盘中,外部设备也停止工作。

10.TCP、UDP 的区别?

解题思路
TCP是面向连接的,UDP是面向无连接的。TCP是面向字节流的,UDP是基于数据报的。TCP提供可靠服务(正确性、顺序性),UDP提供不可靠服务。TCP程序结构复杂,占用资源多;UDP程序结构简单,占用资源少。TCP有拥塞控制;UDP没有拥塞控制。TCP只支持一对一;UDP支持一对一、一对多、多对一、多对多。

11.简述TCP三次握手的过程。

解题思路
第一次握手:客户端创建传输控制块,然后向服务器发出连接请求报文(将标志位SYN置1,随机产生一个序列号seq=x),接着进入SYN-SENT状态。第二次握手:服务器收到请求报文后由SYN=1得到客户端请求建立连接,回复一个确认报文(将标志位SYN和ACK都置1,ack=x+1,随机产生一个序列号seq=y),接着进入SYN-RCVD状态。此时操作系统为该TCP连接分配TCP缓存和变量。第三次握手:客户端收到确认报文后,检查ack是否为x+1,ACK是否为1,是则发送确认报文(将标志位ACK置1,ack=y+1,序列号seq=x+1),此时操作系统为该TCP连接分配TCP缓存和变量。服务器收到确认报文并检查无误后则连接建立成功,两者都进入ESTABLISHED状态,完成三次握手。

12.TCP为什么需要三次握手,第三次握手去掉行不行?

解题思路
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。第三次握手不能去掉,第三次握手能防止发生死锁,因为若为两次握手且服务器发出第二次握手而客户端没有收到,服务器开始传输数据报后客户端便不会理会,导致服务器以为丢包而源源不断地发送数据报,造成死锁。

13.简述TCP四次挥手的过程。

解题思路
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

14.为什么TCP建立连接是三次握手,而关闭连接却是四次挥手?

解题思路
建立连接的时候,服务器在LISTEN状态下,不需要等待,可以立即建立连接,把ACK和SYN放在一个报文里发送给客户端,因此只需要三次握手。而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接受数据,而自己未必将所有数据都发送完了,所以服务器可以立即关闭,也可以发送一些数据后再关闭,所以服务器的确认报文(ACK=1)和连接释放报文(FIN=1,ACK=1)一般分开发送,因此形成四次握手。

15.进程和线程的区别?

解题思路
进程是资源分配的最小单位,线程是CPU调度的最小单位。一个进程可以包含多个线程,所以进程要比线程消耗更多的计算机资源。每个进程都有单独的地址空间,而同一进程内的线程共享进程的地址空间。

16.C语言中,static关键字的作用?

解题思路
在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。
1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。
a.在全局区分配内存。
b.如果没有初始化,其默认值为0. c.该变量在本文件内从定义开始到文件结束可见。
2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:
a.该变量在全局数据区分配内存。
b.它始终驻留在全局数据区,直到程序运行结束。
c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束

17.堆和栈得区别?

解题思路
堆和栈的主要区别有:1、栈由系统自动分配,而堆是人为申请开辟;2、栈获得的空间较小,而堆获得的空间较大;3、栈由系统自动分配,速度较快,而堆一般速度比较慢;4、栈是连续的空间,而堆是不连续的空间。

18.进程间通信方法

解题思路
常用的进程间通信方式有: 管道 ,包括有名管道和无名管道。信号量。共享内存 消息队列 本地套接字

19.程序中的内存分配方法

解题思路
内存为程序分配空间有四种分配方式:
1、连续分配方式
2、基本分页存储管理方式
3、基本分段存储管理方式
4、段页式存储管理方式

20.c语言volatile作用和用法

解题思路
volatile关键字用来阻止编译器认为的无法“被代码本身”改变的代码进行优化。如在C语言中,volatile关键字可以用来提醒编译器它后面所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值