多线程学习---多线程理解

写在前面

大体几天时间学了些多线程,有一些理解,于是便想着写篇博客来记录一下。关于多线程我会多写几篇,偏重于自己的思路,偏向于理解。
首先需要一些基础概念(大体理解):
进程:进入内存的程序。
线程:进程的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程;一个进程中可以有多个线程,此时该进程就是多线程的程序。可以理解成进程是一个大的项目,线程是工人,一个项目至少由一个工人来完成,而一个项目也当然可以由多个工人来一起完成。
并发:交替执行
并行:同时执行
之前操作系统中学过一点多线程知识,不过忘了一些,无妨,这里也还是好理解的。

此线程非彼线程

除了程序的线程,我们平常其实接触的还有线程,四核八线程,六核十二线程,cpu的线程对吧,我是挺喜欢自己装台式机的,16年暑假买了点垃圾给老电脑升级,用四核八线程的E3V2换了老电脑的那块双核?线程的奔腾g3x20(我都记不清型号了haha),瞬间体验上了一个档次,妈妈再也不用担心我后台同时开着迅雷网易云qq巴拉巴啦玩游戏卡了。cpu也是有线程概念的,但是这个线程跟我们的程序的线程不是一个东西,此线程非彼线程。
我上网查过,有些人说一个是硬件概念,一个是软件概念,emmmm,确实是这回事儿,但不过好抽象,啥硬件软件呀,不都叫线程嘛,抽象抽象。
同时,我们经常使用的任务管理器中也有线程的概念,如下图所示
任务管理器截图
性能cpu这里也有线程,还有2千多个,疯了疯了,这到底什么鬼。下面我想了一个例子,来解释cpu与多线程程序之间的关系以及多线程执行的过程,理解了这些关系,此彼线程也就能不那么模糊了。

多线程程序与CPU的关系

我们不把cpu的线程与程序的线程区分开,而把它们统一看成一根根水管,cpu呢看成是抽水泵,程序看成是水箱。执行程序的过程就看做是抽水泵把水箱灌满的过程。这里的我们cpu假设成四核八线程的cpu,那么这个cpu就是一个有着8根出水管的水泵;而水箱有很多,它们排着队等着想被水泵灌满,我们这里挑一个有四个线程的多线程程序来举例,也就是一个有着四根入水管的水箱。
要把水箱灌满,那么必须把水管给它连起来,用水泵的四根出水管连接水箱的四根入水管就ok了。那么我们从水泵来看,水泵就拥有同时给八根管子输送水的能力。而从水箱的角度来看,它就拥有同时被四根水管输送水的能力。注意这里的“给”与“被”。
在这里插入图片描述
我们再将目光移到多线程程序上来看,我们关注它的一根入水管,这根入水管是希望与水泵的出水管连接的,然后输送水到水箱中,但是水泵是公共的,从上面任务管理器的截图来看,有196个进程,2392个程序线程等着输送水呢。想象一下,你家水箱去接水,后面还有好多个人带着水箱排着队呢,你一直占着水泵不合适吧,要是让你把水泵的这根出水管一直占着,那其他人不就等急死了嘛。所以你得把水箱的这根入水管接到水泵的出水管上,然后水泵哗啦啦的向水箱输送水,就一小会儿,你还没装多少水,就得把管子拔了,把位置让给你后面排队的人,然后自己重新排队。由于你们换的速度很快很快,一秒钟在同一根出水管上更换入水管的水箱数太多太多,所以你甚至没有感觉到自己曾经离开过水泵的出水管,感觉自己一直在被服务,连冷战都没打,很顺滑。而对于水泵的这根出水管来说,它已经服务了不知道多少个水箱了。所以每个水箱都以为自己一直在被水泵的这根出水管注水,从未间断。在这里,更换的频率就是系统所规定的切换线程的时间片的倒数。而每次能注入多少水,那就要看cpu的能力了,主频啊,IPC这些等等。
由于每个水箱的入水管都以为自己一直在被注水,那么每个程序都以为自己的每个线程都在每时每刻占用cpu,它个各个线程在自己看来是并行的,如果没有通信的话,就是相互之间不干扰的。而在cpu的一个线程看来,它一秒钟服务了很多程序,在它看来,那些程序是并发的。
而当我的水泵并没有那么多个出水管时呢,比如单核单线程的cpu,要运行一个四线程的多线程程序,那么四个入水管会在一个出水管下面排队,他们会交替执行,当然顺讯不确定,要看优先级还有概率,那此时,四个线程就不是同时运行的了。

多线程程序存在意义

一般我们的一个程序,从main()方法进入,会一直从第一行代码运行到最后一行,它只会占用cpu的的一个线程。而当出现这两种情况时:

  1. 程序存在多个可以分开执行的业务。
  2. 程序中途会调用一些慢速设备,比如IO,此时需要等待,等待的时间不如做些后续工作,以提高运行效率。

此时,我们使用多线程,便可以提高运行效率,节省时间,这便是多线程存在的意义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值