
个人主页MSTcheng · CSDN代码仓库MSTcheng · Gitee 精选专栏: 《C语言》《数据结构》《算法学习》《C由浅入深》《Linux操作系统》座右铭路虽远行则将至事虽难做则必成在前面的文章中我们向大家介绍了 Linux 的基本开发工具接下来就要正式进入进程相关话题的学习了进程是Linxu系统中非常重要的一部分学好了进程才能理解后面的CPU调度等知识总之万事开头难只要把第一步迈开了后面就不觉得难了。文章目录一、冯·诺依曼体系结构深度解析1.1 什么是冯·诺依曼体系结构1.2 冯·诺依曼体系结构的五大组成部分二、为什么需要内存2.1第一层存储分级2.2第二层体系结构效率问题木桶原理2.3第三层局部性原理让预加载成为可能2.4第四层技术推动生产力终极意义三、 输入/输出(IO)的概念本质的概念本质3.1 IO的定义角度3.2 从程序角度理解IO3.3 IO的本质是拷贝3.4 两台计算机通信的数据流动过程四、操作系统概念作系统概念4.1 什么是操作系统4.2 狭义操作系统 vs 广义操作系统4.3 操作系统的四大管理功能4.4 为什么要有操作系统4.5 驱动程序的作用4.6 操作系统的分层架构五、操作管理的本质——「先描述再组织」再组织」5.1 现实世界的管理模型5.2 将现实管理问题转化为计算机问题建模5.3 「先描述再组织」的跨领域延伸扩展1操作系统管理硬件扩展2C面向对象设计的本质扩展3为什么所有编程语言都是面向对象的5.5 「一切皆对象」的本质5.6 操作系统的定义六、系统调用System Call6.1 为什么要引入系统调用6.2 为什么之前没见过系统调用—— 库函数的封装七、总结一、冯·诺依曼体系结构深度解析1.1 什么是冯·诺依曼体系结构定义以英特尔 x86 台式机、笔记本、服务器为代表的主流计算机硬件体系结构命名以科学家冯·诺依曼的名字命名是一项划时代的技术1.2 冯·诺依曼体系结构的五大组成部分各部分功能详解输入设备将用户数据送入计算机常见示例键盘、鼠标、摄像头、话筒、网卡从网络读取数据、磁盘读取文件内容到程序笔记本获取网络数据本质上是网卡从网线上读取数据。输出设备将计算结果显示给用户常见示例显示器、打印机、扬声器、网卡发送数据到网络、磁盘写入文件关键结论输入、输出设备统称外设外围设备/外部设备存储器特指内存RAM内存内部存储/RAM与外存外部存储磁盘、U 盘、SSDRAM 分为 SRAM静态和 DRAM动态笔记本上一般为 DRAMCPU中央处理器运算器处理两种运算算术运算 - * / 等数学计算逻辑运算判断真假、取反等控制器执行读取指令、分析指令、响应中断等不作为重点⚠️注意输入-计算 - 输出输入输出都是设备统称外设外部设备外设距离CPU较远所以速度特别慢既然外设距离 CPU 较远、速度又慢那 CPU 该如何高效地获取数据呢这就引出了内存的作用。二、为什么需要内存上面我们说了存储设备就是内存而内存相较于磁盘外存离CPU较近那么为什么要有内存其实核心就一句话CPU不与外设之间打交道而是跟内存打交道下面我们分三个层次来理解为什么需要内存2.1第一层存储分级存储分级的核心规律离CPU越近→ 容量越小、单价越贵、效率越高离CPU越远→ 容量越大、单价越便宜、效率越低2.2第二层体系结构效率问题木桶原理如果没有内存会怎样原始设计低效 输入设备 ──→ CPU ──→ 输出设备 毫秒级 纳秒级 毫秒级 ↑ CPU大部分时间在等待速度量级差距CPU访问纳秒级ns磁盘访问毫秒级ms差距10的6次方倍 ≈100万倍引入内存后的设计改进设计高效 输入设备 ──→ 内存 ──→ CPU ──→ 内存 ──→ 输出设备 预加载 纳秒级 写回 刷新 ↑ 整个系统效率以内存为主关键数据流变化在数据层面CPU不和外设直接打交道只会和内存打交道这是体系结构规定输入设备的数据 → 先存入内存 → CPU从内存读取。CPU的计算结果 → 写回内存 → 再从内存刷新到输出设备。总结内存充当CPU与外设之间的数据传输桥梁。2.3第三层局部性原理让预加载成为可能问题即使有了内存串行执行的话根据木桶原理效率不还是一样慢吗答案引入预加载机制配合局部性原理让系统效率以内存为主。局部性原理Principle of Locality局部性原理和预加载当你正在访问某个位置的数据时未来一段时间内你有非常大的概率会访问周围的数据所以第一次加载的时候就会把周围的数据也一起加载进内存举个例子读取磁盘上一个100MB的文件但只用到前10个字节 操作系统的做法直接把100MB全部预加载到内存中 后续CPU每次读取都直接从内存取 → 效率以内存为主2.4第四层技术推动生产力终极意义为什么一定要用内存做性价比最优解方案问题全部用寄存器造价极度增加一台电脑几十万甚至更多普通人接受不了全部用磁盘效率太低比人快一点点没有十倍百倍提升无法广泛普及内存居中✅ 性价比最优 → 普通人几千块就能买到高效计算机一张图总结理解了内存为何如此重要之后我们再来看看数据在内存与外设之间是如何流动的这就涉及输入/输出的概念。三、 输入/输出(IO)的概念本质的概念本质3.1 IO的定义角度我们口中的输入和输出是是站在谁的角度考虑问题的“输入输出本质上站在内存角度来理解的”关键理解从外设把数据拿到内存→ Input输入从内存把数据推到外设→ Output输出合称IOInput/Output3.2 从程序角度理解IO因为程序运行时加载到内存中所以“站在内存的角度就是站在加载到内存中的程序的角度”程序视角 scanf/从磁盘读文件 → 程序在输入→ input printf/写磁盘文件 → 程序在输出→ output 这就解释了为什么C/C代码第一行永远是#includestdio.h← stdstandard(标准),ioinput/output#includeiostream所以程序开头引入头文件就是为了更好的告诉编译器这些IO函数长什么样(声明)3.3IO的本质是拷贝从一个设备把数据拷贝到另一个设备无论什么角度本质就是拷贝3.4 两台计算机通信的数据流动过程关键要点总结QQ程序必须先加载到内存才能运行QQ也是可执行程序本质是文件。数据必须经过内存CPU永远不和外设直接交互数据CPU的角色执行加密/解密、封装/拆包的算法。输出的目的地可以有多个既可以发往网卡也可以同时显示在显示器上。路怎么修人就怎么走。硬件怎么做软件将来就必须得这么干硬件层面的数据流动规则已经清楚了那么谁来统一管理这些硬件资源、让上层软件能方便地使用它们呢答案就是操作系统。四、操作系统概念作系统概念4.1 什么是操作系统4.2 狭义操作系统 vs 广义操作系统从上面这张图我们能看到狭义操作系统 内核。广义操作系统 内核 外壳程序(Shell/bash /Windows GUI/Android UI) 配套生态软件(QQ、浏览器、Office等)。4.3 操作系统的四大管理功能管理模块对应硬件资源说明进程管理CPU管理执行流线程/进程内存管理内存分配、回收、保护文件管理磁盘文件系统、路径、权限驱动管理各类外设显卡、网卡、键盘等4.4 为什么要有操作系统根本原因人不能直接操作硬件。4.5 驱动程序的作用用户/应用 ↓ 操作系统内核 ↓ 驱动程序每种硬件配一个驱动← 由硬件厂商提供 ↓ 底层硬件网卡/硬盘/CPU/显示器...关键要点操作系统不直接操作硬件通过驱动程序访问。每个硬件需要配套的驱动厂商提供。插入USB鼠标后需要安装成功弹框 → 驱动加载完成才能使用。4.6 操作系统的分层架构用户的三种操作方式玩/用操作系统→外壳程序GUI、Shell命令、APP在操作系统上开发→C/C标准库printf、scanf、fopen等管理操作系统→管理指令apt、控制面板、安装/卸载软件外壳程序、库函数、指令最终都直接或间接调用系统调用来完成工作。五、操作管理的本质——「先描述再组织」再组织」将来学的所有内容全部都围绕着这六个字展开先描述再组织/fon5.1 现实世界的管理模型角色划分校长管理者负责做决策辅导员负责获取信息学生被管理者负责做执行核心推理链1.管理者和被管理者不需要见面。2.校长管理学生是通过获取学生身上的数据成绩、出勤、奖惩。3.校长如何获取数据→通过辅导员。4.校长如何做决策→根据数据进行分析排序、筛选、比较。5.管理本质对数据进行管理数据提供决策依据。5.2 将现实管理问题转化为计算机问题建模⚠️特别注意在老内核Linux2.4中图中所说的head指针就是runqueue_head它是全局就绪双向循环链表的链表头所有就绪进程都挂在这个head上但是在Linux2.6(现代内核)中每一个CPU都有一个独立的runqueue不再是单一的一条大链表了里面按照优先级分成了多条链表(prio_array)每个优先级都有自己独立的struct list_head queue[]作为改优先级子队列的链表头另外还有rq-curr指针指向当前CPU正在运行的task进程上面涉及到进程调度相关的知识了如果不理解等到看完后面进程调度的篇幅再回来看就瞬间理解了5.3 「先描述再组织」的跨领域延伸扩展1操作系统管理硬件// 操作系统用结构体描述硬件设备structdevice{inttype;// 设备类型intstatus;// 设备状态charvendor[20];// 厂商bool accessible;// 是否可访问structdevice*next;// 指向下一个设备};// 把所有设备组织成链表// 管理设备 → 链表增删查改结论操作系统内核中存在大量的数据结构扩展2C面向对象设计的本质C的 class →先描述描述事物属性 C的 STL容器 →再组织vector/list/map/set...写通讯录 → 先写Person类描述人再用vector组织。写扫雷游戏 → 先写坐标/Mine类再组织数据结构。扩展3为什么所有编程语言都是面向对象的C有classSTL Java 有classCollection框架 Python有classlist/dict Go 有structslice/map 不是因为语言特点而是因为先描述再组织是现实世界的真相5.5 「一切皆对象」的本质为什么Python/Java/JavaScript都是面向对象的语言因为在现实世界中我们要管理任何事物都需要先描述其属性类再组织这些实例对象集合。这不是语言特性的选择而是建模的必要方法。5.6 操作系统的定义操作系统是一款进行软硬件资源管理的软件。当我们看到管理二字立刻想到先描述用结构体描述被管理对象。再组织用数据结构组织所有对象。管理 数据结构的增删查改六、系统调用System Call6.1 为什么要引入系统调用不妨先来看看下面这个例子银行金库里的现金和贵重物品是核心资产绝不允许外人随意进出同样操作系统内核中的关键数据结构和代码也是核心机密不能让上层用户直接访问否则一旦被恶意操作整个系统都会面临安全风险。因此银行在墙上开小窗口——系统调用它是银行对外提供的服务接口客户只能通过这些窗口办理业务而无法直接触碰金库内部的资产。6.2 为什么之前没见过系统调用—— 库函数的封装大堂经理类比银行窗口系统调用 → 直接使用成本高需要了解流程 ↑ 大堂经理C/C标准库 → 帮你填表、抽号、排队简化使用 ↑ 大爷开发者 → 直接用就行不需要懂银行内部流程库函数 对系统调用的封装层级示例说明系统调用sys_write(),sys_read()裸接口直接操作内核标准库printf(),scanf(),fopen()C标准库封装了系统调用“以前写C语言用的printf、scanf、fopen这些都是C标准库提供的底层封装了系统调用。所以我们从来没有直接见过系统调用。”关键流程图printf(hello)← 你调用的库函数 ↓ libc库内部准备缓冲区 ↓int0x80/syscall指令 ← 触发系统调用 ↓ 内核sys_write()← 实际执行 ↓ 内核 → 驱动 → 显示器硬件重要结论凡是涉及访问硬件的操作最终都要贯穿操作系统调用系统调用向显示器写入数据 → 经过操作系统 → 经过显卡驱动 → 写入显示器向磁盘写入文件 → 经过操作系统 → 经过磁盘驱动 → 写入磁盘覆盖率标准库中**60%-70%**的函数是对系统调用的封装系统调用在后面的文件管理模块学习时还会重点介绍本节就是一个引子宏观理解一下系统调用即可七、总结冯·诺依曼体系结构计算机由输入、输出、内存、运算器、控制器五部分组成运算器控制器CPUCPU 只与内存打交道输入输出统称外设。为什么需要内存离 CPU 越近越快越贵内存作桥梁解决 CPU纳秒级与磁盘毫秒级的速度差配合局部性原理预加载性价比最优。IO 本质站在内存角度外设→内存是输入内存→外设是输出本质是数据拷贝。操作系统狭义内核广义内核外壳生态软件通过驱动管理硬件四大功能为进程、内存、文件、驱动管理。管理本质先描述结构体再组织数据结构管理增删查改。系统调用内核的安全接口标准库是对其封装凡访问硬件最终都要调用系统调一句话硬件定规则内存作桥梁操作系统管资源系统调用供入口。以上就是本篇文章的全部内容掌握了这些基础概念后续的进程、内存、文件管理等知识学起来就会轻松很多。