操作系统有五大功能:
- 进程管理
- 作业管理
- 存储管理
- 文件管理
- 设备管理
操作系统是管理计算机硬件和软件资源的计算机程序,它管理配置内存,决定资源供需的优先次序,控制输入输出设备,操作系统还提供了一个让用户和系统交互的操作界面
操作系统实现了对计算机资源的抽象,它提供了一个资源管理的框架,让应用程序可以不用关心底层硬件的细节,只需要调用操作系统提供的接口就可以了
I/O设备管理软件,提供读写接口- 文件管理软件,提供操作文件接口
操作系统提供了用户与计算机之间的接口,比如:
- 图像窗口形式
- 命令行形式
- 系统调用形式
操作系统相关概念:
- 并发性
- 并行是指两个或多个事件在同一时刻发生
- 并发是指两个或多个事件在同一时间间隔内发生
- 共享性
- 操作系统中的资源可供多个并发的程序共同使用
- 这种共同使用的形式称之为资源共享
- 虚拟性
- 虚拟性表现为一个物理实体转变为若干个逻辑实体
- 物理实体是真实存在的,逻辑实体是虚拟的
- 虚拟的技术主要有时分复用技术和空分复用技术
- 时分复用技术
- 在时间上对物理实体进行复用,不同程序并发使用
- 多道程序分时使用计算机的硬件资源
- 提高资源的利用率
- 虚拟处理器技术:
- 借助多道程序设计技术
- 为每个程序建立进程
- 多个程序分时复用处理器
- 虚拟设备技术:
- 物理设备虚拟为多个逻辑设备
- 每个程序占用一个逻辑设备
- 多个程序通过逻辑设备并发访问
- 空分复用技术
- 在空间上对物理实体进行复用,用来实现虚拟磁盘,虚拟内存
- 提高资源的利用率,提升编程效率
- 虚拟磁盘技术
- 物理磁盘虚拟为逻辑磁盘
- 虚拟内存技术
- 在逻辑上扩大程序的存储容量
- 使用比实际内存更大的容量
- 大大提升变成效率
- 时分复用技术
- 异步性
- 在多道程序环境下,运行多个进程并发执行
- 进程在使用资源时可能需要等待或者放弃
- 进程的执行并不是一气呵成的,而是走走停停的形式推进
进程
为什么需要进程,因为进程是系统进行资源分配和调度的基本单位,同时进程作为程序独立运行的载体保障程序正常执行,进程的存在使得操作系统资源的利用率大幅提升
在主存中,进程是一块连续存储的空间,这个空间称之为进程控制块(PCB),这些空间包含了进程的基本信息,比如:
- 标识符
- 唯一标记一个进程,用于区别其他进程
- 优先级
- 状态
- 标记进程的状态,比如:运行态
- 程序计数器
- 进程即将要执行的下一条指令的地址
- 内存指针
- 程序代码、进程相关的指针
- 上下文数据
- 进程执行时处理器存储的数据
I/O状态信息- 被进程
I/O操作所占用的文件列表
- 被进程
- 记账信息
- 进程使用处理器的时间,时钟数总和
它的作用是:
- 用于描述和控制进程运行的通用数据结构
- 记录进程当前状态和控制进程运行的全部信息
PCB使得进程是能够独立运行的基本单位PCB是操作系统进行调度经常会被读取的信息PCB是常驻内存,存放在系统专门开辟的PCB区域内
进程和线程的区别:
线程是操作系统进行运行调度的最小单位(操作系统对进程的调度,实际上是对进程中的线程进行调度)
线程包含在进程中,是进程中实际运行工作的单位
一个进程可以并发多个线程,每个线程执行不同的任务
进程的线程共享进程的资源
| 进程 | 线程 | |
|---|---|---|
| 资源 | 资源分配的基本单位 | 不拥有资源 |
| 调度 | 独立调度的基本单位 | 独立调度的最小单位 |
| 系统开销 | 进程系统开销大 | 线程系统开销小 |
| 通信 | 进程 IPC | 读写同一进程数据进行通信 |
进程的状态
进程有五个状态:
- 创建:创建进程时拥有
PCB,但其他资源尚未就绪,进程就处于创建状态(操作系统提供fork函数创建进程)- 进程正在被创建,但还没有被操作系统分配资源
- 进程在创建过程中,操作系统会为进程分配资源
- 资源分配后,进入就绪队列
- 就绪:其他资源都准备好,只差
CPU的资源,进程就处于就绪状态- 当进程被分配到除
CPU以外的所有必要资源后,只要获得CPU的使用权后,就可以开始运行 - 在一个系统中多个出于就绪状态的进程,同组成一个就绪队列
- 当进程被分配到除
- 阻塞:因某种原因,进程放弃
CPU的使用权,进程就处于阻塞状态- 进程在等待某个事件发生时,如等待
I/O操作完成 - 进程在等待某个资源时,如等待某个信号量
- 进程在等待某个操作完成时,如等待子进程完成
- 进程在等待用户输入时,如等待用户输入密码
- 如果多个进程都在等待同一个事件,那么这些进程就组成一个阻塞队列
- 进程在等待某个事件发生时,如等待
- 执行:进程获得
CPU的使用权后,程序正在执行,进程就处于执行状态- 在单处理机中,在某个时刻只能有一个进程是处于执行状态
- 终止:进程执行完毕,或者进程被终止,进程就处于终止状态
- 进程执行完毕,进程正常终止
- 进程执行出错,进程异常终止
- 进程被其他进程终止,进程被强制终止
进程同步
进程间的同步解决的问题是:
- 对竞争资源在多进程间进行使用次序的协调
- 使得并发执行的多个进程之间可以有效使用资源和相互合作
临界资源:临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放资源才可重新竞争使用共享资源
进程同步的四个原则:
- 空闲让进:资源无占用,允许使用
- 当进程需要访问临界资源时,如果资源空闲,就可以直接访问
- 如果资源被占用,就需要等待
- 忙则等待:资源有占用,请求进程等待
- 有限等待:保证有限的时间能够访问资源
- 让权等待:当进程等待时间过长,就需要让出资源
进程同步的方法:
- 信号量
- 消息队列
- 共享存储
进程内的多线程也需要同步
线程同步的方法:
- 互斥量
- 读写锁
- 自旋锁
- 条件变量
linux 进程管理
linux 进程有三种:
- 前台进程:具有终端并占用终端,可以和用户交互的进程
- 后台进程:没有占用终端的进程,基本不和用户交互,优先级比前台进程低
- 将需要执行的命令以
&结尾,就可以将进程放到后台执行
- 将需要执行的命令以
- 守护进程:是特殊的后台进程
- 很多守护进程在系统引导的时候启动,一直运行到系统关闭
linux有很多典型的守护进程- 进程名字以
d结尾的一般都是守护进程
- 进程名字以
进程的标记:
- 进程
ID是进程的唯一标记,每个进程拥有不同的ID - 进程
ID表现为一个非负整数,最大值由操作系统限定
进程 A 创建进程 B,进程 A 称之为父进程,进程 B 称之为子进程
通过 pstree 命令可以查看进程树
特殊的进程:
ID为0的进程为idle进程,是系统创建的第一个进程ID为1的进程为init进程,是0号进程的子进程,完成系统初始化init进程是所有用户进程的祖先进程
| 状态符号 | 状态说明 |
|---|---|
R | (TASK_RUNNING) 进程正处于运行状态 |
S | (TASK_INTERRUPTIBLE) 进程正处于睡眠状态 |
D | (TASK_UNINTERRUPTIBLE) 进程正处于 I/O 等待的睡眠状态 |
Z | (TASK_DEAD or EXIT_ZOMBIE) 进程正处于退出状态,或僵尸进程 |
top 命令可以查看系统进程
PID是进程的IDUSER是进程的用户PR是进程的优先级VIRT是进程的虚拟内存%CPU是进程的CPU占用率%MEM是进程的内存占用率TIME+是进程的运行时间COMMAND是进程的命令
top - 23:08:34 up 3 days, 10:46, 0 user, load average: 1.95, 2.04, 2.08
Tasks: 18 total, 1 running, 17 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 9943.3 total, 4263.0 free, 3106.5 used, 2883.6 buff/cache
MiB Swap: 1024.0 total, 1024.0 free, 0.0 used. 6836.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
只有 SIGKILL 9 可以无条件终止进程,其他信号进程有权忽略
进程调度
进程调度室指通过决策决定那个就绪进程可以获得 CPU 的使用权
进程调度的两个步骤:
- 保留旧进程的运行信息,保存进程的
PC、寄存器等信息 - 选择新进程,准备运行环境并分配
CPU的使用权
进程调度的三种机制:
- 就绪队列的排队机制
- 选择运行进程的委派机制
- 新老进程的上下文切换机制
进程调度算法:
- 先来先服务调度算法
- 短作业优先调度算法
- 高优先权调度算法
- 时间片轮转调度算法
死锁
死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都将无法推进下去,此时称系统处于死锁状态或者系统产生了死锁,这些永远在互相等待的进程称为死锁进程
产生死锁主要有两种情况:
- 竞争资源
- 进程调度顺序不当
死锁产生的四个必要条件:
- 互斥条件
- 进程对资源的使用是排他性的
- 某资源只能一个进程使用,其他进程需要使用智能等待
- 进程对资源的使用是排他性的
- 请求保持条件
- 进程至少保持一个资源,但又请求其他资源
- 新资源被占用,请求被阻塞
- 被阻塞的进程不释放自己保持的资源
- 不可剥夺条件
- 进程获得的资源在为完成使用前不能被剥夺
- 获得的资源只能由进程自己释放
- 环路等待条件
- 发生死锁时,必然存在进程-资源环形链
预防死锁的方法:
- 摈弃请求保持条件
- 在系统规定进程运行前,一次性申请所有需要的资源
- 进程在运行期间不会踢出去资源申请,从而摒弃请求保持条件
- 摒弃不可剥夺条件
- 当一个进程请求新的资源得不到满足时,必须释放占有的资源
- 当进程运行时,占有的资源可以被释放,意味着可以被剥夺
- 摒弃环路等待条件
- 可用资源线性排序,申请必须按照需要递增申请
- 线性申请不在形成环路,从而摒弃了环路等待条件
内存分配
内存分配的方法:
- 单一连续分配
- 是最简单的内存分配方式(只能在单用户、单进程的操作系统中使用)
- 把内存分为系统区和用户区
- 系统区的所有内存给操作系统使用
- 用户区的所有内存给用户使用
- 固定分区分配
- 是支持多道程序的最简单存储分配方式
- 把内存空间划分成若干个固定大小的区域
- 每个分区只提供给一个程序使用,互不干扰
- 是支持多道程序的最简单存储分配方式
- 动态分区分配
- 根据进程需要,动态分配内存空间(涉及相关数据结构,分配算法)
- 数据结构:
- 动态分区空闲表数据结构
- 动态分区空闲链数据结构(节点需要记录可存储的容量)
- 算法
- 首次适应算法(
FF算法)- 分配内存时从开始顺序查找适合内存区
- 若没有找到合适的空闲区,则该次分配失败
- 缺点:
- 每次从头部开始,使得头部地址空间不断被划分
- 改进
- 循环适应算法,每次分配从上一次检索结束的位置开始
- 最佳适应算法(
BF算法)- 要求空闲区链表按照容量大小排序
- 变量空闲区链表找到最佳合适空闲区
- 快速适应算法(
QF算法)- 要求有多个空闲区链表
- 每个空闲区链表存储一种容量的空闲区
- 首次适应算法(
段页式存储管理
- 页式存储管理
- 字和字块是相对物理设备的定义
- 页面时相对逻辑空间的定义
- 将进程逻辑空间等分成若干大小的页面(等分)
- 相应的把物理内存空间分成与页面大小的物理块
- 以页面为单位把进程空间装进物理内存中分散的物理块
- 页地址:页号+页内偏移
- 问题:
- 页面大小应该适中,过大难以分配,过小内存碎片过多
- 页面大小通常是
512B ~ 8K - 有一段连续的逻辑分布在多个页面中,将大大降低执行效率
- 页表记录进程逻辑空间与物理空间的映射
- 段式存储管理
- 将进程逻辑空间划分为若干段(非等分)
- 段的长度由连续逻辑的长度决定
- 段表记录段与物理空间的映射
- 段地址:段号+段内偏移
- 段页式存储管理
- 先将逻辑空间按段式管理分成若干段
- 再把段空间按页式管理等分成若干页
- 段页地址:段号+段内页号+页内地址
段式存储和页式存储都离散地管理了进程的逻辑空间:
- 页是物理单位,段是逻辑单位
- 分页是为了合理利用空间,分段是满足用户要求
- 页大小由硬件固定,段长度可动态变化
- 页表信息是一维的,段表信息是二维的
虚拟内存
为什么会有虚拟内存?
- 有些进程实际需要的内存很大,超过物理内存的容量
- 多道程序设计,使得每个进程可用物理内存更加稀缺
- 不可能吴县增加物理内存,物理内存总有不够的时候
虚拟内存时操作系统内存管理的关键技术,使得多道程序运行和大程序运行成为现实
把程序使用内存划分,将部分暂时不使用的内存放置在辅存中
局部性原理是指 CPU 访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中
linux 存储管理
Buddy 算法是 linux 内存管理的一种算法,算法是基于计算机处理二进制的优势具有极高的效率而设计的算法,主要是为了解决内存外碎片的问题
页内碎片:内部碎片式已经被分配出去(能明确指出属于哪个进程)的内存空间大于请求所需的内存空间,不能被利用的内存空间就是内部碎片
页外碎片:外部碎片是指还没有分配出去(不属于任何进程),但是由于大小而无法分配给申请内存空间的新进程的内存空闲块
Buddy 算法努力让内存分配与相邻内存合并能快速进行
Buddy 算法内存分配原则:向上取整为 2 的幂大小(70K -> 128K)
linux 交换空间 Swap 是磁盘的一个分区,linux 物理内存时候,会把一些内存交换至 Swap 空间
交换空间的作用:
- 冷启动内存依赖
- 有些应用程序只是在启动时会使用大量内存,后续在运行时很少会用到这些内存,有了交换空间,系统就可以将这部分内存存储在交换空间中
- 系统睡眠依赖
- 当
linux系统需要睡眠时,就会把内存中的数据都保存到Swap中,当下次唤醒时,重新将这些数据加载到内存中
- 当
- 大进程空间依赖
Swap 空间和虚拟内存的区别:
Swap空间- 存储在磁盘
- 与主存发生置换
- 是操作系统概念
- 解决系统物理内存不足问题
- 虚拟内存:
- 存储在磁盘
- 与主存发生置换
- 是进程的概念
- 解决进程物理内存不足问题
文件管理
文件的逻辑结构
文件的逻辑结构类型分为:
- 有结构文件
- 文本文件
- 文档
- 媒体文件
- 无结构文件
- 二进制文件
- 链接库
有文件结构:
- 文件内容由定长记录和可变长记录组成
- 定长记录存储文件格式、文件描述等结构化数据项
- 可变长记录存储文件具体内容
无结构文件:
- 也称为流式文件
- 文件内容长度以字节为单位
顺序文件:
- 顺序文件是指按孙小存放在存储介质中的文件
- 磁带的存储特性使得磁带文件只能存储顺序文件
- 顺序文件是所有逻辑文件当中存储效率最高的
索引文件:
- 可变长文件不适合使用顺序文件格式存储
- 索引文件是为了解决可变长文件存储而发明的一种文件格式
- 索引文件需要配合索引表完成存储的操作
辅存的存款空间分配
辅存的分配方式:
- 连续分配
- 顺序读取文件内容非常容易,速度很快
- 对存储要求高,要求满足容量的连续存储空间
- 链接分配
- 可以将文件存储在离散的盘块中
- 需要额外的存储空间、存储文件的盘块链接顺序
- 隐式链接
- 隐式分配的下一个链接指向存储在当前盘块内
- 隐式分配适合顺序访问,随机访问效率很低
- 可靠性差,任何一个链接出问题都影响整个文件
- 显示链接(
FAT系统)- 不支持高效的直接存储(
FAT记录项多) - 检索时
FAT表占用较大的存储空间(需要将整个FAT加载到内存)
- 不支持高效的直接存储(
- 隐式链接
- 索引分配
- 把文件的所有盘块集中存储(索引)
- 读取某个文件时,将文件索引读取进内存即可
- 每个文件拥有一个索引块,记录所有盘块信息
- 索引分配方式支持直接访问盘块
- 文件较大时,索引分配方式具有明显优势
存储空间管理:
- 空闲表
- 空闲盘块的分配与内存分配类似
- 首次适应算法、循环适应算法
- 回收过程也与内存回收类似
- 空闲链表
- 空闲链表把所有空闲盘区组成一个空间链表
- 每个链表节点存储空闲盘块和空闲的数目
- 位示图
- 维护成本低
- 可以非常容易找到空闲盘块
- 使用
0/1比特位,占用空间小
目录管理
目录树:任何文件或者目录都只有唯一路径
文件操作
| 目录 | 描述 |
|---|---|
/bin | 存放二进制可执行文件(ls、cat、mkdir 等),常用命令一般都在这里 |
/etc | 存放系统管理和配置文件 |
/home | 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是 /home/user |
/usr | 用于存放系统应用程序,比较重要的目录 /usr/local 本地系统管理员软件安装目录 |
/opt | 额外安装的可选应用程序包所放置的位置 |
/proc | 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息 |
/root | 超级用户(系统管理员)的主目录 |
/sbin | 存放二进制可执行文件,只有 root 才能访问 |
/dev | 用于存放设备文件 |
/mnt | 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统 |
/boot | 存放用于系统引导时使用的各种文件 |
/lib | 存放跟文件系统中的程序运行所需要的共享库及内核模块 |
/var | 用于存放运行时需要改变数据的文件 |
linux 中文件类型有:
- 套接字(
s) - 普通文件(
-) - 目录文件(
d) - 符号链接(
l) - 设备文件(
b、c) FIFO(p)
通过 ls -al 命令可以查看文件的详细信息,第一个字符表示文件类型,后面的字符表示文件权限
drwxr-xr-x@ 53 uccs staff 1696 Jul 8 10:41 .
drwx------@ 47 uccs staff 1504 Jul 17 22:30 ..
-rw-r--r--@ 1 uccs staff 43012 Jun 27 13:29 .DS_Store
文件系统:
FAT(File Allocation Table)FAT16、FAT32等- 使用一张表保存盘块信息
NTFS(New Technology File System),windows系统默认文件系统NTFS对FAt进行了改进
EXT(Extended File System),linux系统默认文件系统EXT2/3/4数字代表第几代
EXT 文件系统:
Boot Sector:启动扇区,安装开机管理程序Block Group:块组,存储数据的实际位置Boot SectorBlock Group1Block Group2Block Group3
Inode 存放的是文件的元信息:文件类型、索引节点编号、文件权限、文件物理地址、文件长度、文件连接计数、文件存取时间、文件状态、访问计数、链接指针
文件名不是存在在文件的 Inode 节点上,而是存放在目录的 Inode 节点上,因为列出目录文件的时候无需加载文件的 Inode
Inode table- 存放文件
Inode的地方 - 每一个文件(目录)都有一个
Inode - 是每一个文件(目录)的索引节点
- 存放文件
Inode bitmap->Inode位图- 记录分配的
Inode和未分配的Inode
- 记录分配的
Data block:存放文件内容的地方- 每个
block都有唯一编号 - 文件的
block记录在文件的Inode上
- 每个
Block bitmap->Block位图- 功能与
Inode bitmap类似 - 记录
Data Block的使用情况
- 功能与
SuperBlock- 记录整个文件系统相关信息的地方
Block和Inode的使用情况- 时间信息、控制信息
- 文件系统的挂载时间,最后一次写入时间,最后一次读出时间,最后一次校验时间
- 一般是
1024个字节大小
df -T 命令可以查看文件系统的类型
$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
overlay overlay 107016164 66408728 35138512 66% /
tmpfs tmpfs 65536 0 65536 0% /dev
shm tmpfs 65536 0 65536 0% /dev/shm
/dev/vda1 ext4 107016164 66408728 35138512 66% /vscode
/run/host_mark/Users fakeowner 488245288 379034416 109210872 78% /workspaces/go-devcontaienr
tmpfs tmpfs 5090964 0 5090964 0% /proc/acpi
tmpfs tmpfs 5090964 0 5090964 0% /sys/firmware
dumpe2fs /dev/sdas 查看文件系统的 Inode 信息
stat main.go 查看文件的详细信息
$ stat main.go
File: main.go
Size: 539 Blocks: 8 IO Block: 4096 regular file
Device: 0,94 Inode: 4752353 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-03 13:07:45.472318609 +0800
Modify: 2024-08-03 13:07:45.211318604 +0800
Change: 2024-08-03 13:07:45.211318604 +0800
Birth: 2024-08-02 12:46:32.561438352 +0800
设备管理
广义上的 I/O 设备:
-
对
CPU而言,凡是对CPu进行数据输入的都是输入设备 -
对
CPU而言,凡是对CPU进行数据输出的都是输出设备 -
按使用特性分类:
- 存储设备
- 磁盘
- 内存
U盘
- 交互
IO设备- 键盘
- 显示器
- 存储设备
-
按信息交换的单位分类
- 块设备
- 磁盘
SD卡
- 字符设备
- 打印机
Shell终端
- 块设备
-
按设备的共享属性分类
- 独占设备
- 共享设备
- 虚拟设备
-
按传输速率分类
- 低速设备
- 中速设备
- 高速设备
I/O 设备的缓冲区的作用:
- 减少
CPU处理I/O请求的频率 - 提高
CPU与I/O设备之间的并行性
I/O 缓冲区:
- 专用缓冲区只适用于特定的
I/O进程 - 当这样的
I/O进程比较多时,对内存的消耗也很大 - 操作系统画出可供多个进程使用的公共缓冲区,称为缓冲池
SPOOLing技术(虚拟设备技术):
- 关于慢速字符设备如何与计算机主机交互信息的一种技术
- 在输入、输出之间增加了排队转存储环节(输入井、输出井)
- 利用高速共享设备将低速的独享设备模拟为高速的共享设备
SPOOLing负责输入(出)井与低速设备之间的调度
- 逻辑上,系统为每一个用户都分配了一台独立的高速独享设备
- 逻辑上,进程直接与高速设备交互,减少了进程的等待时间
SPOOLing 技术把同步调用低速设备改为异步调用