本文对学习内容做一个记录,方便后期对知识点复习和补充。
课程:计算机组成原理、操作系统、计算机网络
操作系统概览
What&Why
什么是操作系统?
- 操作系统是管理计算机硬件和软件资源的计算机程序
- 管理配置内存、决定资源供需顺序、控制输入输出设备等
- 操作系统提供让用户和系统交互的操作界面
- 操作系统的种类是多种多样的,不局限于计算机
- 从手机到超级计算机,操作系统可简单也可复杂
- 在不同的设备上,操作系统可向用户呈现多种操作手段
- 简单一句话概述:操作系统是管理硬件、提供用户交互的软件系统
为什么要使用操作系统?
- 我们不可能直接操作计算机硬件
- 设备种类繁多复杂,需要统一界面
- 操作系统的简易性使得更多人能够使用计算机
操作系统的基本功能

- 操作系统统一管理着计算机资源
- 操作系统实现了对计算机资源的抽象
- 用户无需面向硬件接口编程
- I/O设备管理软件,提供读写接口
- 文件管理系统,提供操作文件接口
- 操作系统提供了用户与计算机之间的接口
- 图像窗口形式
- 命令形式
- 系统调用形式
操作系统的相关概念
并发性


共享性
- 共享性表现为操作系统中的资源可供多个并发的程序共同使用
- 这种共同使用的形式称为资源共享
- 资源共享根据属性可分为两种方式
- 互斥共享形式:当资源被程序A占用时,其他想使用的话只能等待进程A使用完以后,其他进程才可以使用该资源
- 同时访问形式:某种资源在一段时间内并发的被多个程序访问,这种"同时"是宏观的,从宏观去看该资源可以被同时访问
虚拟性
- 虚拟性表现为把一个物理实体转变为若干个逻辑实体
- 物理实体是真是存在的,逻辑实体是虚拟的
- 虚拟的技术主要有时分复用技术和空分复用技术
- 时分复用技术:资源在时间上进行复用,不同程序并发使用,多道程序分时使用计算机硬件资源,提高资源利用率

- 空分复用技术:用来实现虚拟磁盘、虚拟内存等,提高资源利用率,提升编程效率

- 时分复用技术:资源在时间上进行复用,不同程序并发使用,多道程序分时使用计算机硬件资源,提高资源利用率
- 异步性
- 在多道程序环境下,允许多个进程并发执行
- 进程在使用资源时可能需要等待或放弃
- 进程的执行并不是一气呵成的,而是以走走停停的形式推进
操作系统的文件管理
文件的逻辑结构
逻辑结构的文件类型
-
有结构文件
- 包含文本文件、文档、媒体文件等
- 文件内容由定长记录和可变长记录组成
- 定长记录存储文件格式、文件描述等结构化数据项
- 可变长记录存储文件的具体内容

-
无结构文件
- 包含二进制文件、链接库等
- 也称为流式文件,文件内容长度以字节为单位,如exe文件、dll文件、so文件
顺序文件
- 顺序文件是指按顺序存放在存储介质中的文件
- 磁带的存储特性使得磁带文件只能存储顺序文件
- 顺序文件是所有逻辑文件当中存储效率最高的
索引文件
- 可变长文件不适合使用顺序文件格式存储
- 索引文件是为了解决可变长文件存储而发明的一种文件格式
- 索引文件需要配合索引表完成存储的操作

辅存的存储空间分配
辅存的分配方式
-
连续分配
- 顺序读取文件内容非常容易,速度很快
- 对存储要求高,要求满足容量的连续存储空间
-
链接分配
- 链接分配可以将文件存储在离散的盘块中
- 需要额外的存储空间存储文件的盘块链接顺序
- 分为隐式链接分配和显示链接分配
- 隐式链接分配

- 显示链接分配及缺点

- FAT缺点

-
索引分配(主流的文件系统使用此方法进行内存分配)
- 把文件的所有盘块集中存储(索引)
- 读取某个文件时,将文件索引读取进内存即可
- 每个文件拥有一个索引块,记录所有盘块信息
- 索引分配方式支持直接访问盘块
- 文件较大时,索引分配方式具有明显优势
存储空间管理
- 空闲表

- 空闲链表
- 空闲链表法把所有空闲盘区组成一个空闲链表
- 每个链表节点存储空闲盘块和空闲的数目
- 位示图
- 位示图维护成本低
- 位示图可以非常容易找到空闲盘块
- 位示图使用0/1比特位,占用空间小
- 0表示未使用,1表示已使用

目录管理
目录树

- 使得文件或目录都只有唯一路径
Linux文件基本操作
Linux目录


