1. 计算机工作原理
1.1 生活中常见的计算机
计算机分为通用计算机和专用计算机,计算机并不单单指的是电脑,还有我们平时使用的手机,ipad,智能手表等终端设备都是计算机.还有我们用户不常见的计算机,比如服务器. 还有许多嵌入式设备(针对特定场景定制的"专用计算机"),都是计算机.
1.2 冯诺依曼体系
现代的大多数计算机都遵守冯诺依曼体系结构.
简述上述过程就是:输入设备为存储器(内存和外存)输入数据,存储器向CPU发号施令,提醒CPU处理数据,CPU则会把存储设备中的数据读取过来,进行一系列处理,再放入存储设备中.之后通过存储设备输出到输出设备中.
下面我们介绍各个部件的主要功能:
- CPU中央处理器: 主要进行二进制算数运算和逻辑判断.
- 存储器: 分为内存和外存,用于存储数据(使用二进制方式存储)
- 输入设备: 给计算机发号施令的设备.
- 输出设备: 计算机向用户汇报结果的设备.
针对存储空间:
硬盘>内存>>CPU
针对数据访问速度:
CPU>>内存>硬盘
1.3 CPU指标与核心
我们可以把CPU看做一个打工人:
- CPU的两个指标:
- CPU占用率:
描述CPU干活时间栈总时间的比例.我们可以通过任务管理器来看到它.比如CPU上班上8个小时,干4个小时的活,CPU占用率为50%.
- CPU占用率:
- CPU频率:
1秒钟,CPU处理或者执行了多少个指令.
2. 多核CPU
我们如今在市面上见到的计算机大多数都不是单核CPU,一个CPU中存在多个核心.
我们经常说的CPU几核,这指的是物理核心,CPU多少线程,指的是逻辑核心.下面我们以intel5-13500HX芯片来举例:
引入多核CPU的目的:
引入多核CPU的核心,本质上就相当于==“干活的人多了”==,只不过把这些人集中在了一个房间中,这就可以让任务的完成更高效.我们以后编程的核心就是:如何把多个任务拆分成多个部分交给不同的核心来完成."多线程"编程就是针对任务分配来考虑的软件编程,避免一核有难,多核围观的尴尬.这便是我们以后要研究的重点.
3. CPU的不同架构类型
- x86架构类型(如Intel,AMD生产的芯片大多数是x86CPU)
- arm架构类型(如Apple A17仿生芯片,骁龙888等用于移动设备的芯片大多数都是armCPU)
- x86的优点就是性能较高,但功耗较高,而arm恰恰相反.
1.4 指令
所谓指令,即指导CPU进行工作的命令,主要有操作码+被操作数组成。
其中操作码⽤来表⽰要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等.
冯诺依曼体系结构规定:
一个程序,指令和数据要在储存器中保存,CPU如果需要执行,都需要自动从存储器中去取指令和数据.即指令要先加载到内存中,才可以被CPU读取并执行.
eg:一个Java程序 -->.java -->编译 --> .class字节码文件 -->jvm -->到达内存 --> 翻译 -->CPU识别.
计算机中CPU的指令识别也有一定的规则,所以我们引入了指令表:
每个CPU被设计出来之后,都会提供这样一个指令表.这个指令表中的opcode对应的是内存数据中的操作码.就是告诉CPU要怎么做的二进制指令.操作的地址或寄存器就是告诉CPU从哪里取出被操作数(数据)并存储到哪里.
1.5 CPU的基本工作流程(重点)
- 读指令
把内存中的指令数据读取到CPU的寄存器中 - 解析指令
CPU通过指令表来解析当前指令要求它干啥 - 执行指令
注:寄存器是CPU用来保存数据的地方,一般有A,B,PC,IR四个,其中IR用来读取内存中的指令,PC用来读取内存中的地址.IR可通过PC提供的内存地址来从内存中取出指令来解析.,AB寄存器都是用来存储数据的.
下面来用图来形象地表示上述过程:
总结:
- CPU中的PC寄存器,是决定要执行那条指令的关键
- 指令是有动作+操作对象组成的.
- CPU眼中只有指令,没有其他概念.
2. 操作系统
操作系统是⼀组做计算机资源管理的软件的统称。⽬前常⻅的操作系统有:Windows系列、Unix系
列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。它们可以让计算机按照一定的规则进行执行,并管理好这个计算机上所有的硬件与软件资源,这是操作系统诞生的初心.
操作系统: 这个家没我都得散.
2.1 操作系统的定位
注:上述操作系统,可以看做操作系统内核.
那么操作系统是如何完成一个功能的呢?操作系统内核为应用程序提供了API,应用程序通过调用操作系统内核的API,来告诉操作系统内核这个进程并创建,之后操作系统内核通过与中央处理器的驱动程序,来在处理器中完成调用指令与数据.
这么说来有些抽象,我们通过银行柜台取钱的例子来解释:
- 应用程序相当于一个来取钱的人
- API相当于存折
- 取钱的人(应用程序)把存折(API)递给银行柜台的员工(操作系统),之后柜台员工(操作系统)从保险柜(处理器)中把钱取出来递给取钱的人(应用程序).
2.2 进程与任务
注意:下面谈到的进程都是只包含一个线程的进程
进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,换⾔之,可以把进程看做程序的⼀次运⾏过程;同时,在操作系统内部,进程⼜是操作系统进⾏资源分配的基本单位。
系统资源分配情况可通过系统资源管理器来查看:
但是上述的操作系统中的进程又非常多,我们就要考虑如何管理的问题了.
- 操作系统通过进程控制块抽象(PCB Process Control Block)来描述一个进程,PCB其实就是java中的一个类,操作系统底层的一个结构体成员.
- 操作系统通过一定的数据结构来把这些PCB有序地组织起来,如线性表(一般是链表),搜索树.方便增删查改.
那么这个结构体变量中有包含哪些信息呢:
-
pid: 进程的id标识符.
-
内存指针: 这是一组指针组,告诉OS,该进程的指令位于内存中的地址以及进程依赖数据的地址.
-
文件描述符表: 一个进程在运行的时候要操作的文件,PCB会通过顺序表的数据结构来记录当前进程都打开了哪些文件.
-
支持进程调度的属性:
要想解释明白这个属性,我们要先解释什么是进程调度:假设有100个进程,CPU虽然有多个核心,假设为16个,只能同时处理16个进程,这16个进程是完全同时执行,我们把他称为并行,但是如果想要执行100个,显然全部并行是远远不够的,这是CPU就会把总执行时间切为若干个小段,在这一小段的时间中,对进程频繁切换,我们称为并发执行.只不过时间非常短,人类感觉不到切换.
所以,进程的调度从微观上来讲分为两种:1. 并行: 在时间上完全同时执行. 2. 并发: 在时间上串行,但是在宏观上也是同时执行.
所以上述调度从宏观上来谈,统称并发.之后我们再来谈PCB中的第四个属性:
- 状态: 进程分为两种状态:就绪状态和阻塞状态.就绪状态就是随叫随到,阻塞状态的进程指令与数据暂时无法再CPU上执行.
- 优先级: 那个进程优先级高,就优先调用哪个进程.
- 上下文: 进程在CPU执行中,会产生许多的中间结果,进程在切换出CPU前,就需要把中间结果保存到PCB的上下文中,我们称为存档,下次进程回到CPU上时,就要把之前的存档回复回来,我们称为读档.
- 记账信息: OS要避免某个进程一直吃不到资源,所以就要进行统计,给分配的比较少的进程多分配一点.
举例:渣女小故事
一个女生同时被3个男生追:
A男生:有钱多金
B男生:颜值高,长得帅
C男生: 开心果,会给女生提供情绪价值(舔狗)
A男生比较有钱多金,所以经常出差,在平时,他可以随叫随到,是就绪状态,但是在他出差的时候,就不会随叫随到,进入阻塞状态
C男生可以提供精神食粮,其实就是会舔,女生认为精神上的安慰更实在,所以C的优先级会更高,C分配的时间就会相对较多
有一天,A男生的妈妈过生日,C男生打算去海边玩,然后女生就打算对男生A说,我买了一条红围巾,打算对C说,我买了一身性感的泳衣,由于小姐姐泡的男人太多了,看错A和C男生法的信息了,一不小心把A和C给整叉了,这就尴尬了.(C:你去海滩戴围巾??? , A:你给我妈妈买了一身性感的泳衣???)可见上下文的重要性.
哎呀~~,把咱们的B小朋友给掉了,给咱们B小朋友多分配一点时间吧,所以记账信息也会起到一定的作用.