1. linux内核有哪几大模块? Linux内核由5部分组成,它们分别是内存管理、进程管理、进程间通信、虚拟文件系统和网络接口。每个模块的功能沙发楼已经解释得比较详细了。
2. cache 在 Linux 内核中有哪些应用?(一两个例子即可) Cache应该是指CPU的cache,沙发解释可能偏应用层了,不是很合符题目。每个CPU的Cache分data cache和指令cache,以ARM为例,L1 和 L2 Cache 控制器需要保证 cache 的一致性,在 Cortex-A9 中 cache 的一致性是由 MESI 协议来实现的。Cortex-A9 处理器内置了 L1 Cache 模块,由 SCU(Snoop Control Unit)单元来实现 Cache 的一致性管理。L2 Cache 需要外接芯片(例如 PL310)。在最糟糕情况下需要访问主存储器,并将数据重新传递给 LSQ,完成一次存储器读写的全过程。。 cache 在 linux 内核中有很多巧妙的应用: (1)内核中常用的数据结构通常是和 L1 cache 对齐的。例如,mm_struct、fs_cache 等数据结构使用“SLAB_HWCACHE_ALIGN”标志位来创建 slab 缓存描述符,见 proc_caches_ init() 函数。 (2)一些常用的数据结构在定义时就约定数据结构以 L1 Cache 对齐,使用“____ cacheline_internodealigned_in_smp”和“____cacheline_aligned_in_smp”等宏来定义数据结 构,例如 structzone、struct irqaction、softirq_vec[ ]、irq_stat[ ]、struct worker_pool 等。 (3)数据结构中频繁访问的成员可以单独占用一个 cache line,或者相关的成员在 cache line 中彼此错开,以提高访问效率。例如,struct zone 数据结构中 zone->lock 和 zone-> lru_lock 这两个频繁被访问的锁,可以让它们各自使用不同的 cache line,以提高获取锁的效率。 再比如 structworker_pool 数据结构中的 nr_running 成员就独占了一个 cache line,避免多 CPU 同时读写该成员时引发其他临近的成员“颠簸”现象。 (4)slab 的着色区。 (5)自旋锁的实现。在多 CPU 系统中,自旋锁的激烈争用过程导致严重的 CPU cacheline bouncing 现象。
3. cache coherency 和 memory consistency 有什么区别? 在多处理器环境下,还需要考虑 Cache 的一致性问题。高速缓存一致性(cache coherency)产生的原因是在一个处理器系统中不同 CPU 核上的数据 cache 和内存可能具有同一个数据的多个副本,在仅有一个 CPU 核的系统中不存在一致性问题。维护 cache 一致性的关键是跟踪每一个 cache line 的状态,并根据处理器的读写操作和总线上的相应传输来更新 cache line 在不同 CPU 核上的数据 cache 中的状态,从而维护 cache 一致性。 cache一致性有软件和硬件两种方式,有的处理器架构提供显式操作cache的指令,例如PowerPC,不过现在大多数处理器架构采用硬件方式来维护。在处理器中通过 cache 一致性协议来实现,这些协议维护一个有限状态机(Finite State Machine,FSM),根据存储器读写指令或总线上的传输,进行状态迁移和相应的 cache 操作来保证 cache 一致性,不需要软件介入。 cache 一致性协议主要有两大类别,一类是监听协议(Snooping Protocol),每个 cache 都要被监听或者监听其他 cache 的总线活动;另外一类是目录协议(Directory Protocol),全局统一管理 cache 状态。 cache coherency 高速缓存一致性关注的是同一个数据在多个 cache 和内存中的一致性问题,解决高速缓存一致性的方法主要是总线监听协议,例如 MESI 协议等。而 memory consistency 关注的是处理器系统对多个地址进行存储器访问序列的正确性,学术上对内存访问模型提出了很多,例如严格一致性内存模型、处理器一致性内存模型,以及弱一致性内存模型等。弱内存访问模型在现在处理器中得到广泛应用,因此内存屏障指令也得到广泛应用。
4. 如何理解Linux一切皆是文件? 正如《Unix编程艺术》书中阐述的简洁是Unix程序的核心风格。 Unix哲学的KISS原则:Keep it simple, stupid! Unix与Linux,两者在基本设计思想上相同,“一切皆文件”的好处更多的表现在开发者上,好处就是大部分操作可以统一接口,这样的设计给应用程序一个统一的访问资源的方式,而且实现了一套统一的权限管理方式。
|