✅作者简介:大家好我是:嵌入式基地,是一名嵌入式工程师,希望一起努力,一起进步!
📃个人主页:嵌入式基地 🔥系列专栏:嵌入式习题专栏
牛客网嵌入式软件工程师面试题(一)
- 1、select和epoll的区别
- 2、异步IO和同步IO区别?
- 3、linux的进程状态有哪些?
- 4、什么是死锁?产生死锁的原因是什么?
- 5、死锁的必要条件是什么?
- 6、什么是优先级翻转,如何避免优先级翻转?
- 7、Linux驱动程序的功能是什么?
- 8、Linux驱动程序的分类有哪些?
- 9、内核程序中申请内存使用什么函数?
- 10、内核程序中申请内存和应用程序时申请内存有什么区别?
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本身在内核中会执行这个动作。