Linux内核设计与实现

第一章 Linux内核简介

  1. Unix仅仅提供几百个系统调用,并且有非常明确的设计目的
  2. 在Unix中,所有的东西都被当做文件对待
  3. 通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络,进程间通信等系统服务程序共同组成。
  4. 当一个程序执行一条系统调用时, 我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为通过系统调用在内核空间执行,而内核被称为运行于进程上下文中。
  5. 当硬件设备想和系统通信时,它首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。内核通过中断号查找相应的中断服务程序,调用它处理中断。中断服务程序在一个与所有进程都无关,专门的中断上下文中执行。
  6. CPU在指定时间的活动有以下三种:Linux内核设计与实现_第1张图片

第三章 进程管理

  1. 内核把进程的列表存放在叫做任务队列的双向循环链表中,每一项都是一个称为进程描述符的结构。
  2. 进程的状态:
    Linux内核设计与实现_第2张图片
    Linux内核设计与实现_第3张图片
  3. 当一个程序执行系统调用或者触发异常,它就陷入了内核空间。
  4. 内核在系统启动的最后阶段启动init进程。该进程读取系统的初始化脚本并执行其他的相关程序,最终完成系统启动的整个过程。
  5. 在Linux中,线程仅仅被视为一个与其他进程共享某些资源的进程。
  6. 内核线程:独立运行于内核空间的标准进程。内核线程没有独立的地址空间,只在内核空间运行,可以被调度和抢占。
  7. 进程终结时所需要的清理工作和进程描述符的删除被分开执行。在父进程获得已终结的子进程的信息后,或者通知内核它并不关心这些信息后,子进程的task_struct结构才被释放。

第四章 进程调度

  1. 进程调度程序是确保进程能有效工作的一个内核子系统。、
  2. 对于IO消耗型的进程应该多调度,每次调度的时间片少一些。对于CPU消耗型的进程,应该少调度,每次调度的时间片长一些。调度策略通常要在两个矛盾的目标中间寻找平衡。Linux更倾向于优先调度IO消耗型进程。
  3. 用户和系统都可以设置进程的优先级来影响系统的调度。Linux采用了两种不同的优先级范围。一种是nice值(越大优先级越小)一种是实时优先级(值越大优先级越高)。任何实时进程的优先级都高于普通的进程。
  4. Linux的CFS调度器将处理器的使用比划分给了进程。抢占时机取决于新的可运行程序消耗了多少处理器使用比,如果消耗的比当前进程小,则新进程立刻投入运行,抢占进程。
区分中断和异常:
  1. 中断:指硬件中断,设备与CPU进行通信
  2. 异常
    1. 出错(fault):出错(fault)保存的EIP指向触发异常的那条指令,如缺页异常
    2. 陷入(trap):陷入(trap)保存的EIP指向触发异常的那条指令的下一条指令
    3. 软件中断:即系统调用,执行系统调用程序
  3. 异常在产生时必须考虑与处理器时钟同步。硬件设备生成中断的时候并不考虑与处理器的时钟同步。

第五章 系统调用

  1. 一般情况下,应用程序使用的是API而不是直接的系统调用,一个API可以使用多个系统调用或者不使用系统调用。
  2. POSIX标志定义了一组API,API和系统调用都封装在C库里面(glibc),应用程序调用C库里面的API(如printf接口)
    3.在Linux中,每个系统调用被赋予了一个系统调用号。进程不会提及系统调用的名称。
  3. 系统调用号和参数通过寄存器来传递
  4. 系统调用过程中,内核可以休眠和被抢占
  5. 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
  6. 堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

第七章 中断和中断处理

  1. 中断本质是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚中,中断控制器再给处理器发送一个电信号。处理器一经检查到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断。这样,操作系统就可以对这个中断进行适当的处理了。
  2. 一个设备的中断处理程序是它设备驱动程序的一部分,设备驱动程序是用于对设备进行管理的内核代码。
  3. 中断上下文也被称作原子上下文,该上下文中的执行代码不可阻塞
  4. 我们一般将中断处理分为上半部和下半部。上半部只做有严格时限的工作,例如对接收的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。
  5. 中断上下文不允许调用会导致睡眠的函数,因为睡眠就会主动放弃当前cpu控制权,由调度器选一个进程恢复上下文后继续执行。调度器只能恢复进程上下文,不能恢复中断上下文。
  6. Linux中的中断处理程序是无须重入的。当一个给定的中断处理程序正在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接收另一个新的中断。通常情况下,所有其他的中断都是打开的。所以同一个中断处理程序绝对不会被同时调用以处理嵌套的中断。

