编程大法—炼体筑基—操作系统—基础卷

我们一路上将遇到各种各样的硬件装备,必须习得一法门,可以统一的管理它,使得设备充分散发灵力。——《上古遗录》

前几日于慕课向咚咚呛老师学习,现记录于此。

1 操作系统概览

1.1 是什么和为什么

操作系统是管理计算机和软件资源的计算机程序。管理配置内存、决定资源共享供需顺序、控制输入输出设备等。操作系统提供让用户和系统交互的界面。操作系统的种类多种多样:Android、IOS、Windows、Linux、MacOs、华为鸿蒙等。

为什么使用操作系统?
我们不可能直接操作计算机硬件、当前设备种类繁多,需要统一界面,操作系统的简易性使得更多的人能够使用计算机。

1.2 操作系统的基本功能

操作系统统一管理着计算机资源:处理器资源、IO设备资源、存储资源、文件资源。
操作系统实现了对计算机资源的抽象:用户无需面向硬件编程。
操作系统提供了用户与计算机之间的接口:图像窗口形式、命令形式、系统调用形式

1.3 操作系统相关的概念

并发性、共享性、虚拟性、异步性。

1.3.1 并发性

并行:两个或多个事件在同一时刻发生
并发:两个或多个事件在同一时间间隔发生
多道程序设计:对于单处理器,多道程序交替运行,属于并发的概念。对于双处理器,就存在多道程序再同一个时刻运行,属于并行的概念,当然在其中一个处理器上也有存在并发。

1.3.2 共享性

共享性表现为操作系统中的资源可以供多个并发的程序共同使用,这种共同使用的形式称之为资源共享。资源共享根据属性可以分为两种方式:互斥共享形式(当资源被一个进程占用时,其他想使用的话只能等待该进程使用完)、同时访问形式(某种资源在一段时间内并发地被多个程序访问,这种同时是宏观的)。

1.3.3 虚拟性

虚拟性表现为把一个物理实体转变为若干个逻辑实体。物理实体是真是存在的,逻辑实体是虚拟的。虚拟的技术主要有时分复用技术和空分复用技术。
时分复用技术
资源在时间上进行复用,不同程序并发使用,多道程序分时使用计算机的硬件资源,提供资源利用率。

  • 虚拟处理器技术
    借助多道程序设计技术为每个程序建立进程,多个程序分时复用处理器。
  • 虚拟设备技术
    物理设备虚拟为多个逻辑设备,每个程序占用一个逻辑设备,多个程序通过逻辑设备并发访问。

空分复用技术
实现虚拟磁盘、虚拟内存等,提供资源的利用率,提升编程效率。

  • 虚拟磁盘技术
    物理磁盘虚拟为逻辑磁盘,如C、D、E盘,使用起来更加安全方便。
  • 虚拟内存技术
    在逻辑上扩大程序的存储容量,使用比实际内存更大的容量,大大提升编程效率。
1.3.4 异步性

在多道程序环境下,允许多个进程并发执行。进程在使用资源时可能需要等待或放弃。进程的执行并不是一气呵成的,而是以走走停停的形式推进的。进程以不可预知的速度向前推进。

2 进程管理之进程实体

2.1 为什么需要进程

进程是系统进行资源分配和调度的基本单位
进程作为程序的独立运行的载体保障程序正常执行
进程的存在使得操作系统的资源利用率大幅度提升
(多道程序设计概念,实现其的方式)

2.2 进程的实体

2.2.1 主存中的进程形态

在主存中,进程是一段连续的存储空间,称之为进程控制块(PCB)。进程控制块中包含一些重要信息,大致为四类:进程标识符、处理机状态、进程调度信息、进程控制信息。
标识符:进程的唯一标记ID
状态:标记进程的进程状态
程序计数器:进程即将执行下一条指令的地址
内存指针:程序代码、进程数据相关指针
上下文数据:进程执行时处理器存储的数据
IO状态信息:被进程IO操作所占用的文件列表
记账信息:使用处理器时间、时钟总和等
进程控制块PCB
用于描述和控制进程运行的通用数据结构,记录进程当前状态和控制进程安全运行的全部信息,PCB使得进程是独立运行的基本单位。PCB是操作系统进行调度经常会被读取信息,所以它是常驻内存的,存放在系统专门开辟的PCB区域内。

2.2.2 进程与线程

