《Linux内核设计与实现》学习笔记

第三章 进程管理

1、内核线程和普通的进程相比,没有独立的地址空间;
2、进程退出,而未被wait时,占用内核栈、thread_info结构和task_struct结构

第四章 进程调度

1、CFS公平调度器,将任何进程获得的处理器时间是通过自己和其他所有可运行进程nice值的相对差值绝对。(nice决定对处理器使用比)
在CSF中,没有时间片的概念。
2、CSF的核心是:选择具有最小的vruntime的任务;(红黑树)
3、抢占和上下文切换;
1)上下文切换:把虚拟内存从上一个进程切换到新进程中;将上一个进行的处理器状态切换到新进程的处理器状态(包括保存、恢复栈信息和寄存器信息等)等;
2)用户抢占:从系统调用返回用户空间时;从中断处理程序返回用户空间时;
3)内核抢占:中断处理程序正在执行,且返回内核空间之前;内核代码再一次具有可抢占性的时候;若果内核中的任务显示调用schedule();如果内核中的任务阻塞;
4、实时调度策略:SCHED_FIFO/SCHED_RR

第五章 系统调用

在这里插入图片描述
1、 内核驻留在受保护的地址空间上;
2、 系统调用通知内核的机制是靠软中断实现的;系统调用号通过eax寄存器传递给内核;
3、 系统调用必须仔细检查它们所有的参数是否合法有效。比如文件描述符有效性,指针有效性,是否有合法权限调用这个系统调用;
在这里插入图片描述

第六章 内核数据结构

1、链表;(单向、双向、循环)
2、队列;
3、映射;
4、二叉树;(红黑树)

第七章 中断和中断处理

在这里插入图片描述

第十章 内核同步方法

在这里插入图片描述

第11章 定时器和时间管理

在这里插入图片描述
1、 系统定时器根本思想:提供一种周期性触发中断机制;

第12章 内存管理

在这里插入图片描述在这里插入图片描述
1、 深入理解Linux高端内存
参考:https://www.jianshu.com/p/0b8e1879729a

第13章 虚拟文件系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1、 在linux中,将目录和文件统一看做是文件;
2、 每一个文件(包括目录)都有对应的inode,里面包含了与该文件有关的信息(除了文件名)——文件名存放在父目录的数据部分;
3、 Inode中存放了相关的时间戳、数据block、文件拥有者的用户ID、组ID、链接数、权限等;
4、 用户通过文件名打开文件的步骤:1)根据文件名找到对应的inode号;2)根据inode号,获取inode信息、3)根据inode信息找到数据所在的block;
5、 在文件类型为目录时,其磁盘上的数据是一系列的文件名和其对应的inode号。因此在遍历目录时,实际上第一次会不断地读取文件(目录)的实际数据,以解析成目录项对象。进一步地,为了提高性能,引入了目录项缓存;
6、 文件对象表示已打开的文件在内存中的表示;(一个文件可能有多个文件对象;多个进程也可能拥有同一个文件对象);此外,文件对象内包含引用计数、偏移量、访问模式、
7、 目录项对象和文件对象实际上没有对应的磁盘数据;
8、 文件描述符是针对进程的(同一个fd编号在不同的进程中也代表不同的指向)
9、文件描述符-》文件对象-》inode节点;

在这里插入图片描述

第14章 块I/O层

1、 I/O调度程序的工作时管理块设备的请求队列,决定队列中的请求排列以及在什么时候派发请求到块设备。
2、 I/O调度程序通过两种方法减少磁盘寻址时间:合并与排序;合并是为了将多次请求压缩成一次请求;排序时不仅是方便合并,也是为了保持磁盘头可以直线方向移动,缩短所有请求的磁盘寻址时间。
3、 I/O调度算法:
1)电梯调度;(存在饥饿问题)
在这里插入图片描述
2)最终期限调度;
相比于电梯调度,有三个队列:排序队列、读请求队列(FIFO)、写请求队列(FIFO);其中FIFO主要进行期限调度,即超时强行派发;(此外还有一个派发队列)
注:对于读请求,一般客户段是需要同步等待的,因此其超时时间需要短点;;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3)预测I/O调度;(请求执行后,等一下,看看有没有附近的磁盘操作请求)
在这里插入图片描述
4)完全公平排队调度(每个进程维护一个队列)
在这里插入图片描述
5)空操作调度;(近尝试合并,仅仅维护一个近似FIFO队列)
在这里插入图片描述