第八章 下半部和推后执行的工作

  1. 中断处理程序指的是上半部,这里我们要讨论的是下半部。下半部的任务就是执行与中断处理密切相关但中断处理程序本身不执行的工作。
  2. 下半部执行的关键在于当他们运行的时候,可以响应所有中断。

第九章 内核同步介绍

  1. 有人会觉得,锁只是把临界区缩小到加锁和开锁之间,但是仍然具有潜在的竞争。所幸,锁是使用原子操作实现的,原子操作不存在竞争。

第十章 内核同步方法

  1. 原子操作是其他同步方法的基石
  2. 内核同步方法包括:原子操作,自旋锁,读写自旋锁,信号量,读写信号量,互斥体(实现是简单的信号量),完成变量(思想与信号量一样,都是等待唤醒,仅仅提供了替代信号量的一个简单的解决方法)
  3. Linux读写自旋锁时照顾读比照顾写要多一点。当读锁被持有时,写操作为了互斥访问只能等待,但是读者却可以继续成功地占用锁。而自旋等待的写者在所有读者释放锁之前是无法获得锁的。
  4. 顺序锁:顺序锁对写者更加有利。
  5. seqlock的实现思路是,用一个递增的整型数表示sequence。写操作进入临界区时,sequence++;退出临界区时,sequence再++。写操作还需要获得一个锁(比如mutex),这个锁仅用于写写互斥,以保证同一时间最多只有一个正在进行的写操作。
    当sequence为奇数时,表示有写操作正在进行,这时读操作要进入临界区需要等待,直到sequence变为偶数。读操作进入临界区时,需要记录下当前sequence的值,等它退出临界区的时候用记录的sequence与当前sequence做比较,不相等则表示在读操作进入临界区期间发生了写操作,这时候读操作读到的东西是无效的,需要返回重试。
  6. seqlock的一个典型应用是时钟的更新,系统中每1毫秒会有一个时钟中断,相应的中断处理程序会更新时钟(见《linux时钟浅析》)(写操作)。而用户程序可以调用gettimeofday之类的系统调用来获取当前时间(读操作)。在这种情况下,使用seqlock可以避免过多的gettimeofday系统调用把中断处理程序给阻塞了(如果使用读写锁,而不用seqlock的话就会这样)。中断处理程序总是优先的,而如果gettimeofday系统调用与之冲突了,那用户程序多等等也无妨
  7. 内存屏障

第十一章 定时器和时间管理

  1. 内核中有大量函数都是基于时间驱动的,像对调度程序中的运行队列进行平衡调整或对屏幕进行刷新这样的函数,都需要定期执行。
  2. 系统定时器(周期性产生的事件)和动态定时器(推迟执行程序的工具)有区别
  3. 高HZ会更加精确,但是会增加系统负载和耗电
  4. 实际时间

第十二章 内存管理

  1. vmalloc函数的工作方式类似于kmalloc,只不过前者分配的内存虚拟地址是连续的,而物理地址则无须连续。这是用户空间分配函数的工作方式。
  2. 大多数情况下,只有硬件设备需要得到物理地址连续的内存。因为硬件设备存在于内存管理单元之外,它根本不理解什么是虚拟地址。
  3. vmalloc为了把物理上不连续的页转换为虚拟地址空间上连续的页,必须建立专门的页表项。通过vmalloc获得的页必须一个一个地进行映射,这就会导致比直接内存映射大得多的TLB抖动。因此,vmalloc(类似于用户空间的malloc)仅在不得已时才会使用。
  4. malloc内存分配器实现

操作系统概念内存管理

  1. CPU所能直接访问的存储器只有内存和处理器中的寄存器。如果数据不在内存中,那么在CPU使用前必须先把数据移到内存中。

第十三张 虚拟文件系统

  1. VFS把目录当成文件对待,所以可以对目录执行和文件相同的操作
  2. 文件的元信息称为iNode
  3. Linux中的文件描述符与打开文件之间的关系

线程栈的空间开辟在所属进程的堆区,线程与其所属的进程共享进程的用户空间,所以线程栈之间可以互访
线程栈在linux下默认是8M大小,通过mmap开辟线程栈

https://blog.csdn.net/yusiguyuan/category_1707013.html
https://blog.csdn.net/xd_hebuters/category_7291514.html

你可能感兴趣的:(Linux)