这周除了阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第15,16章外.我们还需要接着完成学习MOOC「Linux内核分析」第八讲「Linux系统架构和执行过程概览」,并完成实验楼上配套实验八的任务。
首先阅读课本上的章节,在第十五章进程地址空间章节介绍了如何管理物理内存。
1.其实内核除了管理本身的内存外,还必须管理用户空间中的内存。这个内存我们叫做进程地址空间。进程只能访问有效内存区域内的内存地址。
内核区域可以包含各种内存对象,比如:
1.可执行文件代码的内存映射,称为代码段。
2.可执行文件的已经初始化全局变量的内存映射,称为数据段。
3.包含未初始全局变量,也就是bss段多的零页的内存地址。
4.用于进程用户空间栈的零页的内存映射。
5.每一个诸如C库或动态链接程序等共享库的代码段,数据段和bss也会被载入进程的地址空间。
6.任何内存映射文件。
7.任何共享内存段。
8.任何匿名的内存映射,比如malloc()分配的内存。
2.内核使用内存描述符结构体表示进程的地址空间,改结构包含了和进程地址空间有关的全部信息。
3.内存区域由VM_AREA_STRUCT结构体描述。内存区域在LINUX内核中页经常称作虚拟内存区域。
4.内核时长需要在某个区域内存上执行一些操作,比如某个指定地址是否包含在某个内存区域中。这类操做非常频繁。我们称这个区域为操作内存区域。
5.内核使用mmap()和do _mmap()函数创建一个新的线性地址空间。
6.内核使用munmap()和do_munmap()函数从特定的进程地址空间中删除指定地址区间。
7.虽然应用程序操作的对象是映射到物理内存之上的虚拟内存,但是处理器直接操作的确实物理内存。地址的转换工作需要通过查询页表才能完成。
Linux中使用三级页表完成地址转换。
1.*页表是页全局目录。
2.二级页表是中间页目录。
3.最后一级的页表简称页表。
第十六章我们要学习一种用于所有页I/O操作的内存数据缓存,而且还涵盖内核基于页的数据回写。
页高速缓存(cache)是Linux内核时限磁盘缓存。它主要用来减少对磁盘的I/O操作。具体的讲。是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。
1.缓存手段:页面高速缓存是由内存中的物理页面组成的,其内容对应磁盘上的物理块。页高速缓存大小能动态调整-它可以通过占用空闲内存以扩张大小。也可以自我收缩以缓解内存使用压力。
它主要包括写缓存和缓存回收。
2.Linux页高速缓存
页高速缓存缓存的是内存页面。缓存中的页来自对正规文件,块设备文件和内存映射文件的读写。
全局散列表主要存在四个问题:
1.由于使用单个的全局锁保护散列表,所以即使在中等规模的机器中,锁的争用情况也会相对严重,造成性能受损。
2.由于散列表需要包含所有页高速缓存中的页,可是搜索需要的只是和当前文件相关的那些页,所以散列表包含的页面相比搜索需要的页面要大得多。
3.如果散列失败,执行速度比希望的要慢的多,这是因为检索必须遍历指定散列键值对应的整个链表。
4.散列表比其他方法会消耗更多的内存。
*****2.6版本中引入基于基数的页高速缓存来解决这些问题。
3.独立的磁盘块通过块I/O操作也要被存入页高速缓存。
4.flusher线程
以下三种情况发生时,脏页被写会磁盘:
1.当空闲内存低于一个确定的阈值时,内核必须将脏页写会磁盘以便释放内存,因为只有干净的内存才可以回收。
2.当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写会磁盘,以确保脏页不会无限制的驻留在内存中。
3.当用户进程调用sync()和fsync()x系统调用时,内核会按要求执行回写动作。
本章主要学习了linux的页高速缓存和页回写。了解了内核如何通过页缓存执行页I/O操作以及这些页高速缓存可以利用减少磁盘I/O,从而极大地提升系统的性能。