一 计算机基础总结

1 x86架构及基本术语

1 特权级别和用户指令级别


环0 特权区
环3 用户指令级,不发送系统调用,则直接在CPU 中运行,如果涉及到调用,如果是内核的功能,则需要转换为特权模式的功能,一旦发起系统调用,调用执行别的函数或库,如果调用的是内核的功能,则CPU需要转换为特权模式,在特权模式中执行的一定是内核的代码,如果程序本身没有调用内核的操作,则程序在运行到需要调用内核的操作时,需要通过程序给内核发送一个指令,通过在内核中运行指令,并将结果返回到对应的程序中,这个程序将继续进行操作,内核模式只是支撑用户模式来完成内核模式需要的操作的。

shell : 负责特权区和用户区之间的切换,任何一个没有shell的操作系统,如果需要做一些特定的操作,则不能成功

2 操作系统能力评估

操作系统能否提升能力,通常需要看他是不是在用户空间占用了大量的空间,如果一个程序的用户控件占用率很大而内核空间占用率较小则表明其程序的设计并没有产生很大的效率。内核模式本身并不产生能力

3 守护程序

操作系统完成基本功能的需要

4 其他相关术语概述

上下文切换:进程之间的切换
保存现场: 用于在切换时将被切换进程的信息保存在内存的情况
线程: 将串行执行流修改成并行执行流,此称为线程


南桥:内存和CPU 之间的链接是通过南桥芯片实现的
北桥:北桥芯片负责的是和IO之间的链接


程序局部性原理:
1 空间局部性: 一个数据被访问后,其临近的数据也会很快被访问到
2 时间局部性: 当执行完某个指令后,有可能很快后又会调用该指令


1 设备控制器: 集成在主板上的一块芯片或一组芯片,负责控制对应设备,通过从操作系统获取指令并执行相应的操作,将操作转换成对应的操作
寄存器: 被集成在控制器内部的

IO地址空间:所有的控制器的寄存器加起来成为这个设备的IO地址空间,也叫IO端口空间

2 计算机历史

1 真空管:穿孔卡片
2 晶体管:此时出现了批处理系统,主机的个头较大。在某一时刻,只能运行一个实例。
批处理: 一次上传多个,一次处理一个

3 集成电路芯片 多道处理,程序的运行起始到结束通过监控实现,监控程序负责在系统上运行多个程序,此时便产生了进程,
多道处理:相当于进程,分时系统

4 大规模集成电路

3 操作系统基本体系:

1 各设备之间连接需要总线,总线早期不是系统发展的瓶颈,星型结构需要CPU的大量工作,因此不适用于发展
计算机的总线:
地址总线:数据寻址
数据总线:数据传输
控制总线

4 CPU

1 CPU运行步骤及其组件

1 步骤

从内存中取出指令并运行它
需要经过四个步骤:
1 取出指令
2 解码指令
3 确定类型
4 执行指令

2 三大组件:

1 取址单元
2 解码单元
3 执行单元
三个功能可以通过一个芯片来完成

2 指令计数器

CPU的寄存器 :每完成一个指令会记录其配置,控制芯片和存储芯片,其周期和CPU的周期相同,这些被成为CPU的寄存器


上下文切换:操作系统必须清楚的了解每一个寄存器,在多进程中,操作系统通常会挂起某一个进程转而运行其他的进程。这叫上下文切换,将其进程挂起时,状态将会被记录。需要将进程中的各种数字,计数器等必须进行保存,这个称谓保存现场。保存和恢复需要时间,其保存在内存中。


复用技术 : 如果进程很多的情况下,每一个进程切换则会浪费很多时间,nginx可以做到进程的不切换和进程的复用技术


进程的绑定: 将某一进程与CPU 之间的绑定,如此可以成为CPU 的调优

3 基本调优:

1 进程不切换,实现复用(nginx)
2 进程与CPU 绑定
3 提高缓存,命中率的方式,将一个进程绑定到一个核心上是为了提高缓存命中率

4 CPU 的升级

1 进行三个取值单元,解码单元和执行单元的三级流水,同一时刻,每个单元都不能闲着
操作系统基础

2 多核心,超线程(多线程)
一颗CPU 在两个不同线程之间进行切换,在CPU内部引入一个类似的寄存器
一个CPU 在同一时刻执行两个程序
早期CPU 的频率是依靠其工作频率来实现的,时钟在一秒内完成的操作个数
一个进程的执行通常只能用到一个CPU
将串行执行流修改成并行执行流,称为线程


5 其他相关

并行编程问题:
同时执行,能否同时结束
线程之间协调不明确问题


Linux对每一个线程的调度仍然是进程级别的

CPU 和内存之间的协调

