多线程(一):通俗易懂的理解线程和进程

目录

计算机常识

什么是程序?

什么是进程?

什么是线程?

如果理解线程切换?

程序和CPU的常识

线程切换过程

普及几个线程面试题,和以上说过的知识相关

1.单核CPU设定多线程是否有意义?

2.工作线程数是不是设置越大越好?

3.工作线程数(线程池中的线程数量)设定多少合适?


计算机常识

计算机中有两大重要的组件,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的时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值