嵌入式软件工程师面试题(四)

简介: 嵌入式软件工程师面试题(四)

11fded674b9249edbcfbe7b159d4fe29.png


1、如果两个进程,都要去调用一个设备驱动,设备驱动里面定义的变量是在内核态吗?


如果进程A访问并改变了这个变量,那么进程B再访问,是不是读到改变之后的值?

驱动程序中的变量是在内核态中,因为操作系统只有内核态可以访问到硬件设备,驱动程序从内核态像用户态输出API以便调用和间接访问硬件设备。

进程B访问的是改变后的值,只有在没有考虑并发编程的驱动程序中才可能发生数据的不一致性。

内核驱动程序开发必须考虑并发的问题,因为驱动程序将会被一个或者多个进程访问,对于共享的变量,需要加入互斥锁、自旋锁、信号量或者原子操作等同步技术保证数据的一致性。


2、两个进程的内核空间是共享的吗


用户空间中,每个进程的用户空间是互相独立的,互不相干。

内核空间中,绝大部分是共享的,并不是完全共享,因为内核空间中,不同进程的内核栈之间是不共享的。之所以使用进程的内核栈而非“用户栈”,是避免用户态下进程被抢占改变引发内核崩溃,因此每个进程在内核中有一个独立的内核栈。


3、三次握手为什么ACK信号是SYN信号值+1


为什么三次握手过程中,比如第一次握手,A向B发了seq=x,B给A回的ack是=x+1呢?

如果有数据的话,那理应等于x+LEN。

如果没有数据,那就应该保持不动就等于x才对。

其实不然,服务器端回复的这个+1,是代表他收到了SYN标示。也就是说由于SYN或者FIN的存在,即使没有数据传输,但服务器端仍然需要通过+1来回应一句“我收到了”。

因此握手过程中seq=x的话,ack = x+1。其他几次握手挥手也是同样道理。


4、驱动程序里面,如果有一个buffer,在不同场景下需要定义不同大小,怎么办?


可以预先定义一个结构体,包含长度变量和一个指针,长度标志由ioctl函数从应用程序输入,并动态申请和释放内存。

也可以在模块加载时预先申请不同大小的缓存。

另一种办法是动态检测程序所需要的缓存数量,采用多级缓存的方式,根据所需传递数据的大小动态申请分布式缓存。


5、传引用和传指针区别


指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。

引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。


6、请你说一说cache的作用


Cache存储器,电脑中为高速缓冲存储器,是位于CPU和主存储器DRAM(Dynamic Random Access Memory)之间,规模较小,但速度很高的存储器,通常由SRAM(Static Random Access Memory 静态存储器)组成。

它是位于CPU与内存间的一种容量较小但速度很高的存储器。

CPU的速度远高于内存,当CPU直接从内存中存取数据时要等待一定时间周期,而Cache则可以保存CPU刚用过或循环使用的一部分数据,如果CPU需要再次使用该部分数据时可从Cache中直接调用,这样就避免了重复存取数据,减少了CPU的等待时间,因而提高了系统的效率。

Cache又分为L1Cache(一级缓存)和L2Cache(二级缓存),L1Cache主要是集成在CPU内部,而L2Cache集成在主板上或是CPU上。


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


区别 命名方式不同:


静态库libxxx.a:库名前加”lib”,后缀用”.a”,“xxx”为静态库名。

动态库libxxx.so:库名前加”lib”,后缀变为“.so”。

链接时间不同:


静态库的代码是在编译过程中被载入程序中。

动态库的代码是当程序运行到相关函数才调用动态库的相应函数

链接方式不同:


静态库的链接是将整个函数库的所有数据在编译时都整合进了目标代码。

动态库的链接是程序执行到哪个函数链接哪个函数的库。

(用哪个链接哪个) 优缺点?


静态库:

优点是,在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些;

缺点是,如果所使用的静态库发生更新改变,你的程序必须重新编译。

动态库 :

优点是,动态库的改变并不影响你的程序,所以动态函数库升级比较方便;

缺点是,因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。


8、说说你了解的进程调度算法


不同环境的调度算法目标不同,因此需要针对不同环境来讨论调度算法。


1、批处理系统 批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)。


