前言
下面我们开始学习进程,需要:
- 先谈硬件——冯诺依曼体系结构
- 再谈软件——操作系统OS
- 最后再谈进程
一、冯诺依曼体系结构
1. 冯诺依曼体系结构是什么?
1.1 引入冯诺依曼体系结构
我们现在的计算机,本质上就是一些硬件的集合。
这些硬件并不是毫无章法的放在一起就成为计算机了,硬件与硬件之间必须要有协同的能力,要具有协同的能力就需要将硬件组织好,构成一个系统。
当代计算机大多都遵循冯诺依曼体系结构 !
冯诺依曼体系由五大硬件组成:输入设备、输出设备、存储器、运算器、控制器
1.2 冯诺依曼体系结构的组成
(1)输入输出设备要有
- 输入输出设备指的是什么?
在讲解输入输出设备之前,我们必须先知道一个前提计算机只认识二进制,而我们人不是认识二进制。 有了这一个前提,就决定了计算机中一定要有一些硬件设备能把人的信息转换为二进制,把二进制转换为人的信息。
因为计算机只认识二进制,所以决定了人没有办法直接访问内存、CPU,必须得有输入输出设备。
- 输入设备:将输入数据转换成计算机可行处理的形式
- 输出设备:将计算机计算完毕后的数据转换成人所认识文字、图像、声音或其他形式
综上:输入输出设备是用于人和计算机、计算机和计算机互相传递信息的设备。
- 常见的输入输出设备有哪些?
常见输入设备:鼠标、键盘、摄像头、话筒、磁盘(文件读取)、网卡……
常见输出设备:显示器、播放器、磁盘(文件写入)、网卡……
tip:
- 输入输出设备叫做外部设备,简称外设
- 有的设备是纯的输出、输入,也有的既是输入也是输出设备
(2)存储器
- 存储器指的是什么?
硬盘、U盘、内存……有很多设备都具有存储数据的能力,那这里的存储器具体指什么呢?
- 内存!
- 虽然硬盘、U盘也具有存储能力,但我们把他们叫做外设
- 外设和内存他们在存储体系结构上,差别特别大,所以我们的存储器指的就是内存,而我们对应的硬盘、U盘一般对应的是输入输出设备
(3)运算器 + 控制器
- 运算器指的是什么?
输入输出设备、存储器都没有计算能力,那计算机的计算体现在哪里?
- 运算器:对我们的数据进行计算任务
计算机中的计算种类有两种:
- 算术运算:+、-、*、/……
- 逻辑运算:&&逻辑与、||逻辑或……
- 控制器指的是什么?
例如:我们要运行一个程序,什么时候把数据从输入设备读到存储器,什么时候把数据从存储器读到中央处理器,中央处理器运算完后什么时候把结果写入存储器,什么时候把数据从存储器写入输出设备,这是谁在统一控制、统一协调?
- 控制器:对我们的计算硬件流程进行一定的控制
tip:运算器 + 控制器 ==》中央处理器CPU
(4)补充
- 输入、输出、存储器、运算器、控制器这五大硬件单元都是独立的个体!
- 这五大硬件单元要能够共同构成一个计算机,必须用“线”链接起来,这个“线”就是总线,在计算机中总线分为两类:
- 系统总线:CPU与存储器之间交互的线
- IO总线:存储器与外设(输入输出)之间交互的线
1.3 冯诺依曼结构规定了数据流向
冯诺依曼结构图:
如图:冯诺依曼不仅仅规定了硬件构成,还规定数据的流向。
数据流向:规定了数据必须先从输入设备交到内存,CPU只能从内存拿数据,不能直接从外设拿。CPU拿到数据在中央处理器内部做完计算后,不能直接把数据输出到外设,必须把计算完的结果写回到存储器,然后再将数据刷新到输出设备
- 存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入输出设备)
- 外设(输入输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取
- 一句话,所有设备都只能直接和内存打交道
tip:为什么一个程序要运行,必须要先加载到内存中运行,因为冯诺依曼体系结构规定了!
- 所有的软件设计都必须遵循它的硬件结构!
- 硬件是我们计算机的下限和边界,软件是上限和天花板,所以硬件规定的软件必须遵循!
tip:CPU与外设在数据层面不需要交互,并不代表CPU与外设彻底没有了交互,在信号控制阶段它们之间是需要交互的,后期在做讲解。
(1)为什么所有设备都只能直接和内存打交道?
- 存储金字塔,如下图:
如图,我们可知:
- 一般在存储生态中距离CPU越远的设备,他所对应的容量会越来越大,但速度会越来越慢,成本也越来越低。
- 存储是分级的——我们可以从量化的概念去理解:CPU中的寄存器存储速度一般是纳秒级别的,而内存是微秒级别的,外设是毫秒级别的,所以它们的速度代差是非常大的。
- 木桶效应:
木桶效应:木桶盛水量的多少,取决于构成木桶的最短木板的长度,而不取决于构成木桶的长木板的长度。
- 为什么所有设备都只能和内存打交道?
了解了存储金字塔,我们就知道了为什么所有设备都只能和内存打交道:
- 效率: 首先通过内存金字塔,我们知道CPU与外设之间的代差非常大。其次木桶效应现象也启示我们外设与CPU直接交互,那么整个计算机结构的效率就以外设的效率为主了,势必会拖慢CPU的速度,导致计算机的整机效率变得非常低下,所以我们就引入了存储器,存储器速度适中、容量适中。
- 价格: 内存的价格也相较适中。
tip:虽然冯诺依曼的数据流向动作是串行的,但CPU的计算可以和存储器到外设的读取可以同时进行(预加载——一般在CPU去内存读取数据计算的时候,输入设备已经把数据提交预加载到了内存),这样就可以从串行变成了并行
存储器:
- 硬件级别的缓存空间!
- 在冯诺依曼中占据核心地位!
(2)详细讲解你登录QQ和朋友聊天的数据流向
你和你朋友聊天的时候的整个数据流向:
数据流向如上图所示。因为你们的电脑都是冯诺依曼,所以软件QQ聊天的数据流向要遵循冯诺依曼的数据流向。
二、操作系统
1. 引入
在冯诺依曼体系结构中所有的硬件设备都很笨,只为我们提供了一些基本的功能。
例如:输入设备键盘,它就只具备获取输入数据,把数据写入到内存的能力,但什么时候用这个能力,我们该怎么用——这个需要一个控制逻辑在上面的。
这个控制逻辑就类似一个产品流水线,硬件就像流水线上的工人,但是需要有人统筹管理这些工人。
在这样的需求下,我们的操作系统就诞生了。
操作系统是一款进行管理的软件!
- 管理软件和硬件
2. 概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包含:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,Shell程序等等)
想要理解OS,我们要抱着以下三个问题去理解:
- 为什么要设计OS?
- OS是什么?
- OS是怎样管理的?
3. 设计OS的目的
在讲解之前,我们需要先知道计算机的结构,如下图:
如图所示:整个计算机,是一个层状结构。从中我们可知道设计OS的目的
- 操作系统帮助用户与硬件交互,管理所有的软硬件资源。
- 为了给用户(这里指的是程序员,不是普通用户,普通用户使用程序员开发的程序。)提供一个良好(稳定、高效、安全)的运行环境。
综上:操作系统通过管理好底层的软硬件资源(手段),为用户提供一个良好的运行环境。(目的)
tip:系统调用和库函数
系统调用:
- 操作系统里面会有各种数据,可是操作系统不相信任何用户!但它又不得不给我们提供服务,所以就引入了系统调用。(类比我们现实中的银行,它也不相信任何用户,所以它使用玻璃将我们与银行工作人员分开,但它又得给我们提供服务,所以在每个柜台有一个小的窗口。)
- 即操作系统为了保证自己数据安全,也为了保证给用户能够提供服务,操作系统以接口的方式给用户提供调用的入口,来获取操作系统内部的数据。
- 这些接口是操作系统提供的,用C实现的,其本质就是C函数
- 系统调用:在开发角度,操作系统对外会表现为一个整体,但会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
- 所有访问操作系统的行为,都只能通过系统调用完成!
库函数:
- 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有些开发者对部分系统调用进行适度封装,从而形成库(用户操作接口),有了库,就很有利于更上层用户或者开发者进行二次开发。
系统调用 VS 库函数:
- 我们C语言中调用库函数printf打印数据,是直接调用硬件打印的吗?——答案当然不是,因为操作系统不相信任何人,只能调用操作系统提供的接口。
- 库函数与系统调用是上下层的调用和被调用的关系!
- 语言基本都在操作系统之上
4. OS的定位(OS是什么?)
- 在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
5. 如何理解“管理”
5.1 管理的例子——大学
在实际生活中要管理一件事情,其实就分为两种:
- 决策
- 执行
以大学为一个管理的例子,大学都有校长、辅导员、学生。校长要管理学生,但在实际中学生基本都没看到过校长,校长就是一个决策者,通过辅导员执行者,来管理学生。
在这个管理的例子中,校长对应操作系统,辅导员对应驱动程序,学生对应软硬件资源。
tip:通过这个例子我们知道管理的本质就是对数据的管理
- 管理者和被管理者是不需要见面的
- 管理者在不见被管理者的情况下,如何做好管理?——管理者只要能够得到管理信息,就可以在未来进行管理决策——管理的本质就是对数据的管理
- 管理者和被管理者面都不见,怎么拿到管理数据的?——通过执行者
我们知道了管理的本质就是对数据的管理,那在计算机中是如何管理数据的呢?——建模:先描述,再组织
在计算机中我们要管理数据,需要先描述——例如:我们上面例子中的校长,他要管理学生的数据,在学校中学生数据是有很多,不好管理,所以校长可以将这些学生先描述起来,即提炼学生所有的公有属性,定义成struct结构体。//描述学生对象 struct student { char 学院[]; char 专业[]; …… struct student *next; }
描述完之后,再组织——如上我们在描述学生对象的时候,定义了一个next指针指向下一个学生,即使用单链表来管理学生数据。通过学生链表的组织,我们成功的将对学生的管理工作转换成为了对链表的增删查改!
tip:在计算机中管理数据的核心理念都是先描述,再组织
- 描述:描述被管理对象(即将被管理对象的所有公有属性提炼出来)——在C语言中,我们使用struct描述对象
- 组织:组织被管理对象(即将被管理对象使用某一种数据结构组织起来管理)——将对管理对象的工作转换成为对某种数据结构的增删查改
- 在操作系统中,管理任何对象,最终都可以转化成为对某种数据结构的增删查改(操作系统中,注定了,一定存在大量的数据结构)
tip:为什么我们通过属性就可以描述出对象?
- 因为我们人就是通过属性来认识一个事情或者对象的。例如:警察在描绘嫌疑人的画像的时候,都是通过嫌疑人的身高、体重、眼睛、头发等属性特征来描绘的。
- 当属性够多时,这一堆属性的集合,就是目标对象。
5.2 总结
计算机管理硬件
- 管理的本质就是对数据的管理
- 管理数据的核心理念:“先描述,再组织!”
- 描述起来,用struct结构体
- 组织起来,用链表或其他高效的数据结构
三、进程
1. 基本概念
- 课本概念:
- 程序的一个执行实例,叫做进程
- 正在执行的程序,叫做进程
- 一个已经加载到内存中的程序,叫做进程(进程也可以叫做任务)
- 虽然在课本概念上有很多说法,但其本质是都是一样的,只不过是多种描述
2. 理解进程
- 根据冯诺依曼体系结构我们知道一个程序要运行,必须要先把程序的二进制文件加载到内存中
- tip:一个程序无非就是以数据和代码构成的,但不论数据还是代码,在宏观意义上的数据,因为他们归根结底不都是二进制嘛
- 程序只要加载到内存中就可以了吗?——当然不是,因为在操作系统中不仅仅只能运行一个进程,还能同时运行多个进程,所以这就意味着操作系统必须要将进程管理起来!
- 操作系统如何管理进程?——先描述,再组织!
2.1 描述进程 - PCB
任何一个进程,在加载到内存,形成一个真正的进程时,操作系统,要先创建描述进程(属性)的结构体对象——PCB,process control block——进程控制块。
PCB(process control block):进程属性的集合——把进程属性信息放到一个叫做进程控制块的数据结构中
Linux操作系统下的PCB是:task_struct
综上:进程 = 内核PCB数据结构对象 + 该进程的代码和数据
2.1.1 task_struct - PCB的一种
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含进程的信息。
2.1.2 task_struct内容分类
- 标示符: 描述本进程的唯一标示符,用来区别其他进程
- 状态: 任务状态,退出代码,退出信号等
- 优先级: 相对于其他进程的优先级
- 程序计数器: 程序中即将被执行的下一条指令的地址
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
- 其他信息
2.2 组织进程
我们已经知道了Linux操作系统使用task_struct描述进程,它里面包含着描述该进程的所有属性值。所以操作系统管理进程是对task_struct进行管理,并不是对它的代码和数据进行管理(task_struct中包含一个指针信息属性指向该进程的代码和数据)。
再组织: 所有运行在系统里的进程都以task_struct链表的形式存在内核里,此时对进程的管理就变成了对链表的增删查改!
tip:操作系统对进程的管理本质上都是对进程属性PCB的管理!
帮助理解:例如HR招人,是对我们的简历进行筛选,并不是把所有人叫到一起进行筛选,筛选好了简历,再通过简历找到人。这里的简历相当于PCB,人相当于代码和数据。
2.3 小结:具体Linux是怎么做的
- 描述:PCB——task_struct结构体,里面包含进程的所有属性
- 组织:Linux内核中,最基本的组织进程task_struct的方式,采用双向链表组织的
- tip:PCB不仅仅属于双向循环链表,还有可能有其他链式属性,如队列。(了解)