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

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

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)

相关文章
|
2月前
|
程序员
嵌入式软件工程师如何快速成长
嵌入式软件工程师如何快速成长
21 2
|
8月前
|
JavaScript 芯片
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
聊聊身边的嵌入式,2年质保期刚过就翘辫子,这是什么骚设计?
|
5月前
|
安全 C++ 容器
嵌入式c++软件开发笔记第三讲
嵌入式c++软件开发笔记第三讲
28 0
|
5月前
|
C语言 C++ iOS开发
嵌入式c++软件开发笔记 第六讲
嵌入式c++软件开发笔记 第六讲
17 0
|
5月前
|
算法 编译器 C++
嵌入式c++软件开发笔记第五讲
嵌入式c++软件开发笔记第五讲
17 0
|
5月前
|
编译器 C语言 C++
嵌入式c++软件开发第二讲笔记
嵌入式c++软件开发第二讲笔记
26 0
|
5月前
|
安全 Java 编译器
嵌入式c++软件开发第四讲笔记
嵌入式c++软件开发第四讲笔记
18 0
|
10月前
|
算法 前端开发 机器人
|
存储 网络协议 调度
嵌入式软件工程师笔试题-1(含答案讲解)
预编译又可以叫做预处理,是进行一些代码文本的替代工作
|
安全 Linux C语言
嵌入式软件工程师面试题(七)
嵌入式软件工程师面试题(七)
481 0
嵌入式软件工程师面试题(七)