一个进程(Process)可以有多个线程(Thread)。线程是操作系统进行运行调度的最小单位。线程包含在进程之中,是进程中实际运行工作的单位。一个进程可以并发多个线程,每个线程执行不同的任务。进程的线程共享进程的资源。

进程线程
资源资源独立分配的基本单位不拥有资源
调度独立调度的基本单位独立调度的最小单位
系统开销开销大开销小
通信进程IPC读写同一进程数据通信

3 进程管理之五状态模型

五状态概念

  • 就绪状态
    当进程被分配到除CPU以为所有必要的资源后,只要再获得CPU的使用权,就可以立即运行,其他资源都准备好,只差CPU资源的状态为就绪状态。
    在一个系统中多个处于就绪状态的进程通常排成一列,称之为就绪队列。
  • 执行状态
    进程获得CPU、其程序在执行称之为执行状态。
    在单处理机中,某个时刻只能有一个进程处于执行状态。
  • 阻塞状态
    进程因为某种原因,如其他设备未就绪而无法继续执行等,从而放弃CPU的状态称之为阻塞状态。
    在一个系统中多个处于阻塞状态的进程通常排成一列,称之为阻塞队列。
  • 创建状态
    分配PCB、插入就绪队列
    创建进程时拥有PCB但其他资源尚未就绪的状态称之为创建状态。操作系统提供frok函数接口创建进程。
  • 终止状态
    系统清理、PCB归还
    进程结束由系统清理或者归还PCB的状态称之为终止状态。

五状态切换
创建(创建完成)就绪(进程调度)执行(IO请求)阻塞(IO完成)就绪
执行(时间片用完)就绪
执行(执行完成)终止

4 进程管理之进程同步

4.1 为什么要进程同步

生产者-消费者问题、哲学家进餐问题
对竞争资源在多进程间进行使用次序的协调,使得并发执行的多个进程之间可以有效使用资源和相合合作。

4.2 进程间同步的原则

临界资源:是一些虽然作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才能重新竞争使用共享资源。
四个原则

  • 空闲让进:资源无占用,允许使用
  • 忙则等待:资源占用,请求进程等待
  • 有限等待:保证有限等待时间能够使用资源
  • 让权等待:等待时,进程需要让出CPU

进程同步方法

  • 消息队列
  • 共享存储
  • 信号量

4.3 线程同步的原则

进程内多线程也需要同步。线程同步方法如下。

  • 互斥量
  • 读写锁
  • 自旋锁
  • 条件变量

5 Linux进程管理

5.1 相关概念

5.1.1 进程的类型

前台进程:具有终端,可以和用户进行交互的进程,比如终端shell。
后台进程:与前台进程相对,没有占有终端的就是后台进程。基本上不和用户交互,优先级比前台进程低。将需要执行的命令以&符号结束。ctrl+c也不停止它。
守护进程:特殊后台进程。进程名字以“d”结尾的一般都是守护进程

5.1.2 进程的标记

进程ID
进程ID,唯一标识符。一个非负整数,最大值由系统限定。top命令可以查看linux的所有进程信息。
进程A可创建进程B,那么A是B的父进程,B是A的子进程。通过pstree命令查看。
ID为0的进程为idle进程,是系统创建的第一个进程。ID为1的进程为init进程,是0号进程的子进程,完成系统初始化。init进程是所有用户进程的祖先进程。
进程的状态标记
同过命令 man ps 查看状态标记的解释。

状态符号状态说明
R进程处于运行状态
S进程处于睡眠状态

通过命令 ps -aus 查看进程的状态

5.2 操作Linux进程的相关命令

ps命令
ps -u 查询用户的进程
ps -df --forest 查看进程树
ps -aux --sort=-pcpu 按照使用CPU比例排序
ps -aux --sort=-pmem 按照使用内存的大小排序
top命令
kill命令(发送指定信号给进程)
kill -9 无条件停止进程

6 作业管理之进程调度

6.1 什么是进程调度

进程调度是指计算机通过决策决定哪个就绪进程可以获得CPU使用权。这和多道程序设计也是密切相关的。
步骤:保留旧进程的运行信息,请出旧进程(收拾包袱);选择新进程,准备运行环境并分配CPU(新进驻)。
三个机制

  • 就绪进程的排队机制
    将就绪进程按照一定的方式排成队列,以便调度程序可以最快找到就绪进程。
  • 选择运行进程的委派机制
    调度程序以一定的策略选择就绪进程,将CPU资源分配给它。
  • 新老进程的上下文切换
    保存当前进程的上下文信息,装入被委派执行进程的运行上下文。

