cpu和多线程设计

cpu即中央处理器,但仅仅知道这个是远远不够的,了解cpu的原理才能够更加有助于多线程的设计。

什么是cpu

cpu内部由很多寄存器组成,大致可以分为运算器控制器
运算器顾名思义,就是对寄存器中的数据做基本的算术和逻辑运算,先将数据从内存加载到相应寄存器中,如数据缓冲寄存器(DR),再经过算术逻辑单元(ALU) 的运算,再存入相应的寄存器中,如累计寄存器(AC),之后可能会再次写入内存当中。
控制器就是控制cpu正常运行的,cpu从内存(RAM)中加载指令(是CPU进行操作的基本单元,大致包含操作对象、操作对象的地址、对操作对象进行何种操作,比如执行a+b这种操作的指令)到数据缓冲寄存器(DR)中,再写入到指令寄存器(IR),指令译码器(ID)对指令进行解析,程序计数器(PC)中保存着下一条需要执行的指令,告诉cpu下一步如何操作。
在这里插入图片描述
上图中还有两个没有介绍到:
PSW:状态条件寄存器,它保存的主要是由算术指令和逻辑指令运行或者测试的结果建立的各种条件码内容,一般分为状态标志和控制标志,结果正负,有无溢出等,知道就行
AR:这个就是保存着CPU访问内存上的那一块内存的内存地址,为啥要保存这个,因为CPU和内存速度相差比较大,所以CPU要保存着正在访问的那块内存的地址,直到内存的读写操作完成,不然,找不到之前访问的是哪个内存单元了啊

CPU其实主要就是干如下的四件事情:
从内存中读取数据,然后放到寄存器中
把寄存器中的数据写入到内存
进行数学运算和逻辑运算(加减乘除,AND,OR)
依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)

代码又是如何在cpu中运行的

其工作都可以分为5个步骤:取指令、指令译码、执行指令、访问取数、结果写回。
正常我们代码都是写在硬盘当中,如编译器中写的java代码,运行时加载至jvm即内存当中, 比如现在需要把a和b做加法运算,CPU收到这个指令(将a和b相加),就会去内存中将a和b读取,然后存放到自己的寄存器中,然后由CPU中的运算器去做加法运算,得到的结果依然放到寄存器中。

io密集型和cpu(计算)密集型以及线程数的设计

CPU密集型:会消耗掉大量的CPU资源,例如需要大量的计算,视频渲染啊,仿真啊之类的。这个时候CPU就卯足了劲在运行,这个时候切换线程,反而浪费了切换的时间,效率不高。
IO密集型:涉及到网络、磁盘IO的都是IO密集型,这个时候CPU利用率并不高,这个时候适合使用多线程。

典型的javaWeb应用就是io密集型,包含了大量的网络,数据库,缓存读取等,所以一个web应用可以同时支持很多web请求,或者异步多线程。一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行。因此从这里可以发现,对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待的这段时间内,线程可以去做其它事,提高并发处理效率。并且cpu的执行速度非常快,执行一条指令大约需要耗时1ns,但是对于内存呢?它去硬盘读取数据至少8ms,在这段时间内,CPU可以执行大约800万条指令,所以CPU能在线程进行IO时完成很多运算操作。
不过线程数也有相依的瓶颈,一个cpu在一个时间段只会执行一个线程,并且上下文切换也有代价
CPU密集型:线程数=CPU数,对于计算密集型的应用,完全是靠CPU的核数来工作。
IO密集型:线程数 = CPU核心数/(1-阻塞系数)
这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值