文章目录
因为是听课时候记得笔记,所以可能会比较混乱,可以当作了解操作系统来看
操作系统
学习目标:什么是操作系统?
准备
- 系统启动及中断
- 物理内存管理
- 虚拟内存管理
- 内核线程管理
- 用户进程管理
- CPU调度
- 同步与互斥
- 文件系统
预备知识:
- 计算机结构原理
- 数据结构
- C和汇编语言
前言
-
用户角度:操作系统是一个控制软件,用来控制和限制用户的使用
-
管理应用程序:
- 为应用程序提供服务
- 杀死应用程序
-
资源管理:
管理外设、分配资源 -
Linux.Windows.Android的界面
属于外壳(Shell),而不是内核(Kernel),Kernel是我们研究重点,在Shell之下
计算机最重要的三部分:
CPU、内存、硬盘
Kernel-操作系统系统(uCore)内部组件,包括:
- CPU调度器
- 物理内存管理
- 虚拟内存管理 - 提供上层更大的更安全的一块空间环境
- 文件系统管理 - 抽象出来以文件形式存储保存数据
- 中断处理与设备驱动
OS Kernel的特征:
四个:并发、共享、虚拟、异步
- 并发:计算机系统中
一段时间
内,存在多个运行的程序运行,需要OS管理和调度;
并行:计算机系统中在一个时间点
上,存在多个程序同时运行(需要有多核CPU才能完成) - 共享:同时访问,互斥共享
- 虚拟:把CPU虚拟为进程,把硬盘虚拟为文件系统。利用多道程序设计技术,让每个用户都觉得有一个计算机专门为他服务
- 异步:程序执行不是一贯到底,而是走走停停,向前推进的速度是不可预知。但只要运行环境相同,OS需要保证程序的运行结果也要相同
CODEING
计算机调度方式:分时调度(schedule时间片轮询,中断帮助完成分时调度)
- 微内核:模块化,消息之间不是以函数方式通信,而是通过消息松耦合的架构通信。
优点:服务与服务之间模块化,更安全(file system,device driver, network stack, i/o system)
缺点:数据通信的代价高,服务与服务之间通信要先传给内核,再有内核转发到服务,需要多次拷贝空间,性能差。
计算机组成:CPU,内存,IO外设
操作系统启动过程:
X86:
- BIOS
加电自检,检测一些外设,将Bootloader从硬盘第一个扇区(512byte)加载到0x7c00,跳转到CS:IP = 0000:7c00) - Bootloader
1.将操作系统的代码和数据从硬盘加载到内存中
2.跳转到操作系统的起始位置
系统调用
应用程序主动向操作系统发出服务请求(应用请求)
异常:
- 非法指令或者其他坏的处理状态(内存出错)
中断:
- 来自不同的硬件设备的计时器和网络的中断(来源与外设)
1. 处理时间
- 中断:异步
- 异常:同步
- 系统调用:异步或同步(如果操作程序发出请求后阻塞等待—同步;如果程序发出系统调用请求(同步),后去做别的事情,等系统返回结果再去通知程序—异步)
2. 响应
- 中断:持续,对用户应用是透明的
- 异常:杀死或者重新执行意想不到的的应用程序指令
- 系统调用:等待和持续
中断:
- 保存当前处理状态
- 中断服务程序处理
- 清除中断标记
- 恢复之前保存的处理状态
异常:
- 保存现场
- 异常处理:杀死产生异常的程序,重新执行异常指令
- 恢复现场
系统调用
标准C库的例子:
- 应用程序调用printf()时,会触发系统调用write()
- 常见的read、write、ioctl
程序访问主要是通过高层次的API接口而不是直接进行系统调用
win32 API 用于windows(可以直接系统调用)
POSIX API 用于POSIX-based systems(包括UNIX\LINUX\MacOS X的系统)
是一套通用可移植的API,只要遵循这个标准都可以执行
(可以直接产生系统调用)JAVA API用于JAVA 虚拟机(JVM)(不能直接残生系统调用,需要再去调用win32/posix)
学习目标:
操作系统是如何完成系统调用的?
- 通常情况
用户态:应用程序的特权比较低,不能直接发送机器指令和直接访问设备IO
内核态:操作系统运行中,操作系统可以执行任何一条指令,包括机器指令,访问设备IO
函数调用和系统调用的区别?
-
函数调用:实际上是在一个栈空间中的调用和返回
-
系统调用:应用程序和操作系统都拥有各自的堆栈,当应用程序发出系统调用的时候,它需要从用户态的堆栈空间切换到内核态的堆栈空间,同时还需要特权级别的转换(用户->内核);堆栈切换和特权转换都需要一定的开销,也就意味着系统调用的会比函数调用的开销大很多,但这样做目的也为了更加安全和可靠。
知识小结:
跨越操作系统边界的开销
在执行时间上的开销超过程序调用
开销:
1 建立中断/异常/系统调用好与对应服务例程映射关系的初始化开销
2 建立内核堆栈
3 验证参数
4 内核态映射到用户态的地址空间更新页面映射权限
5 内核态独立地址空间TLB
计算机体系结构及内存分层体系
计算机体系结构主要分为三大块:
CPU:程序和软件上的控制
内存: 主要放置程序的代码和数据
外设:满足一些功能,把数据保存在硬盘中…
内存分层体系组成:
CPU所访问的数据和指令所存放的位置在哪里?
CPU内部:寄存器->cache
资源很有限
CPU外部:主存->物理硬盘
速度稍慢,但是硬盘可以掉电保存数据,等再启动时CPU读入到内存
在操作系统中管理内存的不同方法:
- 程序重定位
- 分段
- 分页
- 虚拟内存
- 按需分页虚拟内存
内存的实现高度依赖于硬件
- 必须知道内存架构
- MMU(内存管理单元):硬件组件负责处理CPU的内存访问请求
地址空间 & 地址空间是如何生成的
- 地址空间定义
- 地址空间生成
- 地址安全检查
物理地址:硬件真实的地址
逻辑地址(虚拟地址):一个运行程序所拥有的内存地址
过程: .c -> .s -> .o -> xxx
* 预处理:gcc -E xxx.i xxx.c
* 编译:gcc -S xxx.S xxx.i
* 汇编:gcc -c xxx.o xxx.S
* 链接:gcc -o xxx.elf xxx.o
生成:编译->汇编->链接(编译器 符号地址空间)
运行:加载硬盘中的程序,放到内存中运行(CPU中loader,逻辑地址空间)
MMU
CPU中有一个MMU,MMU有一块区域表示了这个映射关系,正如上图中蓝色区域的地址转换过程。
当CPU要执行某一条指令时候,它的ALU固件需要这条指令的内容,他会发出这个这个请求,这个请求中带有逻辑地址,CPU中的MMU会去查询这个逻辑地址在对应的表中有没有对应的物理地址,如果有这个物理地址,那么就可以找到。
连续内存分配
内存碎片问题
-
分区的动态分配
第一适配
最佳适配
最差适配
-
压缩式碎片整理
-
交换时碎片整理
碎片问题
分区的动态分配
第一适配
优势:
-
简单
-
易于产生更大空闲块,向着地址空间的结尾
劣势:
-
外部碎片
-
不确定性
压缩式碎片整理
把内存中分布不连续的地址空间,重新排序使得连续,从而减少内存碎片。但是会系统的内存拷贝开销会非常大
交换时碎片整理
换入换出(swap)充分利用硬盘部分,p3在运行时,不够p4在内存中等待所需的空间,把p4一部分移到硬盘中(暂时把没有执行的程序放入硬盘中,等需要执行时再放入内存)
非连续内存分配
连续内存分配的缺点:
分配给一个程序的物理内存时连续的
内存利用率较低
有外碎片、内碎片的问题
非连续内存分配的优点:
一个程序的物理地址空间是非连续的
更好的内存利用和管理
允许共享代码与数据(共享库等…)
支持动态加载和动态链接
非连续内存分配的缺点:
如何建立虚拟地址和物理地址之间的转换
软件方案
硬件方案:
分段:
程序的分段地址
分段寻址方案
分页
分段
通过段号(index)就可以找到对应到段表里面的真实项,就知道了这个项中在物理地址的限制,CPU会判断一下 一个限制是否是一个非法的操作,如果不合法的地址,会产生一个异常,kill这个进程;如果合法就会取出这个物理地址进一步处理。
问题:段表谁来建立?—>操作系统
分页
-
划分物理内存至固定大小的帧(大小是2的幂,eg:512,4096,8192)
-
划分逻辑地址空间至相同大小的页(大小是2的幂,eg:512,4096,8192)
-
建立方案 转换逻辑地址为物理地址(pages to frames)
- 页表
- MMU/TLB
帧
在物理地址使用帧
页
在逻辑地址上使用页
- 一个程序的逻辑地址空间被划分为大小相等的页
- 页内偏移大小 = 帧内偏移大小
- 页号大小 <> 帧号大小
页寻址机制
流程分析:
CPU先获取逻辑地址,逻辑地址中记录了两部分:offset偏移量(o)和pages页号
§,页号当做index索引,然后根据页号(page number)在页表基址(page base address)上的偏移, 找到页表(page table)中找到对应的帧号,然后根据帧号(frame number)和offset偏移量(o)找到实际的物理地址。
页表(page table)是谁建立的?
page table 是操作系统建立的,这样才能让程序完成映射关系,才能正常的跑
-
页表
- 页表概括
- 转换后备缓冲区(TLB)
- 二级/多级 页表
- 反向页表
地址转换实例
解释
第一个逻辑地址(4,0)代表在页表中的第5个(01234,都是用0开始计数),flags的resident bit(是否对应物理地址的存在位)为图中标红部分(0->没有对应的帧块,物理地址不存在。1->有对应的帧块,物理地址存在)。
第二个逻辑地址(3,1023),同理即可,对应的页帧号为00100 -> 4,再根据后面的偏移量找到对应的物理地址(4,1023)。
64位计算机->寻址空间为2^64
一个页的大小 -> 1024byte -> 2^10
一个页表会多大? -> 2^64 / 2^10
-
页表性能问题:(空间、时间)
每个应用程序都会有一个页表,会导致栈的空间很大,浪费资源,CPU的cache放不下,需要把页表放到内存中,开销很大
-
如何解决?
- 缓存(caching)
- 间接访问(Indirection)访问
TLB
-
什么是TLB?:
把我们经常访问的页表项放到TLB中,因为虽然TLB(CPU中)访问很快,但是大小是很有限的,如果TLB中有记录页表项被访问到(TLB命中),可以不经过页表,直接访问物理地址。如果TLB中没有记录页表项被访问到(TLB未命中),CPU会去访问页表,再去访问物理地址。
-
那会不会经常出现TLB未命中?
不会的,因为在32位系统中TLB有4K个项,可以被访问4K次。
-
延伸扩展:
在我们编程时候,尽量把变量和存储放到一个位置,减小TLB的开销
二级页表
-
二级页表产生原因?
由于上节说到页表占用的空间太大,那如何使得页表占用的空间尽量小,引入二级页表。
-
寻址流程:
CPU是知道一级页表的起始地址的,然后根据p1的number作为index查到一级页表中的page table项,一级页表中存的这个值是二级页表的起始位置(如图箭头所示),然后根据p2的number作为Index(一级页表的address+p2Number)查到二级页表的帧号(frame number),再用帧号加上对应的offset偏移量得到相应的物理地址。
页的offset与帧的offset是一样的
-
优点:
省空间 -> 如果p1中查不到对应的p2映射,那么就不用保留p2在内存中
多级页表
明白了二级页表进一步也推出多级页表
-
优点
省空间,
时间换取空间
比如我们的64位操作系统可以用5级页表表示,随着页表的增多开销随之越来越大
反向页表
这里不赘述了,想学习的小伙伴自己学一下
虚拟内存
- 如果在计算机系统中,尤其是在多道程序运行的环境下,可能会出现内存吃紧问题,怎么办?
- 如果是程序太大,超过内存容量,可以采用手动覆盖(overlay)技术,只把需要的指令和数据保存在内存中
- 如果是程序太多,可以采用自动的交换(swpping)技术,把暂时不能执行的程序送到外存中
- 如果想在有限容量的内存中,以更小的页颗粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术
进程
- 进程的描述
- 进程的定义
- 进程的组成
- 进程的特点
- 进程控制结构
进程的定义
由静态的程序,加载到内存中,成为动态的进程
进程的组成
一个进程应该包含:
程序的代码
程序处理的数据
程序计数器中的值,指示下一条将运行的指令
一组通用的寄存器的当前值,堆、栈
一组系统资源(如打开的文件)
-
程序与进程的区别?
-
进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
-
为什么进程有核心态和用户态的区分?
一个进程不止在用户态上操作,比如需要读写硬盘这些外设,都需要由操作系统去完成
-
-
进程是暂时的,程序是永久的:进程是一个变化的过程,程序是可以永久保存
-
进程与程序的组成不同,进程的组成包含:程序、数据、进程控制块(即进程状态信息)
-
进程运行不是一直执行的,会被优先级更高的进程打断,然后再进行执行
- 进程的特点:
- 动态性:可动态的创建,结束进程
- 并发性:进程可以被独立调度并占用处理机运行;
并发并行(多核)
- 独立性:不同进程的工作不相互影响(页表来保证)
- 制约性:因访问共享数据/资源或进程间同步而产生制约
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfNQrvL2-1660920031852)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209125839929.png)]
- a:动态
- b:独立
- c:调度切换
进程控制块(Process Control Block)
这部分挺有用的
进程的生命周期
- 进程生命期管理
- 进程创建 -> 初始化
- 进程运行 -> 执行
- 进程等待 -> 等待
- 进程唤醒 -> 就绪
- 进程结束 -> 消亡
进程创建
引起进程创建的3个主要过程:
系统初始化
用户请求创建一个新进程
正在运行的进程执行了创建进程的系统
进程等待
进程唤醒
进程结束
-
为什么会从running变为ready?
因为系统的内存资源和CPU的处理是有限的,当有多个程序在运行时,如果一个程序在规定的时间片内没有完成,就会被切换为下一个进程去执行,也就是从running变为ready。
-
可能的状态变化如下:
NULL->New:一个新进程被产生出来执行一个程序
New->Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。
是否会持续很久->不会,因为OS创建pcb是很快的
Ready->Running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。
Running->Exit:当进程便是它已经完成或者因出错,当前运行进程会有操作系统作结束处理
Running->Ready:处于运行状态在其运行过程中,由于分配给它的处理机时间片用完而让出处理机
谁完成?->操作系统
Running->Blocked:当进程请求某样东西且等待时
Blocked->Running:当进程要等待某事件到来时,它从阻塞状态到就绪状态
进程挂起
实质:把进程暂时放到外存中
挂起状态
- 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现
- 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行
线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MIOrDwlj-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135112740.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4uSXYbb-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135301624.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BBFOLIyy-1660920031857)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209135706333.png)]
- 程序分析:
- 单进程: 播放声音可能不连贯,因为是单进程,read是阻塞读取,可能比较慢,而play比较快,当play完成后,read读耗费时间,导致卡顿
- 多进程: 如果使用多进程的话,
- 1.存在一个cpu调度,内存占用(维护进程的系统开销较大;创建进程时,分配资源,建立PCB;撤销进程时,回收资源,撤销PCB;进程切换时,保存当前进程的状态信息)
- 2.IPC(进程间通信复杂)的问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDm8hqiH-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141341809.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rbQxKfYn-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209141653807.png)]
系统资源分配的最小单位,系统调度的最小单位?
如何理解这句话:
进程主要就是负责资源的管理(打开文件,访问网络…)
线程成为了进程组成的重要部分,一个进程中的所有线程共享该进程的所有资源
一个线程组成:code(代码段),Initialized data(数据段),stack(堆栈)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lJ0RifA-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209142213138.png)]
如何理解线程的缺点:
线程能够共享一个进程的所有资源,若某个线程由于意外破坏了某个资源,其他线程访问这个资源也会出错.如果一个线程崩溃了,所有线程都会崩溃,进程也会挂掉.
什么时候用线程什么时候用进程?
强调性能使用线程,强调安全性使用进程
eg:你浏览器创建的所有网页都是线程,如果一个线程崩溃了,会导致所有网页不能打开,浏览器都崩溃了,这样的设计就不好!!!!!!!! ---> chrome都是使用进程模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1LWBbMsz-1660920031858)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209143200417.png)]
线程与进程的比较
-
进程时资源分配单位,线程是CPU调度单位
资源:内存,文件,网络…
cpu调度单位:一些控制流所需要的信息
-
进程拥有一个完整的资源平台,而线程只独享必不可少的资源
-
线程同样具有就绪,阻塞和执行三种基本状态,同样具有状态之间的转换关系
-
线程能减少并发执行的时间和空间开销
1 线程的创建时间比进程短
因为进程要创建内存去管理,创建文件去管理
线程直接使用进程已经创建好的内存和文件
2 线程的终止时间比进程短
同上同理
3 同一进程内的线程切换时间比进程短
因为同一个进程中的线程拥有相同的页表,所以切换快
切换进程时它们的页表都是不同的
4 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核通信
同一个线程它们使用的地址是相同的,直接访问地址即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlrM1f2k-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145105828.png)]
- 用户线程:CPU的调度单位为进程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aV0RHi6g-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145250601.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPW6HhpY-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145353390.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JwrDq0rA-1660920031859)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145628846.png)]
- 内核线程:CPU调度单位为线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M4HATWru-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145802784.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEdONlJU-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209145839329.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5iKAdGS-1660920031860)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150106717.png)]
上下文切换context
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iPkdGiI5-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150334203.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-elNecVkS-1660920031861)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150453952.png)]
什么时上下文切换?
process P0运行时要上下文切换,它要把进程寄存器信息保存在PCB中,把另一个进程process p1寄存器信息的PCB恢复CPU中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmxt4Fzk-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209150722211.png)]
进程的创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBMFWjsC-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151001342.png)]
exec会把另外一个程序覆盖之前的进程代码段,PCB时不变的,如果执行了why would I execute证明exec执行失败
- 执行fork
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Im1IiSS7-1660920031862)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151513125.png)]
|
|
- 执行exec
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7DOqjOuB-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151623736.png)]
- 执行fork
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jrz7Unte-1660920031863)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151704753.png)]
- 执行exec
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHxg9QAV-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151823996.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJnU10aN-1660920031864)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209151849806.png)]
-
这是很方便去执行一个新的进程
-
fork优化
因为fork会拷贝父进程的资源,开销大,你要执行exec是不需要之前父进程的资源,所以拷贝过程是多余的
使用vfork:不会复制所有的资源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtD8pN7U-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209152001586.png)]
现在系统基本都是COW
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLkaI261-1660920031865)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211209154050685.png)]
调度
-
上下文切换
- 切换CPU的当前任务,从一个进程/线程到另一个
- 保存当前进程/线程在PCB/TCP中的执行上下文
- 读取下一个进程/线程的上下文
- 保存当前进程/线程在PCB/TCP中的执行上下文
- 切换CPU的当前任务,从一个进程/线程到另一个
-
CPU调度
- 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程
- 调度程序:挑选进程/线程的内核函数(通过一些调度)
- 什么时候进行调度?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g81CdttI-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211452357.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YUmBuMIW-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215211622392.png)]
文件系统
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oufOa0z6-1660920031866)(C:\Users\11639\AppData\Roaming\Typora\typora-user-images\image-20211215213740242.png)]
虚拟文件系统:/proc…