当一个进程还没有执行完,此时需要开始新的进程,会有以下两种调度方式。

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

6.2 进程调度方法

  • 先来先服务算法
  • 短进程优先调度算法
  • 高优先权优先调度算法
  • 时间片轮转调度算法

7 作业管理之死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都无法推进下去。此时称系统处于死锁状态或者系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

7.1 死锁的产生

竞争资源,进程调度顺序不当是引起死锁的原因。死锁的四个必要条件如下。

  • 互斥条件
    进程对资源的使用时排他性的使用,某资源只能由一个进程使用,其他进程需要使用只能等待。
  • 请求保持条件
    进程运行过程中至少保持一个资源,又提出新的资源请求,新的资源被占用,请求被阻塞,被阻塞的进程不释放自己保持的资源。
  • 不可剥夺条件
    进程获得的资源在未完成使用前不能被剥夺,获得的资源只能由进程本身释放。
  • 环路等待条件
    发生死锁时候,必然存在进程-资源环形等待链。

7.2 死锁的处理

破坏死锁的必要条件。

7.2.1 预防死锁的方法

  • 摒弃请求保持条件
    系统规定进程运行前一次性申请所有需要资源。
  • 摒弃不可剥夺条件
    当一个进程请求新的资源得不到满足时,必须释放自己占有的资源。
  • 摒弃环路等待条件
    可以用资源线性排序,申请必须按照需要递增申请。

7.2.2 银行家算法

银行家算法是著名的避免死锁方法。客户申请的贷款是有限的,每次申请需要声明最大资金量;银行家在满足贷款要求时,都应该给用户贷款;客户在使用完贷款后及时归还贷款。

需要这三个数据结构,已分配资源表,所需资源表,可分配资源表。还需资源分配表等于所需资源表减去已分配资源表。可分配资源表与还需分配资源表进行对比,可以查看是否满足需求。

8 存储管理之内存分配与回收

目的是:确保计算机有足够的内存处理数据,确保程序可以从内存中获取一部分内存使用,确保程序可以归还使用后的内存。

8.1 内存分配的过程

  1. 单一连续分配
    最简单的内存分配方法,只能在单用户、单进程的操作系统中使用。
  2. 固定分区分配
    是支持多道程序的最简单存储分配方式,内存空间被划分为若干大小的区域,每个分区只提供给一个程序使用,互不干扰。
  3. 动态分区分配
    根据进程实际需要,动态分配内存空间,涉及到相关数据结构、分配算法。

动态分区分配
数据结构:动态分区空闲表数据结构,动态分区空闲链数据结构。
算法:首次适应算法(FF),最佳适应算法(BF),快速适应算法(QF)。

  • 首次适应算法
    分配内存时候,开始顺序查找合适内存区,若没有合适的空闲区,则该次分配失败。每次都是从头部开始,使得头部地址空间不断被划分。循环适应算法则是从上一次检索到的位置开始,继续查找。
  • 最佳适应算法
    要求空闲区链表按照容量大小排序,遍历空闲区链表找的最佳合适空闲区。
  • 快速适应算法
    多个空闲链表,每个空闲链表存储一种容量的空闲区。

8.2 内存回收的过程

  • 回收区在空闲区后面相邻
    不需要创建新的空闲链表节点,只需要把空闲区的容量增大即可。
  • 回收区在空闲区前面相邻
    将回收区与空闲区合并,新的空闲区使用回收区的地址
  • 回收区在两个空闲区之间相邻
    将两个空闲区和回收区合并,新的空闲区使用第一个空闲区的地址。
  • 单独的回收区
    创建新的空闲节点,插入到空闲链表。

9 存储管理之段页式存储

上面一节主要是在物理角度阐述,本节是阐述操作系统是如何管理进程空间的。字块是相对物理设备的定义,页面是相对逻辑空间的定义。

9.1 页式存储管理

将进程的逻辑空间等分成若干大小的页面,相应的把物理内存空间分成与页面大小相等的物理块,以页面为单位把进程空间装进物理内存中分散的物理块。一般页面的大小是512B~8KB。

页表示记录进程逻辑空间与物理空间的映射。一个页面对应一个字块。

地址由页号和页内偏移组成。

