目录
冯洛伊曼体系
现在的计算机,大多遵守冯洛伊曼体系结构:
存储器: 分为外存和内存,用来存放数据和程序(使用二进制方式存储)
运算器: 主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中
控制器: 主要用来控制和指挥程序和数据的输入运行,以及处理运算结果
输入设备: 用户对计算机发号施令的设备,常见的有键盘,鼠标等
输出设备:计算机给用户汇报结果的设备,如打印机输出,显示器输出等注:
运算器 和 控制器 合为 中央处理器(CPU)
针对于 存储空间 : 磁盘 > 内存 >> CPU
针对于 数据访问速度 : CPU >> 内存 > 磁盘
操作系统(Operating System)*
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等.
操作系统由两个基本功能:
1) 防止硬件被时空的应用程序滥用;
2) 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
进程
认识进程
在操作系统内部,进程是操作系统进行资源分配的基本单位.
想要让一个进程运行起来剧需要给它分配一些资源:cpu,内存,磁盘,网络,....
我们写的代码,最终的目的都是要跑起来的,都是要成为一些进程的.
对于java代码来说,最终都是通过java进程跑起来的(此处的java指的是jvm).
操作系统如何管理进程
计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。
对于管理进程来说:
1. 先描述一个进程,明确进程的一些相关属性.例如c语言中的结构体,java中的类:
struct PCB{
//......
}
class PCB{
// 进程的唯一标识 —— pid;
// 进程关联的程序信息,例如哪个程序,加载到内存中的区域等
// 分配给该资源使用的各个资源
// 进度调度信息(留待下面讲解
}
这样每一个PCB对象就是一个进程.
2.再组织若干个进程(使用一些数据结构,把很多进程的描述信息给放在一起,方便增删查改)
典型的实现就是使用双向链表来把PCB对象给串起来.
所谓的"创建进程",就是先创建出PCB再把PCB加到链表中
所谓的"销毁进程",就是在链表中找到PCB,再把它删除
所谓的"查看任务管理器",就是在遍历链表
进程控制块(PCB)
一个PCB对象就是一个进程(指一个进程只有一个线程的情况下),
PCB中有哪些属性:
1.PID,进程的唯一标识,相当于身份证号,不会存在两个相同的PID
2.内存指针
指明这个进程要执行的代码在内存的哪里,以及这个进程执行依赖的数据在哪里
3.文件描述表
4.进程的调度信息
包括进程的状态,进程的优先级,进程的上下文,进程的记账信息.
操作系统的并发和并行
像我们现在的windows系统,同一时刻很多进程都在运行,如网易云,QQ,画图板,ps,idea等,我们系统上的进程数量有几十个甚至上百个,但我们的cpu只有那么几个,那么这是怎么做到的呢?就是依靠进程调度.
并行:在微观上,两个cpu核心同时执行两个进程,宏观上也是同时执行
并发:微观上,一个cpu核心先执行一会进程1,再执行一会进程2,再执行一会进程3,只要切换的够快,宏观上看起来就是很多进程一起 在执行.
注:
并行和并发只在微观上进行细分,宏观上我们也不能确定是并行还是并发,例如手机分屏
进程调度信息
进程的调度
所谓的调度就是"时间管理",操作系统就是一个时间管理大师.
举个例子:
进程的状态
进程的状态就描述了当前这个进程该怎么调度
就绪状态:随时可以去cpu上运行的状态
阻塞状态:暂时不可以去cpu上运行
(以上为java中的进程状态,Linux中的进程状态还有很多)
举个例子(还是上面那个):
进程的优先级
优先级通俗易懂的说就是给哪个进程先分配给哪个进程后分配,以及分配的时间长短.
举个例子(....):
进程的记账信息
记账信息就是统计每个进程,都被分别执行了多久,执行了那些指令
分别排队了多久
给进程调度提供指导依据的
举个例子:
进程的上下文
举个例子:
进程的通信
进程的调度,其实就是操作系统在考虑cpu资源如何分配给各个进程~
出来cpu资源,还有内存资源呢~
那么内存资源又是怎么分配的呢?
这就依仗了虚拟内存空间~
举个例子:
解决方案就是,把这个道路分开,划分出更多的道路,这些道路之间,彼此隔开,每个人各自走各自的道路就行了.
但有个问题,虽然现在进程之间已经通过虚拟内存地址空间,已经彼此隔开了,但在实际生活中,进程之间有的时候还是需要进行相互交互的~
比如:
类似的,咱们两个进程之间也是相互隔开的,不能直接进行交互~
操作系统就提供了类似的公共空间,进程A把数据放到公共空间,进程B再取走
进程的学习告一段落~~