3.1 术语
3.2 背景
3.2.1 内核
内核管理者cpu调度,内存,文件系统,网络协议,以及系统设备(磁盘,网络接口等)。通过系统调用提供访问设备和内核服务的机制。
内核执行:
内核的执行主要是按需的。例如,当用户级别的程序发起一次系统调用,或者设备发送一个中断时,一些内核线程会异步的执行一些系统维护工作。
时钟:
经典的unix内核的一个核心组件是 clock() 例程,从一个计时器中断执行。历史上它每秒执行的次数为 60100或者1000次,每次执行称为一次tick。
功能包括更新系统时间,计时器和线程调度时间片的到时结束,维护cpu统计数据,以及执行callout(内核调度例程)。
内核态:
内核是唯一运行在特殊cpu模式的程序,这一特殊的cpu模式叫做内核态。
无论是用户态还是内核态,都有自己的软件执行上下文,包括栈和寄存器。这些状态切换上下文是会耗时的(cpu周期)。
3.2.2 栈
栈用函数和寄存器的方式记录了线程的执行理事。
当函数被调用的时候,cpu当前的寄存器组(保存cpu状态)会存放在栈里,在顶部会为线程的当前执行添加一个新的栈帧。函数通过调用cpu指令"return"终止执行,
从而清除当前的栈,执行会返回到之前的栈,并恢复相应的状态。
如何读栈:
栈的顶部通常出现在第一行。从左到右,分别是 内核模块的位置(kernel),指令的偏移量(0x1,这里指的是函数内指令的地址)。父函数在下面,从上往下阅读栈。
用户栈和内核栈:
在执行系统调用的时候,一个进程的线程有两个栈:一个用户级别的栈和一个内核级别的栈。
3.2.2 中断和中断线程
除了响应系统调用外,内核也要响应设备的服务请求,这称为中断,它会中断当前的执行。
中断服务程序需要通过注册来处理设备中断。这类程序的设计要点是需要运行的尽可能快,以减少对活动线程中断的影响。如果中断要做不少工作,尤其是
还可能被锁阻塞,那么最好用中断线程来处理,由内核来调度。
3.2.4 中断优先级
中断优先级(IPL)表示的是当前活跃的中断服务程序的优先级。
3.2.5 进程
进程是用以执行用户级别程序的环境。
进程创建:
正常情况下通过系统调用 fork() 来创建。fork() 用自己的进程号创建自身进程的一个复制,然后通过系统调用 exec() 才能开始执行不同的程序。
进程生命周期:
idle, ready to run, on-proc, sleep, zombie
on-proc 是指进程运行在处理器上。ready-on-run 是指进程可以运行,但是还在cpu的运行队列里等待cpu。IO阻塞,让进程进入sleep状态直到IO完成进程被唤醒。
zombie状态发生在进程终止,这时进程等待自己的状态被父进程读取,或者直至被内核清楚。
3.2.6 系统调用
系统调用请求内核执行特权的系统例程。
3.2.7 虚拟内存
虚拟内存是主存的抽象,提供进程和内核,它们自己的近乎是无穷的和私有的主存视野。它还支持主存的超额使用,如果需要,操作系统可以将虚拟内存在主存和二级存储(磁盘)
之间映射。
3.2.8 内存管理
当虚拟内存用二级存储作为主存的扩展时,内核会尽力保持最活跃的数据在主存中。有以下两个内核例程做这件事:
1.交换,让整个进程在主存和二级存储之间做移动
2.换页,移动称为页的小的内存单元(4kb)
3.2.9 调度器
unix及其衍生的系统都是分时系统,通过划分执行时间,让多个进程同时运行。
1.cpu密集型
应用程序执行繁重的计算。
2.IO密集型
应用程序执行IO,计算不多,这些都需要 低延时的响应。
3.2.10 文件系统
文件系统是作为文件和目录的数据组织。
VFS:
虚拟文件系统(vfs),是一个对文件系统类型做抽象的内核界面。
IO栈:
基于存储设备的文件系统,从用户级软件到存储设备的路径被称为IO栈。
3.2.11 缓存
3.2.12 网络
连接网络的物理设备是网络接口,一般使用网络接口卡(NIC)。
3.2.13 设备驱动
设备驱动是用于设备管理和设备IO的内核软件。
3.2.14 多处理器
3.2.15 抢占
3.2.16 资源管理
3.2.17 观测性
3.3 内核
3.3.1 UNIX
3.3.2 基于Solaris
3.3.3 基于Linux
3.3.4 差异