兰州网页制作公司网站,郑州企业建站公司定制,百度平台,wordpress单题问卷网上学习总结的一些资料#xff0c;加上个人的一些总结。 Linux内核可以分成基础层和应用层。 基础层包括数据结构#xff0c;内核同步机制#xff0c;内存管理#xff0c;任务调度。 应用层包括文件系统#xff0c;设备和驱动#xff0c;网络#xff0c;虚拟化等。文件…网上学习总结的一些资料加上个人的一些总结。 Linux内核可以分成基础层和应用层。 基础层包括数据结构内核同步机制内存管理任务调度。 应用层包括文件系统设备和驱动网络虚拟化等。文件系统是应用层的基础。 内核基础层-数据结构 双向链表 hash链表 红黑树: deadline调度算法 deadline-iosched.c 用到了红黑树。 radix树以空间冗余换时间消耗代码见 /lib/radix-tree.c。Page cache的管理用到了radix tree。 内核基础层-内存管理 主要有伙伴系统内存管理和Slab内存管理两种。 3.1 伙伴系统内存管理 基于页面的内存管理 (1页4096字节每个页面地址上连续)。分配内存以页为单位。自动完成页面的分割与合并alloc_pages(): 从伙伴系统申请内存。申请得到的是页面结构的指针如果要得到内存地址需要调用page_address()。_get_free_pages()可以直接得到内存地址。 3.2 Slab系统内存管理基于对象的内存管理 (建立在伙伴系统之上)。分配内存不以页为单位。提供内存的构造函数和析构函数kmem_cache_create: 创建Slab对象kmem_cache_alloc: 申请内存kmem_cache_free: 释放内存 内核基础层-同步机制主要有自旋锁和信号量两种。 4.1自旋锁 spin-lock 我的理解是spin-lock主要是给多核同步用。如果是单核非抢占式那么spin-lock没有什么作用。如果是单核抢占式那么spin-lock起的作用是禁止抢占?。 spin-lock如果没有抢到就busy-waiting不会sleep。 spin-lock可以用在interrupt-handler中因为interrupt-handler不允许在里面sleepspin-lock没抢到也不会sleep。 4.2 信号量semaphore and mutex Semaphore计数可以多个mutex计数只有一个。 up: 释放信号量 down: 获取信号量。如果没获取到就sleep down_trylock: 获取信号量。如果没获取到就立刻返回不会进入sleep semaphore不可以用在interrupt-handler和tasklet等不能sleep的场景因为Semaphore没抢到的话会sleep。 对于可以sleep的场景那就semaphore和spin-lock都可以用。spin-lock多用在轻量级场景。 4.3 原子变量 - 读写不会被打断。用在简单的数据的读写上比如多个进程读写一个公共int变量。 atmoic_add - 加一个整数到原子变量 atomic_sub - 减一个整数到原子变量 atomic_set - 设置原子变量的数值 atomic_read - 读取原子变量的数值 4.4 completion - 提供一种等待完成的机制。类似信号量。 wait_for_completion - 等待操作完成 complete - 完成的信号 4.5 CPU变量 - 每个CPU都有一个变量的备份 DEFINE_PER_CPU 4.6 RCU锁 - 免锁机制 call_rcu rcu_read_lock 4.7 顺序锁 - 适用于读多写少的场合 read_seqbegin write_seqlock