线程(一)

进程和线程

对于程序员来说,进程和线程实在是太重要了!!!
相信同学们面试的时候总会被问到“进程和线程的区别是什么?
对于这个问题好多同学已经像背唐诗一样,深深地刻在骨子里面了,“进程是操作系统分配资源的单位,线程是CPU调度的基本单位,线程之间共享进程资源”。
但是对于上面这句话,大家真的理解了么?走过路过不要错过,这篇文章就是用通俗的解释,让大家来理解这个问题。

计算机基本组成原理

在了解进程和线程之前,我们不得不谈到计算机的基本组成,CPU、内存、显卡、硬盘、键盘、鼠标等等设备。其中最核心的就是内存和CPU。

内存

内存简单来说就是一块存储空间,用来存储数据的。

CPU

CPU是计算机的运行核心和控制核心,作用就是解释程序的指令和处理程序中的数据。我们从作用的角度去分析CPU的组成。第一个作用是解释程序的指令,做这个工作的就是PC(寄存器);第二个作用是处理程序中的数据,也就是运算,这就有了ALU(运算单元);运算数据时,就需要有临时存储数据的空间,这个就是Registers(存储单元);还有一个组成是cache,下面会讲到。

进程和线程的基本概念

当运行一个程序时,操作系统会在内存中开辟一块空间,这块空间存储的是程序的代码和数据,这就是一个进程。进程是一个静态的概念,进程是操作系统分配资源的单位。

当程序开始运行时,CPU去内存中读取指令,可以有多个不同的运行分支,每个分支就是一个线程,一般情况下,程序会有一个主线程,也就是main方法。线程是一个动态的概念,线程是CPU调度的基本单位。

一个进程可以有多个进程,进程的资源是在内存中的一块空间,所有线程都可以拿到。但是,线程是CPU调度的基本单元,每个CPU有自己的Registers(存储单元)。线程之间共享进程资源。

线程切换

一个线程往往对应一个CPU,只考虑单核CPU时,只有一个CPU时,在同一时刻只能运行一个线程,那么有必要写多线程么?
有必要,原因是:一个线程并不是所有的时间都需要使用CPU的,如果一个线程当前在做网络传输,并没有运算,也就是线程在等待的时候,CPU完全可以将其他的线程切换进来。当CPU将一个线程切换进来运行时,上一个线程运行的指令位置需要记录下来(总不能从头再运行一遍吧[手动狗头]),记录这些信息的就是cache。线程切换时,将上一个线程的运行位置存到cache中,以便再次运行的时候可以获取到指令位置。

超线程 线程撕裂者

多线程一定比单线程快么?执行效率不够的时候,线程数线性增长,效率是不是线性增长的?
不是的,线程数量特别多的时候,线程切换也需要大量资源。

大家应该听过,4核8线程,超线程,线程撕裂者这些词汇。是什么意思呢?
4核8线程,可以将理解为一个CPU,一个CPU可以运行两个线程,实现方案就是一个CPU中有两套寄存器和存储单元,一套运算单元。好处就是,当我们切换线程的时候,不需要cache了,直接切换线程就可以了,减少了资源的浪费。

举个小栗子,整容医生在做手术,有两个病人,一个整鼻子,一个整嘴巴,医生并不需要时时刻刻在病人身上动刀,不动刀的时候,资本家就觉得浪费了医生资源,要让医生一直忙起来。一个CPU可以运行一个线程,就可以理解为,先给第一个整鼻子,当不需要动刀时,把第一个拿到一边,第二个进来整嘴巴。一个CPU可以运行两个线程,可以理解为,左右两张病床,两个人,第一个不需要动刀时,一转身,就去做第二个。

我们常说的程序效率高,运行效率高是什么意思呢?就是充分利用CPU。

如何选择线程池的核心线程数?
大部分的答案都是IO密集型任务(2n+1),CPU密集型任务(n+1)。其实并不绝对是这样的。
理论上,看计算时间和等待时间的比值,计算多少个线程可以占满CPU。每个线程有四分之一的时间在运算,有四分之三的时间在等待,那么就需要四个线程能够占满整个CPU。
实际过程中,压测,所有的程序和操作系统本身都会对结果产生影响,首先根据计算和经验设定一个初始值,在压测的过程中进行调整。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值