Linux内核奔跑卷
京东购书:
item.jd.com/12152745.ht…
试读地址:
www.epubit.com.cn/book/detail…
在阅读本书以前,请读者用两小时来完成Linux内核奔跑卷,对Linux内核了解程度作简要的了解。奔跑卷仅仅是Linux内核知识的娱乐游戏节目,但愿能给读者带来一丝乐趣,套用国内某个科技圈里知名人士的名言“不服,来跑个分吧!”。html
下面一共20道大题目,每道大题目10分,一共200分,读者能够边阅读内核源代码边作题目,请在两小时内完成。如没有特殊说明,本奔跑卷基于Linux 4.0内核和ARM32/ ARM64体系架构。数据结构
1.请简述在你所熟悉的处理器中(好比双核Cortex-A9)一条存储读写指令的执行全过程。架构
2.在一个32KB的4路组相联的cache中,其中cache line为32Byte,请画出这个cache组相联的结构图。负载均衡
3.内核的一级页表和二级页表存放在什么地方?用户进程的一级页表和二级页表分别存放在什么地方?函数
4.关于伙伴系统的几个小问题:优化
- 系统初始化时,物理内存页面是如何添加到伙伴系统中的?
- 系统运行时间长了物理内存会出现碎片化,伙伴系统如何避免物理内存的碎片化?
5.关于物理页面内存分配器的几个小问题:ui
- 请简述Linux内核在理想状况下页面分配器(page allocator)是如何分配出连续物理页面的?
- 如何从分配掩码中肯定能够从哪些zone中分配内存?
- 页面分配器是按照什么方向来扫描zone的?
6.关于slab分配器几个小问题:spa
- slab分配器是如何分配和释放小内存块的?
- slab分配器中有一个着色的概念(cache color),着色有什么做用?
- slab分配器中的slab对象有没有根据per-cpu作一些优化,为何?
7.用户进程使用malloc()来分配10个page大小的内存,请问内核是否立刻分配物理内存?请描述malloc()在内核空间的实现过程。线程
8.关于struct page数据结构的几个小问题:设计
- struct page数据结构中的_count和_mapcount有什么区别?
- 匿名页面和文件缓冲页面有什么区别?
- trylock_page()和lock_page()有什么区别?
9.关于页面回收的几个小问题:
- LRU链表如何知道page的活动频繁程度?
- kswapd是按照什么方向来扫描zone的?
- 内核有哪些页面会被kswapd写回到交换分区?
- 当page加入到lru链表中,被其余线程释放了这个page,那么lru链表如何知道这个page已经被释放了?
10.关于内存管理的几个重要的数据结构的关系,如mm、vma、page、vaddr、paddr:
- 如何由mm数据结构和虚拟地址vaddr找到对应的VMA?
- 如何由page和VMA找到虚拟地址vaddr?
- 如何由page找到全部映射的VMA?
- 如何由VMA和虚拟地址vaddr,找出相应的page数据结构?
11.关于缺页中断和虚拟内存的几个小问题:
- 若是用户进程使用只读属性(PROT_READ)来mmap映射一个文件到用户空间,而后使用memcpy来写这段内存空间,会是什么样的状况?
- 若是多个VMA的虚拟页面同时映射了同一个匿名页面,那么此时page->index应该等于多少?
12.关于进程的几个小问题:
- 在内核中如何获取当前进程的task_struct数据结构?
- 下面小代码片断里,最后会打印出什么?
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-\n");
}
wait(NULL);
wait(NULL);
return 0;
}复制代码
13.关于CFS调度器的几个小问题:
- 请简述CFS调度器是如何工做的?
- vruntime是如何计算的?
- min_vruntime有什么做用?
- 对新建立的进程和刚唤醒的进程有何关照?
14.关于SMP负载均衡的几个小问题:
- 普通进程的平均负载load_avg_contrib是如何计算的?runnable_avg_sum和runnable_avg_period是什么含义?
- 一个4核处理器里每一个物理CPU核有独立L1 cache而且只有一个线程,分红两个簇cluster0和cluster1,每一个簇包含两个物理CPU核,簇中的CPU核共享L2 cache。请画出该处理器在Linux内核里调度域和调度组的拓扑关系图。
15.关于spinlock的几个小问题:
为何spinlock的临界区不能睡眠(不考虑RT-Linux的状况)?
若是在spin_lock()和spin_unlock()的临界区中发生了中断,而且中断处理程序恰巧也修改了该临界资源,那么会发生什么后果?如何避免?
Ticket-based的spinlock机制是如何实现的?有什么优缺点?
16.读写信号量使用的自旋等待机制(optimistic spinning)是如何实现的?
17.关于RCU的几个小问题:
- 请解释Quiescent State和Grace Period?
- 在mm/oom_kill.c的select_bad_process()函数中为何要使用rcu_read_lock()?何时注册RCU回调函数呢?
18.关于中断的几个小问题:
- 硬件中断号和Linux内核的IRQ中断号是如何映射的?
- 一个硬件中断发生以后,Linux内核是如何响应并处理该中断的?
- 为何说中断上下文不能执行睡眠操做?
19.关于软中断的几个小问题:
- 软中断回调函数的执行过程当中是否容许响应本地中断?
- 同一类型的软中断是否容许多个CPU并行执行?
- 是否容许同一个Tasklet在多个CPU上并行执行?
20.关于workqueue的几个小问题:
- workqueue是运行在中断上下文,仍是进程上下文?其回调函数容许睡眠吗?
- 若是有多个work挂入到一个工做线程中执行,当某个work的回调函数执行了阻塞操做,那么剩下的work该怎么办?
答案:
奔跑卷的答案都分布在本书的各个章节。
若是答对了90%以上,那么恭喜您,您是深刻了解Linux内核的高手,本书可能不适合您,不过您能够转给身边有须要的小伙伴。
若是答对了30%以上,那么您对Linux内核有必定的了解,固然本书也适合您继续深刻了解。
若是答对题目少于30%,那么您还不是十分了解和精通Linux哦。如今就开始阅读本书,与笨叔叔和小企鹅一块儿快乐奔跑吧!固然您也能够先阅读Robert Love的《Linux内核设计与实现》,或者《Linux设备驱动程序》,而后再阅读本书。