华为内部面试题库(8)

1、内核中有可能造成并发执行的原因(多选):(参考:Linux内核设计与实现,第二版,第8章)

A、中断

B、软中断和tasklet

C、工作队列(注意工作队列、软中断和tasklet的原理)

D、睡眠以及与用户空间同步

E、内核抢占

F、对称多处理

答案:ABDEF

试题解析:在一台运行 Linux 的计算机中,CPU 在任何时候只会有如下四种状态(OS可见):

1 在处理一个硬中断(如中断上半部)。

2 在处理一个中断下半部,如 softirqtasklet bh

3 运行于内核态,但有进程上下文,即与一个进程相关。

4 运行一个用户态进程。

其中1,2,3运行于内核空间,分别可以被其上状态抢占;

Linux内核是一个可抢占的内核,因此高优先级可抢占低优先级任务;

多处理器,两个或者多个处理器同时执行代码

因此ABDEF正确。

工作队列、软中断和tasklet都是实现中断下半部的机制,但是工作队列是在每个CPU上起一个内核线程,执行工作队列里面的任务,因此工作队列本身不会造成并发执行。

 

2、单处理器系统中,如果中断中不对共享数据访问,可以通过以下方式避免并发访问数据(多选):(参考:Linux内核设计与实现,第二版,第8章)

A、关中断

B、禁止调度

C、禁止内核抢占且不请求重新调度

D、使用spinlock对共享数据进行保护

答案:ABC

试题解析:单核情况下,进程只有在系统调用或者中断的情况下才会发生切换。只要保证在临界区不引用系统调用,禁止中断的情况下,可以保证互斥。

单核系统中,spinlock替换为空,spinlock是针对多核并发。

 

3、多处理系统中,下面解决并发数据访问的方式,错误的是(单选):(参考:Linux内核设计与实现,第二版,第9章)

A、关中断

B、原子操作

C、自旋锁

D、信号量

答案:A

试题解析:多核情况下,由于代码可以在多核上并发执行,因此在关闭本地CPU的中断情况下,无法保证并发的执行。

 

4、关于原子操作的使用,错误的是(单选):(参考:Linux内核设计与实现,第二版,第9章)

A、原子操作需要硬件支持(如原子性指令),操作系统本身无法单独实现

BLinux内核中提供了两组原子操作接口整数操作以及bit操作

C、对局部变量进行原子性操作是有意义的

D、不同的硬件体系架构,原子性操作实现并不相同

答案:C

试题解析:对于局部变量的原子操作没有任何意义,因为局部变量是放在线程的栈中,而每个线程都有自己私有的栈,不存在并发的问题。

 

5、关于自旋锁的使用,错误的是(单选):(参考:Linux内核设计与实现,第二版,第9章)

A、不同的体系架构,自旋锁的实现方式不一样

B、递归使用自旋锁会导致死锁

C、使用自旋锁之前需要进行初始化,不能在没加锁的情况下进行开锁操作,内核中有配置选项对以上情况进行检测

D、中断无法打断自旋锁保护的区域,在使用自旋锁时,不用考虑中断的情况

答案:D

试题解析:自旋锁会禁止抢占,但在没有关中断的情况下,可以被中断打断,为考虑中断等情况,内核中提供四种spinlock,分别为:

spin_lock()

       使用广泛,用于无中断竞争的场景下;

spin_lock_irq()

       保护的临界区会被中断打断,并在中断中访问临界区;该锁unlock时会打开之前关闭的中断,所以慎用;

spin_lock_irqsave()

       保护中断也会访问的临界区,但在获取锁时会把之前的中断状态保存起来,释放锁的时候写回,因此没有spin_lock_irq()的问题。内核中驱动程序使用较多。

spin_lock_bh()

       与下半部配合使用时,需要禁止下半部执行,用于中断下半部访问临界区的场景下。

原文地址:https://www.cnblogs.com/hehehaha/p/6332762.html