【Linux】10:冯·诺依曼体系结构和操作系统
目录一、冯·诺依曼体系结构1.1 冯·诺依曼体系结构的发展1.2 冯·诺依曼体系结构的五大部件1.2.1 输入和输出设备1.2.2 存储器1.2.3 中央处理器CPU1.3 冯·诺依曼体系结构重点知识1.3.1 内存的重要性1.3.2 为什么执行我们的程序要先加载到内存1.3.3 开机的时候为什么要加载操作系统呢二、使用冯·诺依曼体系结构理解数据在网络中流动三、操作系统3.1 操作系统的概念3.2 设计操作系统的目的3.3 操作系统的核心功能3.3.1 处理机管理进程管理3.3.2 存储器管理内存管理3.3.3 设备管理3.3.4 文件管理3.3.5 用户接口3.4 如何理解管理3.5 系统调用和库函数的概念3.5.1 系统调用System Call3.5.2 库函数Library Function一、冯·诺依曼体系结构我们常见的计算机如笔记本。我们不常见的计算机如服务器大部分都遵守冯诺依曼体系。冯·诺依曼体系结构如下所示1.1 冯·诺依曼体系结构的发展计算机的作用就是为了解决人的问题而要解决问题首先需要将数据或是问题输入到计算机当中所以计算机必须要有输入设备。计算机解决完问题后还需要将计算结果输出显示出来所以计算机必须要有输出设备。计算机通过输入设备得到数据数据在计算机当中进行一系列的算术运算和逻辑运算后通过输出设备进行输出于是就得到了以下流程图。但是计算机当中只有算术运算功能和逻辑运算功能是不够的还需要有控制功能控制何时从输入设备获取数据何时输出数据到输出设备等。对应到C语言当中算术运算就完成一系列的加减乘除而逻辑运算就对应于一系列的逻辑与逻辑或等控制功能就对应于C语言当中的判断、循环以及各个函数之间的跳转等等。我们将就将这个具有算术运算功能、逻辑运算功能以及控制功能的这个模块称为中央处理器简称CPU。但是输入设备和输出设备相对于中央处理器来说是非常慢的于是在当前这个体系整体呈现出来的就是输入设备和输出设备很慢而CPU很快根据木桶原理那么最终整个体系所呈现出来的速度将会是很慢的。所以当前这个体系结构显然是不合适的于是我们就不让输入设备和输出设备直接与CPU进行交互而在这中间加入了内存。内存有个特点就是比输入设备和输出设备要快很多但是比CPU又要慢。现在内存就处于慢设备和快设备之间是一个不快也不慢的设备能够在该体系结构当中就起到一个缓冲的作用。现在该体系的运行流程就是用户输入的数据先放到内存当中CPU读取数据的时候就直接从内存当中读取CPU处理完数据后又写回内存当中然后内存再将数据输出到输出设备当中最后由输出设备进行输出显示。于是就形成了最终的冯诺依曼体系结构。1.2 冯·诺依曼体系结构的五大部件在冯诺依曼体系结构主要由五种设备组成分别是输入设备、存储器、运算器、控制器和输出设备它们各司其职都做着它们各自的工作。1.2.1输入和输出设备首先要来讲的就是我们能直接接触到的东西也就是两个输入、输出设备【输入设备】向计算机输入数据和信息的设备是计算机与用户或其他设备通信的桥梁例键盘、话筒、摄像头、网卡、磁盘【输出设备】是计算机硬件系统的终端设备用于接收计算机数据的输出显示、打印、声音、控制外围设备操作例显示器、声卡、网卡、磁盘对于输入输入设备和输出设备我们统称为外围设备对于外围设备而言都比较慢就比如说【磁盘】不过虽然它比较慢但是它们都有一个优点就是存储容量大、可以长久保存数据不丢失1.2.2 存储器可以看到对于上面所列举的输入和输出设备中同时出现的就是网卡和磁盘这两样我们主要来说说磁盘这个东西。因为我们要通过输入设备将输入都输入到计算机中那计算机肯定要对这些数据去进行一些处理此时这些数据肯定是要一直存放在计算机中的所以肯定要有东西将我们输入到计算机中的数据都保存起来这个时候就需要使用到一些存储器了此时我们就要来讲讲存储器了它分为内存和外存不过一般我们都称之为内存【内存】 用于存放电脑运行中的原始数据、中间结果以及指示电脑工作的程序断电后会丢失容量小速度快【外存】用来存放一些需要长期保存的程序或数据断电后也不会丢失容量比较大但存取速度慢注意 这里存储器只是内存不包括外存。1.2.3 中央处理器CPU既然可以存储我们输入进去的数据了那要如何去处理这些数据呢此时就需要使用到中央处理器CPU运算器计算机中执行各种算术和逻辑运算操作的部件。运算器的基本操作包括加、减、乘、除四则运算等等当运算器运算完成之后就会经过输出设备将处理后的结果交给内存再由内存展现给用户这就是用户与计算机之间的交互过程不过上面这些从输入到存储到计算再到输出的过程计算机去如何去执行的呢靠什么去控制这种种行为此时就要使用到控制器了控制器控制器也是一个硬件虽然外设和中央处理器在数据上没有交互但并不代表它俩就没有交互。前面得知输入设备会把数据预装载到内存从而和cpu进行交互但是你怎么知道所有数据都被预装载了呢针对没被预装载的数据中央处理器就要和外设进行交互协商而这个操作就是由控制器完成的从而将数据尽可能加载到内存或把数据从内存加载到外设。对于上面的运算器和控制器我们将其合称为【中央处理器】即cpu。它是计算机的大脑、也是核心部分很多控制信号都要经过CPU才能执行1.3 冯·诺依曼体系结构重点知识1.3.1 内存的重要性经过我上面这一番讲解相信读者对冯诺依曼的基本体系有了一个概念了不过一定会有同学提出这样的疑问既然计算机只是从外界接收数据然后处理我们输入的数据再把结果反馈给我们那也可以不用存储器呀在上一小节中我们讲到了输入设备和输出设备它们统称为外围设备对于像【磁盘】这种外围设备来说虽然它有着大容量的内存但是读写速度却非常慢机械硬盘读写速度平均60---80M每秒固态硬盘不同品牌型号之间,平均大约在150---300M每秒但是对CPU来说也就我们上面说到过的运算器 控制器它的运算速度读者可以自行去网上看看那比磁盘不知道要快出多少倍了。那一个写入很慢一个读入很快真的可以兼容吗【木桶效应】什么叫木桶效应呢也就是这个木桶的承水量不取决于木桶中最长的那块板而取决于最短的那块板对应我们上面所说磁盘与CPU一个输入一个读取一个慢一个快虽然二者的维度不同但计算机还是会按照慢的那个来执行也就是说整体的效率就以外设为主了那这一个快。一个慢该怎么办呢此时就还是需要使用到冯诺依曼体系结构中的【存储器】也就是我们俗称的内存因为对于内存这个东西它虽然比CPU来得慢一些但是却比磁盘快多了它们三者的速度大概可以像下面这样对比CPU —— 纳秒ns内存 —— 微秒us外设 —— 毫秒ms可以看到CPU是纳秒级别的速度但外设却是毫秒级别的所以就有了内存这个东西那有了内存后则怎么使用呢因为有了内存的存在虽然它掉电易失但还是局部短时间的存储因此外设可以将数据暂存到内存中此时CPU后面想要去处理这些数据的话直接去内存中拿就可以了无需再与外设进行交互造成不兼容的问题CPU中不是有个叫寄存器的东西吗也可以起到临时存储的功能为什么不直接用它呢因为寄存器太贵了只要是贵的东西就不会让我们广泛去使用。内存可以适配和外设之间的效率既能够完成我们需要的功能而且性能还不怎么差它便宜。【总结一下】CPU的速度是很快的外设的速度是很慢的因为有了内存CPU以后在进行数据计算的时候根本不需要访问外设了而只要直接伸手向内存要就可以了。1.3.2为什么执行我们的程序要先加载到内存我们自己的代码和数据、编译好的指令是要由CPU去执行的在上一小节我们讲到CPU它只会伸手向内存要数据而我们的可执行程序是一个文件文件存放在磁盘中所以这就解释通了为什么我们的程序要先加载到内存中因为CPU只会去内存中读数据体系结构决定了这一切1.3.3 开机的时候为什么要加载操作系统呢也是同样的道理操作系统的底层也是各种指令和数据这些都是需要CPU去解析的它解析完了操作系统才能正常运行起来但是CPU只能到内存中去拿数据所以在开机的时候把操作系统率先加载进内存来CPU就方便很多了不需要再和外设去进行交互。二、使用冯·诺依曼体系结构理解数据在网络中流动清楚了整个冯诺依曼体系结构知道了大部分的计算机都是基于这种结构那么现在我通过一个场景带你带你真实地体会一下这种体系结构在实际中的应用现在你在上网使用QQ向你的朋友发送了一句“在吗”那此时这个数据在网络中进行流动的呢假设你们的电脑都是基于冯诺依曼体系结构需要有这么一个输入、处理、输出这么一个流程流程分析当你使用输入设备比如键盘在QQ的聊天框中发送了一句“在吗”的时候这条信息就被读取到了计算机内部被暂时存放在了【内存】中接着CPU就会到内存中去读取数据解析里面的指令然后由【运算器】进行运算接下去通过【控制器】将这些信息由【输出设备】例如网卡转发到网络中进行传输网络内是如何传输的这里就不细讲了涉及要一些 网络协议 相关的内容因为你朋友的电脑也是基于冯诺依曼体系的所以也会存在【输入设备】例如网卡将网络中传输过来的数据输入到它的计算机中也是将其存放到内存中然后一样CPU去内存中拿出这些数据再进行处理转换成我们可以识别的样子通过【输出设备】例如显示器将消息打印在你朋友的屏幕。之后你的朋友再发送一句“在的”也是同理经过这样的传输继而你们就实现了相互通信以上就是有关冯诺依曼体系结构的叙述大多以概念为主配合图示进行理解清楚五大部件各自的作用它们之间是如何关联的。不过最重要的一点还是在于CPU是直接与内存进行交互的因为任何数据都要通过输入设备先存放到内存中而不是直接与CPU进行交互三、操作系统3.1 操作系统的概念操作系统OperatingSystemOS是一组控制和管理计算机软硬件资源、合理组织计算机工作流程、为用户和应用程序提供方便使用接口的系统软件。分层视角理解计算机系统自底向上硬件裸机)→操作系统→系统软件(编译器、数据库等→应用软件→用户1.对硬件操作系统是硬件的第一层扩充软件裸机难以直接使用操作系统对硬件封装向上提供抽象服务2.对上层程序/用户操作系统是资源管理者与服务提供者3.区分关键点OS属于系统软件不是硬件应用软件微信、浏览器运行在操作系统之上没有操作系统的计算机称为裸机只能识别机器语言使用难度极高。通俗定义操作系统充当硬件与上层软件之间的中间层。3.2 设计操作系统的目的方便用户使用计算机用户角度屏蔽底层硬件复杂细节提供命令行、图形界面等交互手段用户无需学习硬件指令即可操作计算机。管理软硬件资源资源管理角度计算机CPU、内存、磁盘、外设等资源有限OS负责分配、调度、回收资源防止程序争抢冲突。提高系统资源利用率性能角度通过多道程序、并发调度让CPU、IV/O设备尽可能并行工作减少硬件空闲时间提升整机吞吐率。扩充机器功能虚拟机角度在裸机之上提供各种服务文件管理、内存管理等将难以使用的裸机改造为功能更强、易于使用的虚拟机抽象计算机。保证系统安全、稳定运行提供权限隔离、故障隔离机制避免单个程序异常导致整个系统崩溃3.3 操作系统的核心功能统一划分五大管理功能处理机管理、存储器管理、设备管理、文件管理、用户接口3.3.1 处理机管理进程管理CPU是核心运算资源。核心对象进程/线程主要工作进程创建、撤销、进程调度、进程同步、进程通信、死锁处理目标实现并发执行合理分配CPU时间。3.3.2 存储器管理内存管理管理主存内存空间。功能内存分配与回收地址映射逻辑地址一物理地址内存保护进程之间地址空间隔离不能随意篡改别人数据内存扩充虚拟内存利用磁盘逻辑上扩大内存容量。3.3.3 设备管理管理所有外部设备键盘、显示器、硬盘、网卡、打印机等屏蔽设备硬件差异提供统一访问接口设备分配与回收I/O缓冲管理缓解CPU与外设速度差距实现设备独立性。3.3.4 文件管理外存上的数据以文件形式保存。功能文件存储空间管理文件目录管理文件夹、索引文件读写、共享、保护将杂乱磁盘扇区抽象成“文件、目录”用户按名字访问数据不用关心磁盘扇区位置。3.3.5 用户接口操作系统向外提供三类接口供人/程序使用系统服务命令接口图形GUI、命令行Shell面向普通用户程序接口系统调用供应用程序编程使用重点3.5展开图形接口GUI现在普遍单独归类。3.4 如何理解管理很多初学者误解OS 不是拥有资源而是 “管理员”资源所有权属于硬件。 可以从 4 个维度理解 “资源管理”分配当进程申请资源内存、CPU、磁盘空间OS 按照策略分配资源调度多个进程竞争同一资源时制定算法决定谁优先使用如进程调度、磁盘调度控制与保护限制程序越权访问资源。例如进程不能访问其他进程内存禁止用户程序直接操作硬件回收进程结束 / 不再需要资源时OS 收回资源供其他进程复用。两个关键管理思想抽象把复杂硬件细节封装向上提供简单模型磁盘扇区 → 文件物理内存 → 逻辑地址空间多路复用虚拟化时分复用CPU多个进程轮流使用 CPU空分复用内存多个进程同时占用内存不同区域。总结管理 ≠ 占有资源而是仲裁、分配、保护、回收资源向上提供资源抽象3.5 系统调用和库函数的概念3.5.1 系统调用System Call定义:系统调用是操作系统提供给应用程序使用内核功能的唯一接口属于操作系统程序接口。操作系统分为内核态管态和用户态目态用户进程运行在用户态不能直接访问硬件、不能操作内核数据如果程序想要执行特权操作读写文件、创建进程、申请内存、网络收发必须通过系统调用主动陷入内核由内核代码完成操作。特点:系统调用属于内核提供的函数运行在内核态触发方式产生中断 / 异常trap 指令完成用户态→内核态切换是用户程序访问操作系统内核服务唯一合法通道常见例子read()、write()、open()、fork()、mmap()Linux系统调用执行流程应用程序 → 触发陷入指令 → CPU 切换内核态 → OS 内核执行对应服务程序 → 结果返回 → 切回用户态3.5.2 库函数Library Function定义库函数是编程语言标准库C 标准库、C 标准库等提供的用户空间函数代码运行在用户态。 例如 C 语言fopen()、fread()、printf()库函数两种情况封装了系统调用绝大多数 IO、文件函数printf底层调用write系统调用fopen底层调用open系统调用 库函数做缓冲区、参数格式化等封装简化程序员开发。纯用户态计算不调用系统调用例如strlen()、sqrt()字符串、数学运算完全在用户空间执行不需要进入内核。3.5.3 系统调用 VS 库函数 核心对比对比项系统调用库函数提供者操作系统内核编程语言标准库libc 等运行状态内核态默认用户态切换开销需要用户态↔内核态切换开销较大若无系统调用则无状态切换是否依赖 OS不同操作系统系统调用编号、接口不同可移植性差标准库尽量屏蔽 OS 差异可移植性更好关系库函数经常封装系统调用系统调用不依赖库函数关键易错考点系统调用 ≠ 库函数有系统调用不一定有对应的库函数有库函数不一定包含系统调用用户程序不能直接调用内核函数只能通过系统调用命令解释器Shell、应用程序都会间接 / 直接使用系统调用。