[TOC]
计算机组成原理学习笔记
冯诺依曼体系:
- 必须有一个存储器
- 必须有一个控制器
- 必须有一个运算器
- 必须有输入设备
- 必须有输出设备
控制器和存储器也就是 CPU
如何解决冯诺依曼瓶颈:
这边的存储器主要指的是围绕着 CPU 的高速设备,而这边的存储器主要是指内存和CPU寄存器
程序翻译与程序解释:
假设 L1 是更高级的语言, L0 是低级的语言
计算机的计算单位:
容量单位:
为什么使用 1000 而不是 1024 ,因为使用人类比较容易理解的方式。
速度单位:
比如蝴蝶的翅膀一秒钟振动 15次,就是 15Hz/s 。
所以对 CPU 的描述就是每秒高低电频变化的速度
计算机字符与编码集
ASCII码:
33 + 95 = 128 = 2^7 所以是 7 个 bits
Extended ASCII码:
用 8 个 bits 表示
字符编码集国际化:
中文编码集:
GB2312:不符合国际的标准
GBK:作为 GB2312 的拓展
Unicode:兼容全球的字符集
计算机组成
计算机的总线:
解决不同设备之间的通信问题
总线分类:
总线仲裁方法:
计算机的输入输出设备
输入输出设备
字符输入设备:键盘
图形输入设备:鼠标、扫描仪等
图像输出设备: 显示器、投影仪等
计算机存储器
计算机的主存储器与辅助存储器
计算机高速缓存
它位于 CPU 与 主存之间,用来解决它们之间读写速度不匹配的问题
字与字块
字的寻址,字的地址包含两部分
- 前 m 位指定字块的地址
- 后 b 位指定字在字块中的地址
高速缓存数据结构与主存类型,但是容量小于主存,具有缓存速度快等优点
进制运算基础
- 计算机喜欢二进制,但是二进制表达太长了,所以使用大进制位来解决问题,例如8进制和16进制
二进制运算基础
10进制转换2进制
2进制转换10进制
2进制小数转换10进制
x 的 负a 次方 = x 的 a 次方分之 1
10进制小数转二进制
有符号数与无符号数
源码表示法
- 使用0表示正数,使用1表示负数
- 规定符号位位于第一位
补码表示法
如何计算补码,n = 4
反码表示法
反码补码都根据 n 来隔开符号位与数据位
源码补码反码之间的关系
小数的补码
定点数和浮点数
定点数:小数点固定在某个位置的数称之为定点数
- 符号位与数值位之间
- 符号位与数值位之后
浮点数:
表示格式
N = S ✖️ r^j
S:尾数 r:基数 j:阶码
浮点数的运算
略
操作系统
什么是操作系统
- 管理计算机硬件和软件资源的计算机程序
- 管理配置内存、决定资源供需顺序、控制输入输出设备等
- 操作系统提供让用户和系统交互的操作界面
为什么需要它
- 我们不可能直接操作计算机硬件
- 设备种类繁多复杂,需要统一界面
- 操作系统操作简易,实现了对底层的抽象,无需用户直接操作底层
相关概念
并行与并发
并行:在同一个时刻发生(双处理器,每个时刻都有两个程序在执行)
并发:在一个时间间隔之间发生(单处理器,每次只能处理一个)
共享性
操作系统的资源可供多个并发程序共同使用
互斥共享形式:资源被程序A占用,其他使用只能等待,只有进程A结束,其他才可以使用
什么是进程
为什么需要进程
- 进程是系统进行资源分配和调度的基本单位
- 进程作为程序独立运行的载体保障程序正常执行
- 进程的存在使操作系统资源的利用率大幅提升
进程的实体
标识符:唯一的标识符,进程的id,用于区别其他进程
状态:标记进程的状态运行态、阻塞状态
优先级
程序计数器:指向即将被执行的下一条指令地址
内存指针:指向程序代码或进程数据的指针
上下文数据:进程执行时候处理器存储的数据
IO状态信息:存储的是被进程 IO 操作所占用的文件列表
记账信息:使用处理器时间、时钟数总和等
进程与线程
一个进程可以有一个或多个线程,进程的线程共享进程资源
- 进程是系统进行资源分配和调度的基本单位
- 线程是操作系统进行运行调度的最小单位
进程的五状态
就绪状态
- 当进程被分配到除CPU意外所有必要的资源后
- 只要再获得CPU的使用权,就可以立即执行
- 其他资源都准备好,只差CPU的状态为就绪状态
在系统中多个处于就绪状态的进程,通常排成一个队列,称为就绪队列
- 执行状态
- 进程获得 CPU,其程序正在执行称为执行状态
- 在单处理机中,某一时刻只能有一个进程处于执行状态
阻塞状态
- 进程因某种原因如:其他设备未就绪而无法继续执行(比如要使用打印,因为它是外部设备可能没准备好,就阻塞了)
- 从而放弃CPU的状态称为阻塞状态
多个阻塞进程也会组成阻塞队列
上面 3 个状态是如何切换
- 当进程除了 CPU 以外都准备好之后就进入就绪状态
- 当进程调度发生的时候,就进入执行状态
- 当执行的进程 CPU 用完了(分配给某个进程的执行时间),就会切换为就绪状态
- 当执行状态发生 IO 请求,有可能变为阻塞状态
- 阻塞状态 IO 完成,会进入就绪状态
- 创建状态
- 创建完成
- 终止状态
- 进程执行完毕
进程类型
类型
- 前台进程就是具有终端,能跟用户交互的进程(例如:shell,可以通过 ctrl+c 停止)
- 后台进程基本不和用户交互,优先级比前台进程低
- 守护进程是特殊的后台进程,一般在系统启动的时候就启动了
进程的标记
进程 id:是进程唯一的id,每个进程拥有不同的id,它是一个非负整数,最大值由操作系统限定
进程的状态标记
操作Linux进程的命令
ps:列出当前进程 。(ps -aux –sort=-pcpu)打出进程详细信息按照cpu使用频率排序
top:查看系统所有进程状态
kill:退出进程。(kill -9 进程号)表示无条件停止
进程调度
进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权
进程调度有 2 个过程
- 保留进程信息,请出旧进程
- 选择新进程,准备运行环境并分配CPU
就绪队列排队机制:将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程
选择运行进程的委派机制:调度程序以一定的策略选择进程,并将CPU分配给它
新老进程的上下文切换机制:保存当前进程的上下文信息,装入委派执行进程的运行上下文
非抢占式调度:
- 处理器一旦分配给某个进程,就让进程一直使用下去
- 调用程序不以任何原因抢占正在被使用的处理器
- 知道进程完成工作或因为IO阻塞才会让出处理器
抢占式调度:
- 允许调度程序以一定的策略暂停当前运行的进程
- 保留好旧进程的上下文信息,分配处理器给新进程
调度策略
- 先来先服务算法
- 短进程优先调度算法
- 高优先权优先调度算法
- 时间片轮转调度算法(分配一个时间片执行,时间片用完,就重新进入就绪队列)
死锁
产生的原因
- 竞争资源
- 调度顺序不当
产生的条件(只需要破坏其中一个条件,就能避免死锁产生)
- 互斥条件
- 进程对资源使用是排它性的
- 某资源只能由一个进程使用,其他需要等待
请求保持条件
- 进程至少保持一个资源,又提出新的资源请求
- 新资源被占用,请求被阻塞
- 被阻塞的进程不释放自己保持的资源
不可剥夺条件
- 进程获得的资源未完成之前不能被剥夺
- 只能自己释放
- 环路等待条件
避免死锁条件(满足其中一个即可)
- 破坏请求保持条件:系统运行进程之前,一次性申请所有需要的资源,保证运行期间不会提出资源请求
- 破坏不可剥夺条件:当进程请求资源得不到满足时,释放占有的资源
- 破坏环路等待条件:按照顺序申请资源,避免环路
存储管理之内存分配与回收
为什么需要存储管理,早起计算机编程不需要过多的存储管理,但是计算机和程序变得复杂,存储管理也变得必要。它的目的是确保计算机有足够的内存处理数据,确保程序可以从可用内存中获取一部分内存使用。确保程序可以归还使用后的内存供其他程序使用
内存分配
单一连续分配:
- 单一连续分配是最简单的内存分配方法
- 只能在单用户、单进程的操作系统中使用
固定分区分配
- 固定分区分配是支持多道程序的最简单存储分配方式
- 内存空间被划分为若干固定大小的区域
- 每个分区只提供给一个程序使用,互不干扰
动态分区分配
根据进程实际需要,动态分配内存空间
动态分配算法:
首次适应算法,每次从头部开始寻找适合的内存区,如果没找到就分配失败(缺点是每次都从头开始)
最佳适应算法,空闲区链表按照容量大小排序,遍历空闲区链表找到最佳的合适空闲区(可以快速的找到需要的内存区域)
内存回收(使用空闲链表节点)
- 第一种情况:只需要把空闲区1的容量增大为空闲区即可
- 第二种情况:将回收区与空闲区合并,新的空闲区使用回收区的地址
- 第三种情况:将空闲区1、2和回收区合并,新的空闲区使用空闲区1的地址
- 第四种情况:将回收区插入节点
存储管理之段页式存储管理 6-10
什么是内存碎片?
当页面大小小于节点2-3,就会存在内存碎片