2018/12/4 彻底搞懂进程和线程

占坑


 其实,进程和线程已经总结过很多次了,每次总结换一个地,现在早就不知道扔到哪里去了,还是老老实实写在博客上吧,还能帮助一下别人

概念:

进程(process):一个正在执行的程序为一个进程,进程是分配资源的最小单位。

线程(thread):线程是进程中更小的单位,代码段的执行靠线程执行,线程是分配CPU时间片的最小资源。

 

生活情景示例:

双击启动迅雷下载器的thunder.exe程序,可以在资源管理器发现这个程序正在运行,将这个正在运行中的程序成为一个进程。

当我们下载时,发现可以同时下载多个文件资源,并不需要等待一个下载完再下载另一个,执行每个下载任务的是一个个不同的线程。

 

原理:

多线程的原理,CPU只有一个(暂时不考虑多核情况),如何能够同时执行多个任务而不是排队执行呢?

因为线程是分配CPU时间片的最小单位,且代码段都是由线程执行的,当进程获得CPU的处理权限时,它将自己获得的时间段切成更小的时间片,

由进程内的多个线程轮转使用时间片,这样在宏观上多个线程是同时执行的,表现出的效果是多个任务并行处理,但是在实际中每一个时刻仍然是只执行一个线程。

 

这样做有什么优点?

CPU资源是宝贵的,如果让CPU经常处于闲置状态对CPU的强大的运力是一个极大的浪费,因为它本可以快速地完成一个个计算任务,所以它的计算潜能如果能够充分挖掘,对程序执行效率会有极大的提升,

但是,几乎所有的程序都不会仅仅是一个CPU处理的过程,它需要反复与低速的内存、磁盘、IO进行交互,这样如果在交互中就让CPU一直等待,就会浪费它本可以利用这些等待时间完成其它任务的运力,

将CPU处理时间分片后,就可以让CPU同时并发地处理多个任务,这样不会因为某个任务的IO等待而完全闲置下来,能更充分地利用CPU,在更短的时间内完成更多的任务。

理想情况下,同时处理多个任务时,可以花费仅仅比最耗时的任务多一点点时间,全部完成这些任务。想象如果一个一个去顺序执行,时间将是任务累加值,很可怕。

说了这么多,我想表达什么呢?就是多线程在同时执行多个任务的情况下能更高效地完成任务。

 

何时使用多线程呢?

任务中有耗时操作,比如IO请求、网络请求,效果极佳。(耗时操作:读写文件、读写数据库、访问服务器接口...)

 

区别:

进程用于请求和保持系统资源,提供给各个线程,进程中的线程共享这些资源。进程本身并不会执行代码段,它是依靠线程去执行的,一个进程中至少会有一个主线程。

进程和线程的关系是什么呢?

进程没有线程不能单独完成任务,因为它可以请求资源、保持和分配资源,并不能执行代码段。

线程没有进程也不能单独完成任务,因为它可以获取时间片执行代码段,但它不能申请和保持资源,只能共享进程中的资源。

没错,它俩的关系其实是 黄 金 搭 档 。进程和线程配合完成任务。

为什么要搞两个概念,而不是仅仅用进程解决或线程解决呢?

因为进程比较重量,创建进程、请求资源、资源管理和进程间切换代价太大了,如果多进程解决并发问题,可能进程切换的时间就占了一半,

但是资源必须得有啊,所以在进程的基础上再引入轻量的线程概念,资源请求和管理这些事就交给这一个进程来做吧,并发执行的事就交给线程来做。

这样高低搭配,既实现了并发执行多任务的目的,也让线程切换轻量快速。(当然这样搞也付出了一些代价,就是线程共享资源的并发问题,程序设计就是这样一个取舍的过程,没有总是完美的解决办法)

程序设计中,应该借鉴这种高低搭配的设计思想。也应该理解,程序设计总是有取舍,想成为优秀的程序员,要有能做出正确取舍选择的能力,根据当前的需求做出正确的取舍,不要到了选择的时候正也不是反也不是,拿不出担当来。

 

应用场景:

并发的网络请求-处理,比如同时发送多个邮件。

并发的IO请求-处理,比如本地文件读写-处理,比如日志系统的读写-处理。

 总之,存在耗时操作的任务都适合用多线程处理。(耗时,不是耗费CPU计算时间就算耗时)

 

凭自己的记忆胡写一通,仅仅作为帮助理解。

 

 

 

 

 

下一课题,并发与线程安全

 

转载于:https://www.cnblogs.com/lbzhu/p/10062010.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值