先来先服务 first-come first-serverd(FCFS) 按照请求的顺序进行调度。有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

短作业优先 shortest job first(SJF) 按估计运行时间最短的顺序进行调度。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

最短剩余时间优先 shortest remaining time next(SRTN) 按估计剩余时间最短的顺序进行调度。


2、交互式系统 交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。


时间片轮转 将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。而如果时间片过长,那么实时性就不能得到保证。

优先级调度 为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

多级反馈队列 一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

3、实时系统 实时系统要求一个请求在一个确定时间内得到响应。


分为硬实时和软实时,前者必须满足绝对的截止时间,后者可以容忍一定的超时。包括公平调度、RR、FIFO等。


9、SPI是什么?有几条线?几种模式?


SPI,是一种高速的,全双工,同步的通信总线

在芯片的管脚上只占用四根线

SPI总线有四种工作方式,通过行同步时钟极性和相位可以进行组合配置。


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


常见的调度策略有6种:


先来先服务调度(FCFS)

短进程优先调度(SPF)

高响应比优先调度(HRN)

时间片轮转调度(RR)

多级反馈队列调度(RRWMF)

最高优先权优先调度(FPF)

相关文章
|
12天前
|
运维 Kubernetes 关系型数据库
云计算运维工程师面试技巧
【8月更文挑战第6天】
54 1
|
1月前
|
算法 网络协议 Linux
|
2月前
|
存储 异构计算 内存技术
【硬件工程师面试宝典】常见面试题其一
- Setup时间:时钟前数据需稳定的最小时间。 - Hold时间:时钟后数据需保持稳定的时间。 - 竞争现象:不同路径信号汇合导致输出不稳定。 - 冒险现象:竞争引起的短暂错误状态。 - D触发器实现2倍分频电路。
48 5
|
1月前
|
传感器 芯片
嵌入式通信协议全解析:SPI、I²C、UART详解(附带面试题)
通信是指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。从广义上来说,通信是指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法、任意媒质,将信息从某方准确安全地传送到另方。在出现电波传递通信后,通信被单一解释为信息的传递,是指由一地向另一地进行信息的传输与交换,其目的是传输消息。通信方式包括利用“电”来传递消息的电信,这种通信具有迅速、准确、可靠等特点,且几乎不受时间、地点、空间、距离的限制,因而得到了飞速发展和广泛应用。
228 0
|
3月前
|
人工智能 开发工具 Python
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
2024年利用Python突破验证码限制,2024年最新Python高级开发工程师面试题
|
2月前
|
安全 网络安全 网络协议
精选30道“渗透测试工程师”面试题
渗透测试 信息收集 网络安全 web安全
83 3
|
2月前
【硬件工程师面试宝典】常见面试题其二
检查单片机上电不运行:电源电压、时钟信号、复位电路、程序烧录。三极管特性:输出特性曲线和转移特性曲线。频率响应指系统对不同频率信号的响应,稳定要求幅度和相位不变。改变响应曲线方法:调整反馈、使用滤波器、改变元件参数。差分运放相位补偿通过在反馈回路加电容,波特图显示补偿效果。基本放大电路类型有共射、共集、共基,差分结构用于抗干扰和提高共模抑制比。电阻电容串联,电容电压为低通滤波,电阻电压为高通滤波。选择电阻考虑阻值、功率、温度系数、精度和尺寸。CMOS电路传递低电平用N管。电流偏置电路通过R1、Q1产生稳定电流。施密特电路回差电压由R1、R2决定。LC振荡器的哈特莱、科尔皮兹、克拉
27 0
|
3月前
|
SQL 分布式计算 算法
程序员必备的面试技巧——大数据工程师面试必备技能
程序员必备的面试技巧——大数据工程师面试必备技能
80 0
|
3月前
|
前端开发 算法
【css炫酷动画】让面试官眼前一亮的故障风格文字动画,3年Web前端开发工程师面试经验分享
【css炫酷动画】让面试官眼前一亮的故障风格文字动画,3年Web前端开发工程师面试经验分享
|
3月前
|
NoSQL Dubbo Java
StringBoot编程式事务与声明式事务java工程师面试突击第一季
StringBoot编程式事务与声明式事务java工程师面试突击第一季