多级页表,解决单个页表过大问题。

9.2 段式存储管理

如果有一段连续的逻辑分布在多个页面中,将大大降低执行效率。所以提出段式存储管理。

将进程的逻辑空间划分成若干段(非等分),段的长度由连续逻辑的长度决定,主函数main、子程序段x、子函数y等。

段表:段号、基址、短长。地址由短号和段内偏移组成。

9.3 段页式存储管理

先将逻辑空间按照段式管理分成若干段,再把段空间按页分式管理分成若干页。
段页地址由段号、段内页号、页内地址组成。

10 存储管理之虚拟内存

一个游戏有十几个G,物理内存只有4G,那这个游戏是怎么运行起来的呢?

10.1 虚拟内存概述

有些进程实际需要的内存很大,超过物理内存容量;多道程序设计,使得每个进程可用的物理内存更加稀缺;不可能无限增加计算机物理内存。虚拟内存是操作系统内存管理的关键技术,使得多道程序运行和大程序运行成为现实。把程序使用内存划分,将部分暂时不使用的内存放置在辅存。

10.2 程序的局部性原理

CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
程序运行时候,无需全部装入内存,装载部分即可;如果访问页不在内存,则发出缺页中段,发起页面置换;从用户角度看,程序拥有很大的空间,即是虚拟内存。
虚拟内存实际上是对物理内存的补充,速度接近于内存,成本接近于辅存。

10.3 虚拟内存的置换算法

先进出算法FIFO、最不经常使用算法LFU,最近最少使用算法LRU。
请看 计算机组成原理——2.3 计算机存储器概览

11 Linux的存储管理

11.1 Buddy内存管理算法

Buddy算法是经典的内存管理算法,基于计算机处理二进制的优势具有极高的效率,主要是为了解决内存外碎片问题。
页内碎片:已经分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片。
页外碎片:没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块。

Buddy算法努力让内存分配与相邻内存合并快速进行。
分配大小原则:向上取整为2的幂大小
伙伴系统:一片连续内存的伙伴是相邻的另一片大小一样的连续内存
创建一系列空闲块链表,每一种都是2的幂大小。

假设存储空间1M,则创建1KB、2KB、4KB … 1MB的空闲链表,只有1M的这个有一个节点。
分配100K内存,需要128KB,发现没有,继续256KB,发现没有,继续512KB,发现没有,继续1MB,发现有,则分配给它。发现剩余很多,拿出512KB,添加到512KB的空闲链表,再拿出256KB,添加到256KB的空闲链表,再拿出128KB,添加到128KB的空闲链表。
回收内存的过程,判断刚才分配的内存伙伴在空闲链表上吗?在,移除伙伴,合并256KB空闲内存,判断;在,移除伙伴,合并512KB空闲内存,判断;在,移除伙伴,合并1M空闲内存,判断;插入1M空闲链表,回收完成。

11.2 Linux交换空间

交换空间(Swap)是磁盘的一个分区。Linux物理内存满时,会把一些内存交换置Swap空间。Swap空间初始化系统时配置。
top命令可以查看Swap空间。
冷启动内存依赖,系统睡眠依赖,大进程空间的依赖。

Swap空间虚拟内存
存在于磁盘存在于磁盘
与主存发生置换与主存发生置换
操作系统概念进程概念
解决系统物理内存不足解决进程物理内存不足

12 操作系统的文件管理

12.1 文件的逻辑结构

  • 逻辑结构的文件类型
    有结构文件(文本、文档、媒体):文件内容由定长记录和可变长记录组成;定长记录存储文件格式、文件描述等结构化数据项;可变长记录存储文件具体内容。
    无结构文件(二进制文件、链接库):流式文件;文件内容以字节为单位。
  • 顺序文件
    按照顺序存放在介质中的文件。
  • 索引文件
    可变长文件不适合顺序文件格式存储;索引文件是为了解决可变长文件而发明的一种文件格式;索引文件需要配合索引表完成存储操作。

12.2 辅存的存储空间分配

