牛客网嵌入式软件工程师面试题(一)

简介: 牛客网嵌入式软件工程师面试题

11fded674b9249edbcfbe7b159d4fe29.png


1、select和epoll的区别


select的时间复杂度O(n)。它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。

epoll的时间复杂度O(1)。epoll可以理解为event

poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))


2、异步IO和同步IO区别?


所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 而异步就是过程调用发出后,调用者不能立刻得到结果。


实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。所以异步IO和同步IO区别就是数据拷贝的时候进程是否阻塞。


3、linux的进程状态有哪些?


Linux系统下进程通常存在6种不同的状态,分为:

就绪态

运行态

僵尸态

可中断睡眠状态(浅度睡眠)

不可中断睡眠状态(深度睡眠)

暂停态。


4、什么是死锁?产生死锁的原因是什么?


所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

死锁产生的原因可归结为两点:

竞争资源

进程间推进顺序非法


5、死锁的必要条件是什么?


产生死锁的必要条件:


互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。

不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。

环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。


6、什么是优先级翻转,如何避免优先级翻转?


优先级翻转指的是一个具有中等优先级的任务比一个更高优先级的任务先执行。

优先级翻转的主要原因是对共享资源的访问产生了互斥,因此我们可以采用带有优先级继承机制的互斥量来避免优先级翻转。


7、Linux驱动程序的功能是什么?


设备驱动连接操作系统和硬件。

设备驱动程序是一种可以使计算机与设备进行通信的特殊程序,可以说相当于硬件的接口。

操作系统只有通过这个接口,才能控制硬件设备的工作。

安装在操作系统中的驱动程序可以完成设备的初始化和释放,进行外部数据和操作系统的通信和数据交互,控制硬件的行为,并检查设备可能出现的故障并报错。


8、Linux驱动程序的分类有哪些?


Linux将硬件设备分为3大类,分别是字符设备、块设备和网络设备。


字符设备是指那些能一个字节一个字节读取数据的设备,如键盘鼠标等,常见的SPI/I2C/UART默认也是字符设备。

块设备与字符设备类似,一般是像磁盘一样的设备。

网络设备主要负责主机之间的数据交换。与字符设备和块设备完全不同,网络设备主要是面向数据包的接收和发送而设计的。


9、内核程序中申请内存使用什么函数?


内核中使用kmalloc(),kzalloc(), vmalloc(), alloc_page()等函数。


kamlloc申请的内存区域位于物理内存的映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,存在比较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。

kzalloc() 函数与 kmalloc() 额外附加了 __GFP_ZERO 标志,所以它除了申请内核内存外,还会对申请到的内存内容清零。

vmalloc() 函数则会在虚拟内存空间给出一块连续的内存区,但这片连续的虚拟内存在物理内存中并不一定连续。由于 vmalloc() 没有保证申请到的是连续的物理内存,因此对申请的内存大小没有限制,如果需要申请较大的内存空间就需要用此函数了。

需要注意的是vmalloc() 和 vfree() 可以睡眠,因此不能从中断上下文调用。

alloc_page()用于申请连续的物理页,可以通过page_address()把指定的页转化成逻辑地址。

如何区分这几个概念: kmalloc是最常用的内存分配函数,可以原子操作,速度快,缺点就是大小有上限,kzalloc是强制清零版本的kmalloc,而vmalloc只有在需要申请大内存的时候使用,会陷入阻塞


10、内核程序中申请内存和应用程序时申请内存有什么区别?


应用程序的内存申请,例如C/C++可以使用malloc函数,与内核的kmalloc(),kzalloc(), vmalloc(), alloc_page()等函数相比,比较像vmalloc机制,即虚拟地址申请,物理地址不一定连续,区别在于,应用程序malloc不会做分配物理页的动作,交由内核去申请,而vmalloc本身在内核中会执行这个动作。

相关文章
|
5月前
|
消息中间件 存储 网络协议
20道嵌入式经典面试题(附答案)
20道嵌入式经典面试题(附答案)
478 0
|
19天前
|
C语言
经典面试题:嵌入式系统中经常要用到无限循环,怎么样用C编写死循环呢
在嵌入式系统开发中,无限循环常用于持续运行特定任务或监听事件。使用C语言实现死循环很简单,可以通过`while(1)`或`for(;;)`的结构来编写。例如:`while (1) { /* 循环体代码 */ }`,这种写法明确简洁,适用于需要持续执行的任务或等待中断的场景。
|
3月前
|
传感器 芯片
嵌入式通信协议全解析:SPI、I²C、UART详解(附带面试题)
通信是指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。从广义上来说,通信是指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法、任意媒质,将信息从某方准确安全地传送到另方。在出现电波传递通信后,通信被单一解释为信息的传递,是指由一地向另一地进行信息的传输与交换,其目的是传输消息。通信方式包括利用“电”来传递消息的电信,这种通信具有迅速、准确、可靠等特点,且几乎不受时间、地点、空间、距离的限制,因而得到了飞速发展和广泛应用。
778 0
|
5月前
|
存储 网络协议 算法
常见的嵌入式面试问题解答!
常见的嵌入式面试问题解答!
66 1
|
5月前
|
监控
嵌入式面试题:数据传输单工,半双工,全双工之间的区别
嵌入式面试题:数据传输单工,半双工,全双工之间的区别
62 0
|
5月前
|
算法 Linux 调度
嵌入式linux面试题目总结
嵌入式linux面试题目总结
160 0
|
5月前
|
存储 编译器 API
嵌入式笔试面试刷题(day12)
嵌入式笔试面试刷题(day12)
64 1
|
5月前
|
存储 缓存 编译器
嵌入式面试笔试刷题(day7)
嵌入式面试笔试刷题(day7)
68 1
|
5月前
|
网络安全 数据库
嵌入式如何面试10家公司,拿到9个offer的?
嵌入式如何面试10家公司,拿到9个offer的?
56 0
|
5月前
|
运维 物联网 Linux
嵌入式面试求职分享(经典)
嵌入式面试求职分享(经典)
155 0