目录
计算机常识
计算机中有两大重要的组件,cpu和内存,这两个是我们平时执行程序最经常用的
什么是程序?
比如说QQ.exe,就是一个windows下一个很普通的运行程序。
那么我们怎么执行它呢?双击执行。
那双击执行会发生什么操作呢?由我们的操作系统找到它,找到它之后把他相关的信息load(加载)到内存中,这时候在内存中就有一个运行的QQ.exe
什么是进程?
通俗解释:内存中的每一个正在执行的文件,都是一个进程。操作系统会给每一个进程分配很多资源,比如说内存空间,文件描述符,IO的端口号等等
官方解释:操作系统进行资源分配的基本单位。
什么是线程?
通俗解释:一个程序里面不同的执行路径,就叫做一个线程。
比如说main方法,程序都是从main方法一条线往下顺序执行的,它是一条路径。如果在执行的过程中又分出其他的执行路径同时执行,那就是多线程。main方法所开启的线程称为主线程。
站在底层角度解释:QQ.exe是一个程序,把这个程序放到内存中是一个进程,怎么开始执行这个进程呢?真正开始执行的时候是操作系统以线程为最小单位开始执行的。操作系统找到我们的主线程(main方法),扔给cpu去执行,主线程如果中间开启了其他线程,就会产生线程之间的来回切换。
总结:线程是调度执行的基本单位。多个线程共享一个进程的资源,就会出现很多麻烦事。
如果理解线程切换?
程序和CPU的常识
程序有指令、数据。
CPU有几个重要的组成单元:
ALU计算单元
寄存器(registers):用来存储数据的
pc(program counter)程序计数器,也是一种寄存器,用来存储下一条指令的地址,说白了就是存储该执行哪条指令的。
所以执行一个线程的时候,指令放到pc程序计数器里,数据放到寄存器(registers)中。
线程切换过程
比如说现在有两个线程:T1、T2,执行T1的时候把T1的指令和数据放到cpu中,然后ALU计算单元对他进行计算,计算好了之后该做什么操作做什么操作。
假如说操作系统的调度算法发现T1已经执行到他该执行的时间了,把T1线程的指令和数据缓存起来(可以理解为放到内存中缓存起来),再把T2的指令和数据放到cpu中去执行,完成线程之间的来回切换。
如果这时候T2执行时间到了,该T1执行了,把T2放到缓存中去,把T1从缓存中拿出来放到CPU中就可以了。
中间需要操作系统的调度功能,这个过程也是消耗性能的。CPU其实很傻,它只管计算,其他什么都不管。
普及几个线程面试题,和以上说过的知识相关
1.单核CPU设定多线程是否有意义?
有意义,比如说主线在在做等待接受数据或者Sleep这种操作,处于一种阻塞状态,这时候他是不消耗CPU的,可以切换到别的线程来做别的事情,充分压榨CPU资源,提高CPU利用率。
2.工作线程数是不是设置越大越好?
前面说过,线程之间来回切换也是消耗资源的,比如说有4个CPU,1w个线程,那就完蛋了,CPU资源全部都消耗在线程之间来回切换了,所以并不是越大越好
3.工作线程数(线程池中的线程数量)设定多少合适?
上图来源于《java并发编程实践》,上图中写的很详细,接着上图说,我怎么知道W/C的时间呢?这个是需要把项目部署到服务器上之后,做一些统计才可以知道的,这样是比较科学的。当然可以利用profiler压测工具压测来看W/C的时间。