【JavaEE】认识计算机(二)
碎碎念: 对于本文所涉及的知识点,作者暂时只做了解,不算完整,会补的会补的(咯咯咯)~~
一、CPU执行程序(指令)过程
指令就是CPU能够理解并执行的“命令”,是软件与硬件之间的沟通语言
例如:妈妈让你去买瓶可乐做鸡翅,对你来说买可乐这就是一条指令
指令包含操作码和操作数,也就是
指令 = 操作码 + 操作数
那么CPU是如何执行指令的呢?
CPU对于一条指令的处理过程可以简要描述为以下四个步骤
- 读取指令——从内存中读取下一条要执行的指令,送入 CPU 的指令寄存器暂存
- 译码指令——指令译码器解析指令的含义,确定要执行的操作及操作对象
- 执行指令——运算器根据译码结果,执行具体操作
- 写回指令——将执行结果保存到指定的寄存器或内存中,为下一条指令做准备
还是上面的例子,妈妈给你十块钱让你去买瓶可乐(读取指令),你接过这十块钱并准备去买可乐(译码指令),去楼下超市拿了瓶可乐并付钱,老板找还六块钱(执行指令),你拿着可乐和零钱回家(写回指令)
二、操作系统
操作系统是计算机中最重要的软件,抽象来说,它是一个搞管理的软件
操作系统有两个基本功能
- 管理各种硬件设备(通过驱动程序间接管理)
- 给应用程序提供一个稳定的运行环境
稳定的运行环境就是指,计算机中的各种应用程序在工作过程中是互不干扰的,即使某一个程序出现问题(比如程序崩溃),也不会影响其他应用程序的运行
2.1 进程
进程,顾名思义,就是一个正在进行的程序
操作系统如何管理进程?
主要分为两步
- 定义数据
- 组织数据
定义数据:定义一个结构体/对象,通过对象的各种属性,保存进程的各种信息
这里会用到一个进程控制块(PCB),它是一个非常大的结构体,包含很多属性
组织数据:采用数组、链表、哈希等数据结构集中存储,方便后续增删查改
对于LInux系统,它使用链表的形式将很多PCB串到一起
那么如何创建一个新的进程呢?
- 创建一个PCB,初始化PCB中的各个属性
- 将创建好的PCB添加到链表上
和链表节点的处理方法相似,要销毁一个进程,就要在链表上把这个PCB找到,然后从链表上删除
同样的,想要查看某个进程的信息,就要先在链表上找到对应的PCB,并将其显示到界面上;若想查看所有进程,则要取出链表上的每个元素并显示到界面上
PCB中主要属性
- pid(也叫进程id),是进程的身份标识符
- 内存指针(实际上就是一组指针),进程通过这组指针获得执行的指令和以来数据的位置
- 文件描述符表,进程运行过程中需要和硬盘进行交互,而硬盘上的数据是以文件的形式来组织的,进程在读写文件的时候,就需要先打开对应文件,每打开一个文件就会把这个文件的信息保存到文件描述符表中,表中的每个项就对应着每一个打开的文件
*操作系统中,会把很多资源(不一定是硬盘上的资源)都抽象成文件来表示,比如操作系统管理网卡的时候,就是将其当作“文件”一样管理
由上述可见,进程是操作系统中资源分配的基本单位
其实这句话不够严谨,具体内容我们下节揭晓~~
既然CPU中会运行很多不同的进程,那么如何管理这些进程就成了首要问题,这就涉及到另一个概念——进程调度,换句话说,就是如何使用有限的CPU核心,完成远多于核心数的进程
进程调度相关内容也是PCB中的几个重要属性
- 进程状态,进程有很多状态,其中两个最为典型,一个是就绪状态(随叫随到),另一个是阻塞状态(说明进程当前不适合到CPU上执行)
操作系统中一般不区分就绪和执行状态,都是就绪状态 - 进程优先级,所有进程在CPU上运行的机会不是均等的,某些进程优先级更高一点,占用更多的CPU资源(进程的优先级与窗口的显示顺序无关)
- 进程上下文,由于进程调度,一个进程执行一会后会失去CPU使用权,过一段时间再回到CPU上继续执行,将沿用上次执行到的状态,继续往下执行,上次执行的状态和进展就是进程的上下文
进程在CPU上运行的过程中,CPU上的各种寄存器,就表示了当前进程运行的中间状态
保存上下文:把CPU中的这些寄存器的值保存到内存中(PCB的对应属性中)
恢复上下文:把PCB中保存的属性填写回对应的寄存器中 - 进程记账记录,统计功能,统计每个进程在CPU上运行了多久,如果发现某个进程很久没有吃到CPU资源,就会给这个进程倾斜一些资源
与多进程相似的还有一个概念:分时复用
简单来说,就是把一个单位时间分成很多份,
第一份,运行进程1的指令;
第二份,运行进程2的指令;
……
因为CPU运行速度足够快,上述的切换过程也会非常快,快到超出人类的反应时间,使人看起来感觉好像这些进程在“同时执行”一样,当然如果运行的任务实在太多了,人也是有可能感知到这个卡顿的过程
两个常见的概念
并发执行
- 一个CPU核心上,按照分时复用执行多个进程的方式,因为需要并发执行,所以操作系统需要进行进程的快速切换,也就是进程调度
并行执行
- 多个CPU核心上,同时执行多个进程的方式
程序员写代码的时候无法判断CPU是并行还是并发执行,因此并行和并发统称为并发
现代CPU运行进程时,并发和并行是同时存在的