Linux文件常用操作
- touch xx: 创建文件
- vim xx:创建、编辑文件
- cat xx:查看文件内容
- rm xx:删除文件
- mkdir xx:创建文件夹
- rm -r xx:递归删除文件夹
Linux文件类型

Linux的文件系统
文件系统概览
FAT

NTFS

EXT2/3/4(不能被Windows识别)

EXT文件系统

Block Group

-
Inode Table
- 存放文件Inode的地方
- 每一个文件(目录)都有一个Inode
- 是每一个文件(目录)的索引节点
- Inode存放索引节点编号、文件类型、文件权限、文件物理地址、文件长度、文件连接计数、文件存取时间、文件状态、访问计数、链接指针等
- 文件名不是存放在Inode节点上的,而是存放在目录的Inode节点,这样列出目录文件的时候无需加载文件的Inode
- 文件的唯一标记是Inode,而不是文件名
-
Inode bitmap
- Inode的位示图
- 记录已分配的Inode和未分配的Inode

-
Data block
- 是存放文件内容的地方
- 每个block都有唯一的编号
- 文件的block记录在文件的Inode上
-
Block bitmap
- 功能与Inode bitmap类似
- 记录Data block的使用情况
-
Superblock
- 记录整个文件系统相关信息的地方
- Block和Inode的使用情况
- 时间信息、控制信息等
操作系统的设备管理
广义的I/O设备
- 对CPU而言,凡是对CPU进行数据输入的都是输入设备
- 对CPU而言,凡是CPU进行数据输出的都是输出设备
- 按照使用特性分类

- 按照信息交换的单位分类

- 按照设备的共享属性分类

- 按照传输速率分类

I/O设备的缓冲区
- 为了解决CPU与I/O设备的速率不匹配
- 减少CPU处理I/O请求的频率
- 提高CPU与I/O设备之间的并行性
专用缓冲区

- 专用缓冲区只适用于特定的I/O进程
- 当这样的I/O进程比较多时,对内存的消耗也很大
缓冲池
- 操作系统划出可供多个进程使用的公共缓冲区,称之为缓冲池

SPOOLing技术
- 是关于慢速字符设备如何与计算机主机交换信息的一种技术
- 是一种虚拟设备技术
- 利用高速共享设备将低速的独享设备模拟为高速的共享设备
- 逻辑上,系统为每一个用户都分配了一台独立的高速独享设备
SPOOLing技术图解

- 在输入、输出之间增加了排队转储环节(输入井、输出井)
- SPOOLing负责输入(出)井与低速设备之间的调度
- 逻辑上,进程直接与高速设备交互,减少了进程的等待时间
进程管理
为什么需要进程?

- 进程是系统进行资源分配和调度的基本单位
- 进程作为程序独立运行的载体保障程序正常执行
- 进程的存在使得操作系统资源利用率大大提升
进程的实体
主存中的进程形态

进程控制块(PCB)
- 用于描述和控制进程运行的通用数据结构
- 记录进程当前状态和控制进程运行的全部信息
- PCB使得进程是能够独立运行的基本单位
- PCB是操作系统进行调度经常会被读取的信息
- PCB是常驻内存的,存放在系统专门开辟的PCB区域内
标识符
- 唯一标记一个进程,用于区别其他进程
状态
- 标记进程的进程状态,如:运行态
程序计数器
- 指向进程即将被执行的下一条指令的地址
内存指针
- 程序代码、进程数据相关指针
上下文数据
- 进程执行时处理器存储的数据
I/O状态信息
- 被进程I/O操作所用的文件列表
记账信息
- 进程使用处理器时间、时钟数总和等
进程与线程

- 线程是操作系统进行运行调度的最小单位
- 线程包含在进程之中,是进程实际运行的工作单位
- 一个进程可以并发多个线程,每个线程执行不同的任务
- 进程的线程共享进程资源
进程的五状态模型

