从计算机底层开始进入多线程
CPU(中央处理器)
CPU最核心的东西就是算术逻辑单元ALU,他只会做加法运算,这和我们平时理解的可能会不太一样,毕竟数学不是有加减乘除嘛,实际上二进制是有一个补码的操作的.他会把所有的其他操作都变成加法操作,乘法也无非就是多次相加罢了,理论上只要有加法器,就能制造出CPU.
CPU的效率是和时钟电路挂钩的,如果这个门电路可以一秒钟开关5000次,我们就能说这个CPU在一秒钟内可以运算5000次.
机器语言的演变
最开始我们使用的语言是机器语言,他是由0和1组成的,但是由于他们的直观性以及可维护性较差,汇编语言产生了, 比如把101111000这个机器语言改成指令move,当我们在汇编语言中输入move的时候,就相当于直接输入101111000,所以说汇编语言的底层就是机器语言.
计算机的组成
ALU:算术逻辑单元,做加法运算的.
Registers:寄存器.CPU从这读取最快.
PC:程序计数器.(JVM操作步数的).
内存:电脑内存,数据是临时的,从磁盘中IO出来.
磁盘:持久性存储数据的地方.
最开始在计算机当中其实是没有内存的,所有的数据都存放在寄存器当中,然后按下电门做计算就行了.
后来内存出现了,被用来当做存储我们程序的地方,当我们双击打开一个程序比如QQ.exe,我们的磁盘会把我们的程序QQ.exe加载到我们的内存当中.
进程的演变
单进程机器之后便是多进程机器,此时进程之间是可以相互通讯相互访问对方所持有的资源的,但是有一个缺点,如果有黑客进程那么他能够轻而易举的获取所有想要获取的信息,甚至可以直接调用操作系统的专属进程,控制硬件级别的操作,这是非常疯狂的事情.
随着时间的发展,又诞生了一个机制,叫做进程之间的隔离,双方都不能互相访问
线程的出现
随着持续的发展,我们会发现在一个进程内部也有那种同时执行的需求,也就是一个进程需要同时执行多条路径,比如360需要同时进行体检和清理垃圾,这个东西就叫做线程,在这里我们可以提出一些相关的问题.
比如什么是进程? 什么是线程?
上图中被加载的QQ就是一个进程,QQ可以打开多个,这就是多个进程.
我们可以说一个正在运行着的程序就是一个进程.
线程指的是在一个进程当中可以并行执行的路径.
程序被执行过程中发生了什么?
QQ从磁盘中被加载到了内存当中,我们先找到主线程的代码,然后CPU通过总线进行读取把数据放入到寄存器当中进行运算并且再次回写到内存当中.
是不是线程数量越多,执行效率就越高?
不是的,cpu切换线程会有一个时间,如果线程数量较多的话,他会把大量的时间浪费在线程切换上面,进而导致效率不增反减.
线程切换的过程
假设PC执行到了T1线程的第二步,此时寄存器当中存放的是T1的数据,PC中存放的是执行到第二步的状态.这时候线程的执行权要交给T2了,T1的所有数据会放到缓存中进行一个保存的操作.
对于一个程序,设置多少线程合适?
得看线程占用CPU的时长密集度来判断, 有些是IO密集型,有些是CPU密集型,比如说占用1秒,不占1秒,是一个1比1的时间关系,那么这个时候就可以放2个线程在CPU当中,达到百分百占用.让我们更好的压榨CPU的性能.
超线程
又名线程撕裂者,从本身的切换线程需要从内存读取数据,到后来的超线程也就是线程撕裂者,只需要在cpu内读取对应线程寄存器就行,速度非常快.