内存的工作频率小于CPU,但会越来越好
内存和CPU 之间的链接是通过南桥芯片实现的,
北桥芯片负责的是和IO之间的链接

通过一定的限制来实现CPU 和内存之间的协调

缓存的目的: 空间换区资源

一级缓存和二级缓存是专用的

三级缓存时共享的

程序局部性原理 :
1 空间局部性: 一个数据被访问后,和其内存位置近的数据也会被很快访问到。

2 时间局部性: 当指令执行完成后,很快可能会被再次访问到。


计算机的存储层次:

机械硬盘----固态硬盘------内存------高速缓存----寄存器----CPU

SMP (对称多处理器)
多个CPU 插槽 CPU socket

CPU 的速度一定比内存快 通过加缓存来实现(三级----二级-----一级)
一级缓存和二级缓存是专用的,三级缓存是共享的
CPU 的性能需要看一级和二级缓存的大小

5 IO 设备

1 IO设备概述:

1 IO设备组成:

1 设备控制器: 集成在主板上的一块芯片或一组芯片,负责控制对应设备,通过从操作系统获取指令并执行相应的操作,将操作转换成对应的操作
2 设备本身

2 执行运行步骤

其指令执行步骤: 操作系统----驱动----设备本身
IDE 集成驱动电子设备
真正的硬件操作是由驱动完成的,此驱动程序应该由设备生产厂商研制。
驱动程序通常位于内核中
每一个控制器都有少量的用于实现通信的寄存器,此时被集成在控制器内部的

IO端口空间
每个控制器都有由少量的专门用于通信的寄存器,如一个硬盘控制器可能有用于指定硬盘地址和内存地址的寄存器,还有扇区技术,方向(读写)等相关的寄存器。任何时候要激活一个控制器,需要驱动程序从操作系统中接受指令然后将其转换成对应设备的基本操作并把操作请求放置到寄存器中,所有的控制器的寄存器加起来成为这个设备的IO地址空间,也叫IO端口空间,每个寄存器表现为一个I/O端口。

2 IO 端口相关:

IO 端口被编址(16位),每一个IO端口都有一个独立的编址,多个寄存器则需要有多个编址。
一个控制器可能有多个端口,及多个寄存器
不同主板上的设备控制器不同,没办法事先进行固定,需要动态指制定,当设备开机时,每一个IO设备都要向IO空间注册地址端口
空间16位二进制 0-65535
CPU 和指定的IO进行通信,需要通过其IO端口来实现
对于某些众所周知的设备,则使用一些特定的端口

3 实现输入输出的三种方式:

1 忙等待

用户程序发起一个系统调用,内核将其翻译成为一个对应设备驱动的过程调用,设备驱动程序启动IO并在一个连续不断的循环中检测设备,来看是否执行完成(忙等待)
缺点: 性能不好,轮训机制,在固定的时钟周期内查询其是否需要执行的操作

2 中断:

IO 设备主动发送通知这种方式成为中断,能够中断CPU执行的操作,来通知内核执行响应的请求,中断控制器发送中断信号
每一个IO设备要从中断控制器中获取一个中断向量

中断切换: CPU进行中断切换来指定IO 设备的相关操作,CPU触发内核,内核将相关的进程挂起并自己运行在CPU上来根据
发出请求的IO设备来获取数据或其中断请求


中断分为两步:
1 中断的上半部:只是将中断请求处理,并去读到内核缓冲区中
2 中断下半部:处理相关的数据

上半部通常要立即处理,但下半部则不一定

缺点: 当一个jar包到达时,其会被分解为成千上万的报文,则如果每一个报文触发构建一次,则会非常耗时,则意味着
CPU的繁忙程度会成倍增加

3 DMA

直接内存访问 IO设备上带的具有智能性的控制芯片,当需要发生中断时,CPU会通知对应的DMA,告诉DMA接下来的总线归你使用,如此便完成了其复制的操作,DMA仅负责接入和接出CPU 通知内核读取完成。

DMA 内核中的存储空间,查看其目标IP,如果是自己的,则进行拆包,

网卡,硬盘等都有DMA

CPU 被抽象成程序线

1 CPU (MMU)

2 内存

3 多个IO设备,IO 设备的标识(寄存器) IO 端口


优化: 网卡设备的缓冲区可以进行适当的调整


网卡中断
网卡触发中断,并将相关的数据包放置进入缓冲区,并进行触发内核操作并将网卡缓冲区的数据复制到内核缓冲区中,内核中的存储空间,查看其目标IP,如果是自己的,则进行拆包。

6 进程相关

1 术语

MMU : 用于转换线性地址和物理地址的桥梁
TLB : 用于缓存线性地址和物理地址的映射
其线性地址和物理地址的映射关系保存在内核内存中
RAM : 随机存储器
ROM : 只读存储器