创建状态
- 创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态
就绪状态
- 当进程被分配到除CPU以外所有必要资源后
- 只要再获得CPU的使用权,就可以立即运行
- 其他资源都准备好、只差CPU资源的状态为就绪状态
- 在一个系统中多个处于就绪状态的进程通常排成一个队列,成为就绪队列
执行状态
- 进程获得CPU,其程序正在执行称为执行状态
- 在单处理机中,在某个时刻只能有一个进程处于执行状态
阻塞状态
- 进程因某种原因如:其他设备未就绪而无法继续执行
- 从而放弃CPU的状态称为阻塞状态
- 同样有阻塞队列
终止状态
- 进程结束由系统清理或归还PCB的状态称为终止状态
进程同步
为什么需要进程间同步
- 对竞争资源在多进程进行使用次序的协调
- 使得并发执行的多个进程之间可以有效使用资源和相互合作
进程间同步的原则
- 临界资源:指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源。
- 空闲让进原则:资源无占用,允许使用
- 忙则等待原则:资源有占用,请求进程等待
- 有限等待原则:保证有限等待时间能够使用资源
- 让权等待原则:等待时,进程需要让出CPU
进程间同步的方法
- 消息队列
- 共享存储
- 信号量
线程同步
- 进程内多线程也需要同步
- 线程同步方法
- 互斥量
- 读写锁
- 自旋锁
- 条件变量
Linux的进程管理
Linux进程的相关概念
进程的类型
- 前台进程
- 前台进程就是具有终端,可以和用户交互的进程
- 后台进程
- 与前台进程相对,没有占用终端的就是后台进程
- 后台程序基本上不和用户交互,优先级比前台进程低
- 将需要执行的命令以&符号结束就可以启动一个后台进程
- 守护进程
- 是特殊的后台进程
- 很多守护进程在系统引导的时候启动,一直运行直到系统关闭
- Linux有很多守护进程:如crond,httpd,sshd,mysqld,进程名字以d结尾的一般都是守护进程
进程的标记
- 进程ID
- 进程的唯一标记,每个进程拥有不同的ID
- 进程ID表现为一个非负整数,最大值由操作系统限定
- ID为0的进程为idle进程,是系统创建的第一个进程
- ID为1的进程为init进程,是0号进程的子进程,完成系统初始化
- Init进程是所有用户进程的祖先进程
- 进程的状态标记

操作Linux进程的相关命令
ps命令
- 常用于显示当前进程的状态
- 通常配合aux参数或ef参数和grep命令检索特定进程
top命令
- 查看所有进程的状态
kill命令
- kill命令发送指定信号给进程
- kill -l 可以查看操作系统支持的信号
- 只有(SIGKILL 9 即kill -9 xxx)信号可以无条件终止进程,其他信号进程有权忽略
作业管理
进程调度概述
- 进程调度是指计算机通过决策决定哪个就绪进程可以获取CPU使用权
进程调度两个步骤
- 保留就进程的运行信息,请出旧进程(收拾包袱,离开CPU)
- 选择新进程,准备运行环境并分配CPU(新进驻)
进程调度的机制
- 就绪队列的排队机制:将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程
- 选择运行进程的委派机制:调度程序以一定的策略选择就绪进程,将CPU资源分配给他
- 新老进程的上下文切换机制:保存当前进程的上下文信息,装入被委派执行进程的运行上下文

进程调用方法分类
- 非抢占式的调度:处理器一旦分配给某个进程,就让该进程一直使用下去,调度程序不以任何原因抢占正在被使用的处理器,直到进程完成工作或因为I/O阻塞才会让出处理器
- 抢占式的调度:允许调度程序以一定的策略暂停当前运行的进程,保存好旧进程的上下文信息,分配处理器给新进程

进程调度算法
先来先服务算法
短进程优先调度算法
- 调度优先选择就绪队列中估计运行时间最短的进程
- 短进程优先调度算法不利于长作业进程的执行
高优先权优先调度算法
- 进程附带优先权,调度程序优先选择权重高的进程
- 高优先权优先调度算法使得紧迫的任务可以优先处理
时间片轮转调度算法
- 按照先来先服务的原则排列就绪进程
- 每次从队列头部取出待执行进程,分配一个时间片执行
- 是相对公平的调度算法,但不能保证及时响应用户
作业管理之死锁
- 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
死锁的产生原因
竞争资源
- 共享资源数量不满足各个进程需求
- 各个进程之间发生资源竞争导致死锁

进程的调度顺序不当
死锁的四个必要条件
互斥条件
- 进程对资源的使用是排他性的使用
- 某资源只能由一个进程使用,其他进程需要使用只能等待
请求保持条件
- 进程至少保持一个资源,又提出新的资源请求
- 新资源被占用,请求被阻塞
- 被阻塞的进程不释放自己保持的资源
不可剥夺条件
- 进程获得的资源在在未完成使用前不能被剥夺
- 获得的资源只能由进程自身释放
环路等待条件
- 发生死锁时,必然存在进程-资源环形链
预防死锁的方法
摒弃请求保持条件
- 系统规定进程运行之前,一次性申请所有需要的资源
- 进程在运行期间不会提出资源请求,从而摒弃请求保持条件
摒弃不可剥夺条件
- 当一个进程请求新的资源得不到满足时,必须释放占有的资源
- 进程运行时占有的资源可以被释放,意味着可以被剥夺
摒弃环路等待条件
- 可用资源线性排序,申请必须按照需要递增申请
- 线性申请不再形成环路,从而摒弃了环路等待条件
存储管理
存储管理主要为确保三个问题
- 确保计算机有足够的内存处理数据
- 确保程序可以从可用内存中获取一部分内存使用
- 确保程序可以归还使用后的内存以供其他程序使用
内存分配与回收
- 早期计算机编程并不需要过多的存储管理
- 随着计算机和程序越来越复杂,存储管理成为必要
内存分配的过程
单一连续分配