12.2.1 辅存的分配方式

  • 连续分配
    顺序读取文件非常容易且快,对存储要求高,要求满足容量的连续存储空间。
  • 链接分配
    将文件存储在离散的盘块中,需要额外的存储空间存储文件的盘块链接顺序。
    隐式分配的下一个链接指向存储在当前盘块内,非常适合顺序访问,随机访问效率很低,可靠性很差,任何一个链接出问题都会影响整个文件。
    显式链接有一个表,存储物理块和下一个盘块。此表为FAT表(File Allocation Table),FAT文件系统。不支持高效的直接存储(FAT记录项多),检索FAT表占用较大的存储空间(需要将真个FAT加载到内存)。
  • 索引分配
    把文件的所有盘块集中存储(索引),读取某个文件时,将文件索引读取到内存即可。每个文件都有一个索引块,记录所有盘块信息。支持直接访问盘块。文件较大时,具有明显优势。

12.2.2 存储空间的管理

  • 空闲表
    第一个空闲盘块号,空闲盘块数。空闲盘区的分配与内存分配类似,也是使用首次适应算法、循环适应算法等。
  • 空闲链表
    空闲链表法把所有空闲盘区组成一个空闲链表,每个节点存储空闲盘块和空闲数目。
  • 位示图
    维护成本低,非常容易找到空闲盘块,使用01比特位,占用空间小。

12.3 目录管理

目录树,任何文件或者目录都有唯一的路径。

13 Linux文件的基本操作

13.1 Linux目录

Linux常见目录表
在这里插入图片描述
相对路径:从所在目录到目标 cd …/home
绝对路径:从根目录开始到目标 cd /home

13.2 Linux文件常用操作

touch 创建文件
cat 查看文件
rm 删除文件
rm -r 删除目录

13.3 Linux文件类型

套接字 s
普通文件 -
目录文件 d
符号连接 l
设备文件 c(字符设备) b(块设备)
FIFO文件 p

14 Linux的文件系统

14.1 文件系统概览

  • FAT
    FAT16、FAT32等,微软Dos/Windows使用的文件系统。
  • NTFS(New Technology File System)
    对FAT进行改进,window采用
  • EXT2/3/4(Extended File System)
    Linux的文件系统,Linux也可以识别NTFS、FAT。

14.2 Ext文件系统

Boot Sector:启动扇区,安装开机管理程序
Block Group:块组,存储数据的实际位置
在这里插入图片描述

  • Inde
    索引的节点编号、文件类型、文件权限、文件物理地址、文件长度、文件连接技术、文件存取时间、文件状态、访问计数、链接指针 …
    文件名不是存放在Inode节点上,而是存放在目录的Inde节点。
  • Inde Table
    存放Inode的地方,每一个文件(目录)都有一个Inode,是每一个文件(目录)的索引点。
  • Inde bitmap
    Indoe的位示图,记录已分配的Indoe和未分配的Inode
  • Date Block
    存放文件内容的地方,每一个block都有唯一的编号,文件的block记录在文件的Inode上
  • Bolck bitmap
    功能与Inode bitmap类似,记录Date Block的使用情况
  • Superblock
    记录整个文件系统相关信息的地方,Block和Inode的使用情况,时间信息(文件系统挂载时间,最后一次写入时间,最后一次读取时间,最后一次校验时间),控制信息等。一般1024个字节大小。

Linux命令:
df -T 可以查看操作系统挂载的磁盘信息
dumpe2fs 查看Inode信息
stat 查看文件的具体信息

15 操作系统的设备管理

15.1 广义的IO设备

对CPU而言,凡是对CPU进行数据输入输出的都是输入输出设备。

按使用特性分类:存储设备,交互IO设备

按设备的共享属性分类:独占设备、共享设备、虚拟设备

按信息交换的单位分类:块设备,字符设备

按传输速率分类:低速设备、中速设备、高速设备

15.2 IO设备的缓冲区

CPU与IO设备不匹配问题。减少CPU处理IO请求的频率,提高CPU与IO设备之间的并行性。专用缓冲区只适用于特定的IO进程,这样的IO进程比较多时,对内存的消耗很大,操作系统划出可供多个进程使用的公共缓冲区,称之为缓冲池。

15.3 SPOOLing技术

是关于慢速字符设备如何与计算机主机交换信息的一种虚拟设备技术。利用高速共享设备将低速的独享设备模拟为高速共享设备。逻辑上,系统为用户都分配了一台独立的高速独享设备。它把同步调用低速设备该为异步调用。
在输入与输出之间增加了排队转储环节(输入井、输出井),SPOOLing负责输入(出)井与低速设备之间的调度,在逻辑上,进程直接与高速设备交互,减少了进程的等待时间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值