目录
1.计算机的构成
1.1.计算机二进制
1.2.冯诺依曼体系结构
1.2.1.CPU(加工厂)
1.2.2.存储器(仓库)
1.2.3.输⼊设备(原材料)
1.2.4.输出设备(产品)
PS:关于存储空间:硬盘 > 内存 >> CPU
PS:关于数据访问速度:CPU >> 内存 > 硬盘
2.硬件—CPU 是如何工作的?
2.1.CPU 定义和组成
2.2.算术和逻辑单元 ALU
2.2.1.算术单元
2.2.2.逻辑单元
2.2.3.寄存器(Register)和内存(RAM)
2.3.控制单元 CU(Control Unit)
3.软件
3.1.操作系统(Operating System)
3.2.进程
3.2.1.进程的本质
3.2.2.进程关联的重要概念
3.3.线程
3.3.1.线程优势
3.3.2.进程 VS 线程
3.3.3.线程是不是越多越好
1.计算机的构成
现代的计算机,大多遵守冯诺依曼体系结构。
冯诺依曼体系由冯诺依曼提出,因此冯诺依曼被称为计算机之父。
冯·诺依曼(John von Neumann,1903年12⽉28⽇-1957年2⽉8⽇), 美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之⼀。冯·诺依曼是布达佩斯⼤学数学博⼠,是现代计算机、博弈论、核武器和⽣化武器等领域内的科学全才之⼀,被后⼈称为“现代计算机之父”、“博弈论之父”。
【图灵提供了理论知识,冯诺依曼提供了具体的理论实现。】
为什么说冯诺依曼是核武器和⽣化武器等领域的⼈才呢?因为它也参加了曼哈顿计划,也就是参与了造原⼦弹的制作。
故事:冯诺依曼坐⻋的时候遇到了普林斯顿⼤学的研究员,聊起了做这个话题,他们在做⼀个研究导弹轨迹的机器,但遇到了很多困难,冯诺依曼后⾯去参观并提供了著名的冯诺依曼体系,因为冯诺依曼体系结构是在普林斯顿⼤学研究并创建的,因此冯诺依曼体系结构也被称为普林斯顿结构。PS:普林斯顿⼤学最近 3 年世界排名第⼀的⼤学,数学专业世界第⼀,培养了两个美国总统,69 个诺⻉尔奖得主,爱因斯坦在普林斯顿任职。
1.1.计算机二进制
除了冯诺依曼体系结构,还有计算机的⼆进制也是冯诺依曼发明并提出的。
1.2.冯诺依曼体系结构
通常情况下,执行流程是把需要处理的数据从磁盘加载到内存,再把需要运算的数据拿到CPU处理,最后再写回磁盘。
但也不一定,是分场景程序的。
如:
- MySQL最后数据是要落到磁盘上的。但在没有真正提交事务之前,数据都是运行在内存中的;只有提交之后才会写到磁盘;
- 对于Idea程序,是将磁盘上的代码读取出来,在内存中操作,打印执行结果。操作完成后就结束了,不会将数据再写回到磁盘中。
- 像数据库redis,memcached(纯内存型数据库,当数据库打开之后,所有的数据都在内存中执行,不会写到磁盘之中)
1.2.1.CPU(加工厂)
CPU 中央处理器:包含运算器和控制器,进⾏算术运算和逻辑判断。还含有一个寄存器,可以存储一些经常使用的变量,内部又分为一级缓存,二级缓存和三级缓存。其容量非常非常小,速度非常快。
1.2.2.存储器(仓库)
分为外存和内存,⽤于存储数据(使⽤⼆进制⽅式存储)。
内存、外存(硬盘、U盘、光盘、软盘...),之前写的代码都是在内存中。
内存 VS 外存对⽐:
- 内存⼩,外存⼤。
- 内存的制作⼯艺⾼因此⽐较贵,外存成本低。
- 内存操作速度快(纳秒级别)、外存操作速度慢(微秒级别),⼀纳秒等于10^-9,⼀微秒等于10^-3,相差好⼏个数量级。
- 内存重启之后数据丢失,外存数据会永久保存(除⾮⼈为删除)。
1.2.3.输⼊设备(原材料)
键盘、⿏标、摄像头、⻨克⻛...
1.2.4.输出设备(产品)
显示器、⾳响、打印机...
有些设备既是输⼊设备⼜是输出设备,⽐如触摸屏。⽹卡既是输⼊⼜是输出设备。
PS:关于存储空间:硬盘 > 内存 >> CPU
PS:关于数据访问速度:CPU >> 内存 > 硬盘
2.硬件—CPU 是如何工作的?
2.1.CPU 定义和组成
CPU 也称为微处理器,是计算机的⼼脏和/或⼤脑,它的主要⼯作是执⾏算术和逻辑运算并将指令编排在⼀起。
PS:设备之所以能够工作是因为它有驱动(硬件设备提供了开放的端口进行操作的方法)。
CPU 有两个主要组件:
- 算术和逻辑单元 ALU(Arithmetic & Logic Unit)
- 控制单元 CU(Control Unit)
2.2.算术和逻辑单元 ALU
ALU 是计算机中进⾏算数、逻辑运算的核⼼部件,是计算机的数学⼤脑。
算术和逻辑单元⼜分为:算术单元和逻辑单元。
2.2.1.算术单元
算数单元,负责计算机⾥的所有数字操作,⽐如四则运算、或 8 位(bits)的加法器(adder)。
要理解 8 bits 的加法器,需要了解⼀些前置知识:
①电子开关——机械继电器(Mechanical Ralay)
通过电⼦开关我们可以实现 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 的存储:
使⽤⻔锁就可以实现寄存器,如下图所示:
内存的构建要⽐这个复杂⼀点,但基本原理⼀致。如此构建的内存被称为 RAM(Random Access Memory),可以⽀持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1) 的硬件⽀持。
2.3.控制单元 CU(Control Unit)
现在有 ALU、存储了,但这还是不⾜以让我们的计算机⼯作起来,需要有⼀个部件来指挥 ALU 进⾏何种的运算,⽽这个部件就是控制单元(CU)。
指令按顺序存储在 RAM 中,控制器通过读取将指令,并通过算术逻辑单元进⾏执⾏。以上内容就是最基本的 CPU 运⾏的基础知识了。
3.软件
计算机除了硬件之外最重要的资源就是软件了,⽽系统中最⼤、最重要的“软件”就是操作系统了。
3.1.操作系统(Operating System)
操作系统是⼀组做计算机资源管理的软件的统称。⽬前常⻅的操作系统有:Windows系列、Unix 系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
操作系统:
- Windows:家庭/工作常用的操作系统。优点:图形化的操作界面,所见即所得,上手简单,支持各个厂商,市场份额占比多;缺点:使用UI绘制运行,将用户的操作翻译成指令执行。消耗系统硬件内存资源,消耗性能。
- Lunix:优点:高性能,开源免费;缺点:是直接敲命令,没有多余的UI绘制,操作上手较难,得会基本命令才能玩起来。
- MacOS:优点:和Windows类似,也是图形化操作的界面,且其UI界面更加酷炫,上手效果更好。所有应用都必须通过官方审核之后才能安装,没有病毒和弹窗广告;缺点:主打高端,价格贵。只支持自家厂商开放,市场份额占比比较少。
PS:不要装360,其本身就是流氓软件;火绒安全,占用的系统资源较少,还可以进行模拟弱网环境,指定给某个应用相应的网速。
3.2.进程
进程(Process)是操作系统分配资源的基本/最小单位,⼀个进程拥有的资源有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息。 从编程的⻆度来理解进程,可以把它看作是⼀个类或⼀个 PCB (Process Control Block)进程控制块的结构体。
简单来说,将⼀个可执⾏⽂件(.exe文件)运⾏起来就是⼀个进程。 进程可以看作⼀个程序运⾏的“过程”,注意区分:程序(可执⾏⽂件)和进程:
-
程序是⼀个静态的磁盘上的⼀个⽂件。
-
进程将可执⾏⽂件加载到系统中,加载就是将信息放⼊内存中,分配⼀些资源,并且执⾏程序包含的所有指令。
3.2.1.进程的本质
进程本质就是⼀个 PCB(Process Control Block)结构体,类似于 Java 中的类,⽽这个 Java 中的类包含了:
- PID:进程ID,进程的唯⼀身份标识。 并不是固定的,它是每次启动进程时动态分配的。重启前后的 PID 是不同的。
- 进程状态包括:
- 新建状态
- 就绪状态
- 运⾏状态
- 阻塞状态
- 销毁状态
- 优先级:决定进程的执⾏顺序。可以开发者自己指定。(若是操作系统级别的进程,优先执行的概率会越大;每秒钟被分配的资源也应该更多)
- 记账信息:为了保证进程执⾏的相对公平。可以规避进程饿死的问题。(记录分配CPU的次数和执行间隔,作为CPU是否执行它的依据,而是否执行它是进程调度器(通过调度算法决定调用哪个进程)决定的,也就是说记账信息只是给调度器提供了参考信息而已)
- 上下⽂:保存本次的执⾏状态,以便下次继续执⾏,整个过程就称之为⼀个上下⽂。
- ⼀组内存:指定进程需要使⽤的资源。
3.2.2.进程关联的重要概念
时间片:每个进程得的 CPU 执⾏的时间叫做时间⽚。
内核态和用户态:内核态表示操作系统作为最底层的软件拥有最⾼的权限就叫做内核态,⽤户态指⽤户编写的程序。 程序执行往往是从用户态->内核态->用户态。
Java程序员不做进程开发,做线程开发。并发编程都是基于线程的。
3.3.线程
线程(Thread)是操作系统能够进⾏运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。(一个进程里至少要有一个线程)⼀条线程指的是进程中⼀个单⼀顺序的控制流,⼀个进程中可以并发多个线程,每条线程并⾏执⾏不同的任务。在 Unix System V 及 SunOS 中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),⽽把用户线程(user thread)称为线程。
⽐如:⼀家公司要去银⾏办理业务,既要进⾏财务转账,⼜要进⾏福利发放,还得进⾏缴社保。如果只有张三⼀个会计就会忙不过来,耗费的时间特别⻓。为了让业务更快的办理好,张三⼜找来两位同事李四、王五⼀起来帮助他,三个⼈分别负责⼀个事情,分别申请⼀个号码进⾏排队,⾃此就有了三个执⾏流共同完成任务,但本质上他们都是为了办理⼀家公司的业务。此时,我们就把这种情况称为多线程,将⼀个⼤任务分解成不同⼩任务,交给不同执⾏流就分别排队执⾏。其中李四、王五都是张三叫来的,所以张三⼀般被称为主线程(Main Thread)。
3.3.1.线程优势
线程的创建和消耗⽐进程成本低很多,效率更⾼,⽽且同⼀个进程中的多个线程是可以共享资源⽂件的,⽽进程和进程之间是不能共享资源的,因此这就是线程的诞⽣的意义。
- 线程间可以共享的资源:
- 内存可以共享。
- 打开的⽂件可以共享。
- 线程间不可共享的资源:
- 线程的上下⽂、状态、优先级、记账信息不共享。
- 每个线程有⼀个栈空间不共享。
线程可以理解为⼀个轻量级的“进程”。进程是操作系统资源分配的最⼩单位,线程是操作系统执行和调度(运行)的最⼩的单位。
3.3.2.进程 VS 线程
⼩胖吃鸡场景:
① 单进程单线程
② 多进程单线程
③ 单进程多线程
④ 多进程多线程
进程和线程的区别:
区别1:从属关系不同
从属关系不同:进程是正在运⾏程序的实例,进程中包含了线程,⽽线程中不能包含进程。
区别2:描述侧重点不同
描述侧重点不同:进程是操作系统分配资源的基本单位,⽽线程是操作系统调度的基本单位。
区别3:共享资源不同
共享资源不同:多个进程间不能共享资源,每个进程有⾃⼰的堆、栈、虚存空间(⻚表)、⽂件描述符等信息,⽽线程可以共享进程资源⽂件(堆和⽅法区)。
区别4:上下⽂切换速度不同
上下⽂切换速度不同:线程上下⽂切换速度很快(上下⽂切换指的是从⼀个线程切换到另⼀个线程),⽽进程的上下⽂切换的速度⽐较慢。
区别5:操纵者不同
操纵者不同:⼀般情况下进程的操纵者是操作系统,⽽线程的操纵者是编程⼈员。
3.3.3.线程是不是越多越好
同⼀时间可以运⾏线程的 CPU 是固定的,如果超过了最⼤值,其他的只能排队处理,这样就起不到多的作⽤了,并且线程的调度也需要消耗时间,会造成“狼多肉少”的情况,会造成恶意争抢和线程过度调度的问题,反而减低线程执行效率。因此并不是线程越多越好。
创建线程的合适数量和两个因素有关系:
- CPU 的数量,没有标准答案,根据实际的服务器的硬件配置和任务类型来定,通常比较合适的线程创建数量一般为CPU个数-1。现在JDK可以根据你的电脑情况来生成匹配的线程数。
- 任务的类型,计算密集型任务(费CPU资源),线程数量不宜太多,约等于 CPU 数量;如果是 IO 密集型任务(不费CPU资源,但是读写需要很长时间),可以适当地多创建线程。(原则上是线程数量越多越好)