第15章 进程地址空间

1、 在linux中,是否共享地址空间几乎是进程和linux中所谓线程间本质上的唯一区别;
2、 内核线程没有进程地址空间,也没有相关的内存描述符,即没有用户上下文;
3、 虚拟内存区域(VMA):描述了指定地址空间内连续区域上的一个独立内存范围;每个内存区域有一致的属性,如访问权限;
4、 Mmap()和do_mmap():创建地址区间;mummap()和do_mummap():删除地址区间;
在这里插入图片描述

5、 页表;(地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表项则指向下一级别的页表或者指向最终的物理页面)
6、Linux中使用三级页表完成地址转换,并使用TLB作为虚拟地址映射到物理地址的硬件缓存;
在这里插入图片描述

第16章 页高速缓存和页写回

在这里插入图片描述
1、 写缓存策略:
1) 不缓存:对数据进行写时,直接跳过缓存,写到磁盘;
2) 写透缓存(write-through cache):写操作同步更新内存缓存与磁盘文件;
3) 回写(常用):写操作直接写到缓存中,并将该页标记为“脏”,并将其加入到脏页链表。然后由一个进行(会写进程)周期地将脏页链表中的页写回到磁盘,从而让磁盘数据和内存中保存最终一致;
2、 缓存回收;在linux的缓存回收选择干净页进行简单替换。如果缓存中没有干净页面,内核将强制地进行回写操作,以腾出更多的干净可用页。
——理想的回收策略应该是回收那些以后最不可能使用的页面;
1)最近最少使用LRU;
在这里插入图片描述
2)LRU-k;
3)2Q
参考:https://segmentfault.com/a/1190000022558044?utm_source=tag-newest
3、Linux页高速缓存——所有的IO,必须通过页高速缓存进行;
在这里插入图片描述
3、 基树;在基树中,迅速检索到希望的页;
4、 Flusher线程
在这里插入图片描述
注:flusher线程会周期性地被唤醒并且把超过特定期限的脏页写回磁盘;
注:使用多线程的flusher来解决阻塞问题;
在这里插入图片描述
5、 通过称为回写缓存的进程维护在缓存中的更新页面——具体做法是标记内存中的页面为脏,然后找时机延迟写到磁盘中。

其它

1、 Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题;
2、 slab是Linux操作系统的一种内存分配机制。其工作是针对一些经常分配并释放的对象,如进程描述符等,这些对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内碎片,而且处理速度也太慢。而slab分配器是基于对象进行管理的,相同类型的对象归为一类(如进程描述符就是一类),每当要申请这样一个对象,slab分配器就从一个slab列表中分配一个这样大小的单元出去,而当要释放时,将其重新保存在该列表中,而不是直接返回给伙伴系统,从而避免这些内碎片。slab分配器并不丢弃已分配的对象,而是释放并把它们保存在内存中。当以后又要请求新的对象时,就可以从内存直接获取而不用重复初始化。
在这里插入图片描述
注:slab着色主要是为了优化CPU缓存的利用率。比如有两个对象,只能被分配到第一个缓存行(直接映射),那么如果交替访问这两个对象,就会出现换入换出的现象。而slab着色则是使得另一个对象可以通过偏移操作放置在第二个缓存行;
注:着色即为添加偏移。
参考:https://blog.csdn.net/keep_moving_gogogo/article/details/25620959
3、 主存到Cache直接映射、全相联映射和组相联映射
参考:https://www.cnblogs.com/814467783sweet/p/9640633.html
4、 伙伴系统:分配页面个数只能是2个整数次幂
5、 一般可以将内存分为:可移动(用户内存)、不可移动(内核内存)、可回收(缓存);
6、 内核线程和用户线程区别是,内核线程没有虚拟地址空间;
7、 内核中mmap的4种类型
在这里插入图片描述
参考博客:https://www.cnblogs.com/linhaostudy/
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值