- 单一连续分配是最简单的内存分配方式
- 只能在单用户、单进程的操作系统中使用
- 系统区的内存全部由操作系统使用
- 用户区的内存全部由用户使用
固定分区分配

- 固定分区分配是支持多道程序的最简单存储分配方式
- 内存空间划分为若干固定大小的区域
- 每个分区只提供给一个程序使用,互不干扰
动态分区分配
- 操作系统比较常用的内存分配方法
- 根据进程实际需要,动态分配内存空间
- 涉及相关数据结构、分配算法
- 动态分区空闲表数据结构

- 动态分区空闲链数据结构

- 动态分区分配算法:首次适应算法(FF算法)

- 动态分区分配算法:最佳适应算法(BF算法)

- 动态分区分配算法:快速适应算法(QF算法)

- 动态分区空闲表数据结构
内存回收的过程
内存回收的四种情况

第一种情况回收方式
- 不需要新建空闲链表节点
- 只需要把空闲区1的容量增大为新的空闲区(即空闲区1+回收区)即可
第二种情况回收方式
- 将回收区与空闲区合并
- 新的空闲区使用回收区的地址
第三种情况回收方式
- 将空闲区1、空闲区2和回收区合并
- 新的空闲区使用空闲区1的地址
第四种情况回收方式
- 为回收区创建新的空闲节点
- 插入到相应的空闲区链表中去
段页式存储管理
- 不管是何种管理方式,都是管理进程的内存空间,把进程的内存空间映射到物理的内存空间
页式存储管理


- 将进程逻辑空间等分成若干大小的页面
- 相应的把物理内存空间分成与页面大小相同的物理块
- 以页面为单位把进程空间装进物理内存中分散的物理块
- 内存碎片的理解

- 页表的问题

- 因以上页表的问题衍生出多级页表

- 根页表的字块指向一块内存空间,此空间内存放着二级页表
- 二级页表的字块为进程实际使用的内存,运行时只需要将根页表加载到内存空间
- 调用某一个字块发现二级页表没有在内存,再把二级页表加载进内存
页式管理的问题
- 如果有一段连续的逻辑分布在多个页面中,将大大降低执行效率
段氏存储管理

- 将进程逻辑空间划分成若干段(非等分)
- 段的长度由进程的连续逻辑的长度决定
- 主函数MAIN、子程序段X、子函数Y等
页式和段氏的异同点
相同点
- 段氏存储和页式存储都离散地管理了进程的逻辑空间
不同点
- 页是物理单位,段是逻辑单位
- 分页是为了合理利用空间,分段是满足用户要求
- 页大小由硬件固定,段长度可动态变化
- 页表信息是一维的,段表信息是二维的
段页式存储管理

- 先将逻辑空间按段氏管理分成若干段
- 再把段氏空间按页式管理等分成若干页
虚拟内存
- 有些进程实际需要的内存很大,超过物理内存的容量
- 多道程序设计,使得每个进程可用物理内存更加稀缺
- 不可能无限增加物理内存,物理内存总有不够的时候
虚拟内存概述
- 虚拟内存是操作系统内存管理的关键技术
- 使得多道程序运行和大程序运行称为现实
- 把程序使用的内存划分,将部分暂时不使用的内存放置在辅存
程序的局部性原理
- 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
- 程序运行时,无需全部装入内存,装载部分即可
- 如果访问页不在内存,则发出缺页中断,发起页面置换
- 从用户层面看,程序拥有很大的空间,既是虚拟内存
虚拟内存的置换算法
- 先进先出算法(FIFO)
- 最不经常使用算法(LFU)
- 最近最少使用算法(LRU)
Linux的存储管理
Buddy内存管理算法(也叫伙伴算法)

- 是经典的内存管理算法
- 算法基于计算机处理二进制的优势具有极高的效率
- 算法主要是为了解决内存外碎片的问题
- 努力让内存分配与相邻内存合并能快速进行
内存分配原则
- 向上取整为2的幂大小,如:70k => 128k, 129k => 256k
伙伴系统

- 伙伴指的是内存的伙伴
- 一片连续内存的伙伴是相邻的另一片大小一样的连续内存
- 如图空闲区1和空闲区2是伙伴
Linux交换空间
- 交换空间(Swap)是磁盘的一个分区
- Linux物理内存满时,会把一些内存交换至Swap空间
- Swap空间是初始化系统时配置的
交换空间的作用
- 冷启动内存依赖
- 系统睡眠依赖
- 大进程空间依赖
交换空间和虚拟内存的异同点
