占坑
其实,进程和线程已经总结过很多次了,每次总结换一个地,现在早就不知道扔到哪里去了,还是老老实实写在博客上吧,还能帮助一下别人
概念:
进程(process):一个正在执行的程序为一个进程,进程是分配资源的最小单位。
线程(thread):线程是进程中更小的单位,代码段的执行靠线程执行,线程是分配CPU时间片的最小资源。
生活情景示例:
双击启动迅雷下载器的thunder.exe程序,可以在资源管理器发现这个程序正在运行,将这个正在运行中的程序成为一个进程。
当我们下载时,发现可以同时下载多个文件资源,并不需要等待一个下载完再下载另一个,执行每个下载任务的是一个个不同的线程。
原理:
多线程的原理,CPU只有一个(暂时不考虑多核情况),如何能够同时执行多个任务而不是排队执行呢?
因为线程是分配CPU时间片的最小单位,且代码段都是由线程执行的,当进程获得CPU的处理权限时,它将自己获得的时间段切成更小的时间片,
由进程内的多个线程轮转使用时间片,这样在宏观上多个线程是同时执行的,表现出的效果是多个任务并行处理,但是在实际中每一个时刻仍然是只执行一个线程。
这样做有什么优点?
CPU资源是宝贵的,如果让CPU经常处于闲置状态对CPU的强大的运力是一个极大的浪费,因为它本可以快速地完成一个个计算任务,所以它的计算潜能如果能够充分挖掘,对程序执行效率会有极大的提升,
但是,几乎所有的程序都不会仅仅是一个CPU处理的过程,它需要反复与低速的内存、磁盘、IO进行交互,这样如果在交互中就让CPU一直等待,就会浪费它本可以利用这些等待时间完成其它任务的运力,
将CPU处理时间分片后,就可以让CPU同时并发地处理多个任务,这样不会因为某个任务的IO等待而完全闲置下来,能更充分地利用CPU,在更短的时间内完成更多的任务。
理想情况下,同时处理多个任务时,可以花费仅仅比最耗时的任务多一点点时间,全部完成这些任务。想象如果一个一个去顺序执行,时间将是任务累加值,很可怕。
说了这么多,我想表达什么呢?就是多线程在同时执行多个任务的情况下能更高效地完成任务。
何时使用多线程呢?
任务中有耗时操作,比如IO请求、网络请求,效果极佳。(耗时操作:读写文件、读写数据库、访问服务器接口...)
区别:
进程用于请求和保持系统资源,提供给各个线程,进程中的线程共享这些资源。进程本身并不会执行代码段,它是依靠线程去执行的,一个进程中至少会有一个主线程。
进程和线程的关系是什么呢?
进程没有线程不能单独完成任务,因为它可以请求资源、保持和分配资源,并不能执行代码段。
线程没有进程也不能单独完成任务,因为它可以获取时间片执行代码段,但它不能申请和保持资源,只能共享进程中的资源。
没错,它俩的关系其实是 黄 金 搭 档 。进程和线程配合完成任务。
为什么要搞两个概念,而不是仅仅用进程解决或线程解决呢?
因为进程比较重量,创建进程、请求资源、资源管理和进程间切换代价太大了,如果多进程解决并发问题,可能进程切换的时间就占了一半,
但是资源必须得有啊,所以在进程的基础上再引入轻量的线程概念,资源请求和管理这些事就交给这一个进程来做吧,并发执行的事就交给线程来做。
这样高低搭配,既实现了并发执行多任务的目的,也让线程切换轻量快速。(当然这样搞也付出了一些代价,就是线程共享资源的并发问题,程序设计就是这样一个取舍的过程,没有总是完美的解决办法)
程序设计中,应该借鉴这种高低搭配的设计思想。也应该理解,程序设计总是有取舍,想成为优秀的程序员,要有能做出正确取舍选择的能力,根据当前的需求做出正确的取舍,不要到了选择的时候正也不是反也不是,拿不出担当来。
应用场景:
并发的网络请求-处理,比如同时发送多个邮件。
并发的IO请求-处理,比如本地文件读写-处理,比如日志系统的读写-处理。
总之,存在耗时操作的任务都适合用多线程处理。(耗时,不是耗费CPU计算时间就算耗时)
凭自己的记忆胡写一通,仅仅作为帮助理解。
下一课题,并发与线程安全