1.计算机是如何工作的?
1.1计算机的构成
现代的计算机, 大多遵守冯诺依曼体系结构.
1.2冯诺依曼体系结构
CPU 中央处理器
:进行算术运算和逻辑判断.
存储器
分为外存和内存, 用于存储数据(使用二进制方式存储)
内存、外存(硬盘、U盘、光盘、软盘…),之前写的代码都是在内存中。
内存 VS 外存对比:
1.内存小,外存大
2.内存的制作工艺高因此比较贵,外存成本低
3.内存操作速度快(纳秒级别)、外存操作速度慢(微秒级别),一纳秒等于 10 的 -9 次方,一微秒等于 -3 次方,相差好几个数量级。
4.内存重启之后数据丢失,外存数据会永久保存(除非人为删除)。
输入设备
用户给计算机发号施令的设备.
输出设备
计算机个用户汇报结果的设备.
关于存储空间
硬盘 > 内存 >> CPU
关于数据访问速度
CPU >> 内存 > 硬盘
2.硬件—CPU 是如何工作的?(了解)
2.1 CPU 定义和组成
CPU 也称为微处理器,是计算机的心脏和/或大脑,它的主要工作是执行算术和逻辑运算并将指令编排
在一起。
CPU 有两个主要组件:
- 算术和逻辑单元 ALU(Arithmetic & Logic Unit)
- 控制单元 CU(Control Unit)
2.2 算术和逻辑单元 ALU
ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑。
算术和逻辑单元又分为:
算术单元
逻辑单元
2.2.1 算术单元
算数单元,负责计算机里的所有数字操作,比如四则运算、或 8 位(bits)的加法器(adder)。
要理解 8 bits 的加法器,我们需要了解一些前置知识,比如以下这些。
① 电子开关
通过电子开关我们可以实现 1 位(bit) 的逻辑运算,它是实现如下:
② 门电路
门电路可以实现 1 位(bit) 的基本逻辑运算,如下图所示:
③ 进制相加的特点
④ 半加器
通过前面的前置知识,我们就可以通过半加器实现两个 1 bit 数的相加了,如下图所示:
⑤ 全加器
而
通过半加器我们就可以实现全加器了,也就是进行 3 个 1 bit 数的相加了,如下图所示:
并且我们也可以实现 8 bit 的加法器了,如下图所示:
能够实现加法器,也就能实现减法操作和乘法操作已经除法操作了。
●减法器就是加一个负数 +(-n)。
●乘法器就是 N 个数相加,比如 3*3=9 就是 3+3+3=9。
●除法器是 N 个数相减,比如 24/8=3 就是 24-8-8-8=0 结果就是 3(3个8连减,最后为0)。
2.2.2 逻辑单元
逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较。
2.2.3 寄存器(Register)和内存(RAM)
光有 ALU 还是远远不够的,我们还要为 ALU 提供存储的部件。
存储的前置知识是门锁,如下图所示,利用门锁可以实现 1 bit 的存储:
使用门锁就可以实现寄存器。
2.3 控制单元 CU(Control Unit)
我们现在有 ALU、存储了,但这还是不足以让我们的计算机工作起来,我们需要有一个部件来指挥 ALU 进行何种的运算,而这个部件就是控制单元(CU)。
指令按顺序存储在 RAM 中,控制器通过读取将指令,并通过算术逻辑单元进行执行。以上内容就是最基本的 CPU 运行的基础知识了。
3.软件
计算机除了硬件之外最重要的资源就是软件了,而系统中最大、最重要的“软件”就是操作系统了。
3.1 操作系统(Operating System)
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
3.2 进程(PCB)
3.2.1 进程的本质
1.PID:进程ID 进程ID并不是固定不变的,他是每次启动进程时动态分配的。(身份的唯一标识)
2.进程状态
●新建状态 New
●就绪状态
●运行状态
●阻塞状态
●销毁状态
3.优先级:
决定进程的执行顺序。
4.记账信息:
为了保证进程执行的相对公平,他记录CPU调用的次数和执行间隔,为进程调度器提供数据支持。(可以规避进程饿死)
5.上下文:
保存本次的执行状态,以便下次继续执行,整个过程就称之为一个上下文。
6.一组内存:
指定进程需要使用的资源。
3.2.2 进程关联的重要概念
时间片:每个进程得的 CPU 执行的时间叫做时间片。
内核态和用户态:内核态表示操作系统作为最底层的软件拥有最高的权限就叫做内核态,用户态指用户编写的程序。
3.3 线程
线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在 Unix System V 及 SunOS 中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
3.3.1 线程优势
线程的创建和消耗比进程成本低很多,效率更高,**而且同一个进程中的多个线程是可以共享资源文件的,而进程和进程之间是不能共享资源的,**因此这就是线程的诞生的意义。
线程间可以共享的资源:
- 内存可以共享
- 打开的文件可以共享
线程间不可用共享的资源:
1 线程的上下文、状态、优先级、记账信息不共享。
2.每个线程有一个栈空间不共享。
3.线程可以理解为一个轻量级的“进程”。进程是操作系统资源分配的最小单位,线程是操作系统执行和调度(运行)的最小的单位
3.3.2 进程 VS 线程
① 单进程单线程
② 多进程单线程
③ 单进程多线程
④ 多进程多线程
进程和线程的区别主要体现在以下几点。
区别1:从属关系不同
从属关系不同:进程是正在运行程序的实例,进程中包含了线程,而线程中不能包含进程。
区别2:描述侧重点不同
描述侧重点不同:进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位。
区别3:共享资源不同
共享资源不同:多个进程间不能共享资源,每个进程有自己的堆、栈、虚存空间(页表)、文件描述符等信息,而线程可以共享进程资源文件(堆和方法区)。
区别4:上下文切换速度不同
上下文切换速度不同:线程上下文切换速度很快(上下文切换指的是从一个线程切换到另一个线程),而进程的上下文切换的速度比较慢。
区别5:操纵者不同
操纵者不同:一般情况下进程的操纵者是操作系统,而线程的操纵者是编程人员。
3.3.3 线程不是越多越好
否,如果创建的线程过多就会造成“狼多肉少”的情况,也就会造成恶意争抢和线程过度调整的问题,反而会减低线程的执行效率。
同一时间可以运行线程的 CPU 是固定的,如果超过了最大值,其他的只能排队处理,这样就起不到多的作用了,并且线程的调度也需要消耗时间,因此并不是线程越多越好。
线程的数量和两个因素有关系:
1.CPU 的数量。通常数量为CPU 的数量-1
2.任务的类型,计算密集型任务/IO 密集型任务(要深度使用 CPU),如果是计算密集型任务线程数量约定于 CPU 数量,如果是 IO 密集型任务(不太用 CPU 资源),原则上是线程数量越多越好。
总结
1.冯诺依曼体系结构
2.硬件 CPU 是如何运行的重要概念:算术和逻辑单元 ALU(电子开关、门电路、半加器、全加器)、控制单元 CU。
3.操作系统
a.进程
b.线程
c.进程 VS 线程
d.线程不是越多越好