默认的内存页大小是4K
在操作系统中被最基本的抽象出来的东西:
CPU 被抽象成时间线而后将程序分配为进程,而后通过时间线将程序运行起来的过程
程序被抽象成进程,CPU 被抽象成时间线


早期的操作系统的组织方式:
内存的地址空间
1 操作系统位于内存中, 但进程整个是RAM(随机存储器,是与CPU直接交换的数据的内部存储器) 内存空间和用户空间

用户程序运行在RAM中,操作系统运行在ROM(只读存储器,是一种只能读出事先所存储的固态半导体存储器)中

os 在ROM中,

CPU 访问内存空间,需要读取内存对应的地址,程序知道自己运行的地址 变量命名时的内存空间,所以根据变量名就可以获取
内存地址空间
CPU 有一个寻址单元,CPU 地址总线,数据总线, 控制总监 32 位 2^32=4G字节
CPU 64 为则是64个字节4G的4G 4G^4G 则是一个海量空间
OS 中最重要的部分就是驱动程序

ROM(驱动)和RAM(OS)一起

多个应用程序产生的问题

内存的使用通过虚拟地址空间实现的
IO:磁盘IO在内核中表现为文件的形式,我们的存储才会方便

2 进程:

资源集
CPU 时间
内存: 地址空间,被抽象成虚拟存储空间(32bit:4G) 在Linux中,内核固定使用特定的内存,而进程则使用
其他的内存,线性地址空间,进程都有自己独立的内存空间
IO 文件
键盘鼠标都属于文件,不过都是设备文件
文件分类:
1 一般文件 正常文件
2 设备文件 块设备 字符设备
3 管道文件 进行相关交互时使用
打开了多个文件
在进程内部,每个文件都有自己的文件标号 FD(file descriptor)
输入0 标准输出1 错误输出2
一个主机如果是多进程的,则需要标识其自己的资源集,(task struct) 内核为每个进程维护数据结构,内存空间

内核为了追踪进程的状态,会在自己的内核的内存空间中建立一个连接,保存了进程的ID,打开文件量,内存的使用量
每一个进程需要保存程序计数器

每一个程序的执行只会加载目前所需要的环境,并不是加载所有环境,用户空间的内存,内存将其切割成一个固定大小的存储单元,
通常是4K一个存储单元,每个叶匡都有其编号(page frame) 4G 有1M 的叶匡

每一个进程的启动都会认为自己有3G内存可用,但3G并没有完全占用,只是占用了少量

地址空间: 代码段,初始化为0的数据段,离散的随机空间,堆 没有被使用,被映射进来的共享内存库。
栈代码段----数据段-----堆------栈
对进程来讲,内存的最小单元是页面,对内存来讲,称之为叶匡
进程认为内存是一起的,但在内核端存储是离散的
当进程真的需要使用内存空间时,需要从申请对应的空间并由内核进程调用,并返回相对应的空间,其是一个一个的存储
每一个进程的线程地址空间和内存地址空间之间是有转换的
当某一个进程需要在CPU 上执行时,需要读取响应的资源:
CPU 会从屋里地址空间取出数据,但进程给的是线性内存空间,其线性地址和物理地址的映射关系保存在内核内存空间的映射表中,CPU需要完成
从线性地址到物理地址的转换过程
其映射不是直接映射,而是使用多级映射,如果使用一对一的映射,则其映射空间是巨大的

MMU: 当进程切换时,MMU 需要切换,需要从各种状态字和相关的映射关系MMU 完成的是物理寻找,页表映射

在MMU 之前加入缓存,当程序发出一个地址之后,会先在缓存中查看其的映射关系,然后再进行操作,否则在MMU中查找,缓存空间通常都不大
使用大内存页的原因是使其访问速度更快
TLB 转换后的缓冲器
在进程中的切换中MMU 是要被清空的,TLB 的转化结果不会发生改变

早期 虚拟设备的进程需要经过两次MMU 的转换, 线性地址空间---主机地址----物理地址
现在的CPU已经有两级MMU 完成,早期通过模拟的方式完成的

3 系统优化:

1 进程优化 进行进程和CPU 的绑定
2 内存优化 TLB 使用大内存页,尽量使用本地内存,页的分配回收,内存同步的算法
网络优化和IO优化最终都要转化为内存优化

3 CPU

优化的是机制的本身,不是机制的结果

调整内核参数

硬盘的读写操作:
一般是取得读操作,读要优先满足,写是缓冲的,I/O调度变慢

寻道最花费时间

两个缓冲器的调整和I/O算法的调整 磁盘的I/O队列调度器