华为内部面试题库---(8)
1、内核中有可能造成并发执行的原因(多选):(参考:Linux内核设计与实现,第二版,第8章)
A、中断
B、软中断和tasklet
C、工作队列(注意工作队列、软中断和tasklet的原理)
D、睡眠以及与用户空间同步
E、内核抢占
F、对称多处理
答案:A、B、D、E、F
试题解析:在一台运行 Linux 的计算机中,CPU 在任何时候只会有如下四种状态(OS可见):
1 在处理一个硬中断(如中断上半部)。
2 在处理一个中断下半部,如 softirq、tasklet 和 bh。
3 运行于内核态,但有进程上下文,即与一个进程相关。
4 运行一个用户态进程。
其中1,2,3运行于内核空间,分别可以被其上状态抢占;
Linux内核是一个可抢占的内核,因此高优先级可抢占低优先级任务;
多处理器,两个或者多个处理器同时执行代码
因此A、B、D、E、F正确。
工作队列、软中断和tasklet都是实现中断下半部的机制,但是工作队列是在每个CPU上起一个内核线程,执行工作队列里面的任务,因此工作队列本身不会造成并发执行。
2、单处理器系统中,如果中断中不对共享数据访问,可以通过以下方式避免并发访问数据(多选):(参考:Linux内核设计与实现,第二版,第8章)
A、关中断
B、禁止调度
C、禁止内核抢占且不请求重新调度
D、使用spinlock对共享数据进行保护
答案:A、B、C
试题解析:单核情况下,进程只有在系统调用或者中断的情况下才会发生切换。只要保证在临界区不引用系统调用,禁止中断的情况下,可以保证互斥。
单核系统中,spinlock替换为空,spinlock是针对多核并发。
3、多处理系统中,下面解决并发数据访问的方式,错误的是(单选):(参考:Linux内核设计与实现,第二版,第9章)
A、关中断
B、原子操作
C、自旋锁
D、信号量
答案:A
试题解析:多核情况下,由于代码可以在多核上并发执行,因此在关闭本地CPU的中断情况下,无法保证并发的执行。
4、关于原子操作的使用,错误的是(单选):(参考:Linux内核设计与实现,第二版,第9章)
A、原子操作需要硬件支持(如原子性指令),操作系统本身无法单独实现
B、Linux内核中提供了两组原子操作接口—整数操作以及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()
与下半部配合使用时,需要禁止下半部执行,用于中断下半部访问临界区的场景下。