本篇博客给大家带来的是与计算机相关的知识点, 包括:计算机的组成, 指令, 进程(重点).
文章专栏: JavaEE初阶
若有问题 评论区见
欢迎大家点赞 评论 收藏 分享
如果你不知道分享给谁,那就分享给薯条.
你们的支持是我不断创作的动力 .
1. 计算机的组成
1.1 计算机的发展史
计算的需求在⼈类的历史中是⼴泛存在的,发展⼤体经历了从⼀般计算⼯具到机械计算机到⽬前的电
⼦计算机的发展历程。
⼈类对计算的需求,驱动我们不断的发明、改善计算机。⽬前这个时代是“电⼦计算机”的时代,发
展的潮流是:更快速、更稳定、更微型。计算机的以后将如何发展,期待⼤家的努⼒。
推荐书籍: 《计算机简史》: https://book.douban.com/subject/35043034/
1.2 冯诺伊曼体系
现代的计算机, ⼤多遵守 冯诺依曼体系结构
• CPU 中央处理器: 进⾏算术运算和逻辑判断.
• 存储器: 分为外存和内存, ⽤于存储数据(使⽤⼆进制⽅式存储). 如: 硬盘,U盘
• 输⼊设备: ⽤⼾给计算机发号施令的设备. 如: 键盘, 鼠标, 麦克风
• 输出设备: 计算机个⽤⼾汇报结果的设备. 如: 显示器, 打印机
2. 指令
CPU是计算机的中央处理单元,而指令是CPU执行任务的最小单元.
一个 CPU 设计的时候, 就会提供一些可以进行的操作(支持哪些指令)
比如,加法指令,读取内存指令,写入内存指令,条件判定/跳转指令,函数调用指令,堆栈操作指令…
cpu 是一个铁憨憨~~
你给它发布一个任务,就需要你把任务拆分成非常细致的每个部分,才能让它执行.
比如: 小陈爸爸让CPU小陈去楼下买一瓶酱油.
CPU小陈就需要向前走10步到楼梯口, 按下电梯开关, 进电梯…
这些最小单元,都是由 二进制 的方式来表示的(机器语言).
不同的 cpu 支持的指令/机器语言是不相同的.
3. 操作系统
操作系统是⼀组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
3.1 操作系统的作用
操作系统本质上都是用来搞管理的软件
3.1.1 对下管理所有的硬件设备
对下管理所有的硬件设备,但是操作系统不可能认识所有的硬件设备.但是,操作系统知道,市面的硬件设备就这么几个大的类别,每个大类别下面的硬件设备大概都有哪些功能~~
硬件厂商就需要在开发硬件的时候,同时开发一个驱动程序(软件),专属于这个硬件设备,让操作系统通过这个驱动程序完成对硬件设备的控制.
3.1.2 对上要给软件提供稳定的运行环境
一个计算机上可以运行多个程序, 这些程序相互独立,互不干扰.
这个作用涉及到了进程的隔离性.
3.2 操作系统的内核与应用程序
内核中有着操作系统最核心的功能,硬件的驱动程序都是在系统内核执行的.
内核需要给很多应用程序提供支持, 利用API 管理应用程序, 不同的系统提供的API不同,这对Java程序员不是很友好, 好在JVM将系统API 封装好了, 只需利用系统API, 便可实现跨平台.
4. 进程/任务(process/task)
操作系统内核中涉及到很多的关键性的概念, 进程只是其中一个, 由于进程和Java程序员写代码密切相关, 故此重点介绍进程.
4.1 进程的概念
1. 已经跑起来的程序就叫进程.
上图是一个应用程序,但不是一个进程,因为它当前并没有运行.
2. 每个进程都是系统分配资源的基本单位, 每个进程想要执行都需要消耗一定的系统资源(硬件资源).
4.2 进程的管理
从两个角度来看
1.描述: 使用类/结构体, 将被管理对象的各个属性都表示出来.
2.组织: 使用数据结构,把这些对象串起来,为了后续的增删查改.
系统中有一个专门的结构体PCB(系统内核由C/C++写的)来描述进程的属性. 这个结构体统称为"进程控制块"PCB.
进程可以用一个或者多个PCB来表示.
系统中会使用类似于双向链表这样的数据结构来组织多个PCB
创建新的进程,就是创建 PCB 并且把 PCB 插入到链表中
销毁进程,就是把 PCB 从链表上删除并释放
展示进程列表,就相当于是遍历链表的每个节点~~
4.2.1 PCB中的属性
想要进一步了解进程的详细特性, 还需讨论一下PCB中的属性.
PCB是一个非常庞大的结构体. 包含很多属性. (去翻Linux操作系统源码就能看到,Linux中的PCB以task_struct命名.)
1. pid, 进程身份标识. 每个进程都会有一个pid, 同一时刻,不同之间的pid是不同的.
2. 内存指针(一组属性):
每个进程在运行的时候,都会分配一定的内存空间,
这个进程的内存空间,具体是在哪里,以及分配的内存空间中有哪些部分,每个部分的有什么功能. 由这么一组指针来进行区分.
最典型的,进程的内存空间,需要有专门的区域存储要执行的指令,以及指令依赖的数据,同时还需要存储一些运行时产生的临时数据~~
C语言的程序,一些代码/函数
例如: .exe程序就包含了一些二进制指令. 双击 exe,系统就会读取可执行文件的内容
加载到内存中, cpu 才能从内存中取走指令并 进行指令的执行.
3. 文件描述符表, 它类似于数据结构中的顺序表, 存储了很多元素. 文件描述符表和文件(硬盘)有关,描述了进程关联了哪些文件,都能操作哪些文件.
文件描述符表描述了进程持有的"硬盘资源"是什么样的 , 一个进程涉及到硬盘操作, 就需要按照文件的方式来操作.
4.3 进程的分时复用/并发执行
4.3.1 单核CPU
早期的操作系统是一个"单任务操作系统",同一时刻只有一个进程能运行,运行下一个进程,就会退出上一个. 例如早期手机: 诺基亚,摩托罗拉(不需要考虑调度).
一个进程要执行,就是需要 cpu 来执行这上面的指令. 早期的电脑,还是单核 cpu, 一个 cpu 核心同一时刻,只能执行一个进程的指令.
如果把cpu比作舞台, 那进程就是演员,指令就是剧本. 分时复用就是多个进程轮流到cpu舞台演出, 一个进程演员演一会下来,另一个进程就上台接着演. 由于进程演员之间轮转调度太快了,所以肉眼看起来进程演员就像在同时表演,这就是并发执行.
如果两个进程同时在两个cpu核心上,微观上也是"同时执行",这个情况称为“并行”.
在一个cpu核心上,通过快速轮转调度的方式,执行多个进程,宏观上是"同时执行”,微观上有先有后,这个情况称为"并发". 从编程角度来说,底层是并发还是并行,对代码没啥影响… 平时也就会统一使用"并发"来代指 并行 和 并发.并把这样得编程称为并发编程
5. PCB对进程调度的支持
PCB 中引入了一些属性,用来支持操作系统实现 进程调度 的效果
5.1. 进程的状态
1. 就绪状态: 有两种情况,第一种: 进程随时准备着, 随时可以去cpu上执行. 第二种: 正在cpu上执行了.
2. 阻塞状态: 某个进程不具备某种执行条件导致这个进程暂时无法参与cpu的调度执行.
进程还存在很多种状态,在此只介绍上述两种.
5.2 进程的优先级
操作系统在调度多个进程的时候并非是一视同仁,有些进程会给更高的优先级.
比如: 我的电脑上同时运行 LOL(优先级更髙)和 QQ(优先级更低), 这样才能更好地调配系统资源
5.3 进程的上下文
进程从 cpu 离开之前,需要保存现场,把当前 cpu 中各种寄存器的状态,都记录到内存中.等到下次进程回到 cpu 上执行的时候,此时就可以把保存的这些寄存器的值,恢复回去. 进程就会沿着上次执行到的位置,继续往后执行! 其实就是我的世界里的存档和读档.
5.4 进程的记账信息
通过优先级机制,对不同的进程分配了不同权重的资源.有可能会出现极端的情况,所有的资源都给某个进程,其他进程一点都没捞着. 为了避免这种情况,记账信息,会记录当前进程持有 cpu 的情况
可以作为操作系统调度进程的参考依据.
本篇博客写的内容偏基础, 重点掌握进程和指令.
博客到这里也就结束啦, 感谢各位宝子的观看, 如果觉得对你有用,别忘了点赞+收藏哦, 嘻嘻嘻.
期待与你的下一次相遇!