zoukankan      html  css  js  c++  java
  • 2018/12/4 彻底搞懂进程和线程

    占坑


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

    概念:

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

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

    生活情景示例:

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

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

    原理:

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

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

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

    这样做有什么优点?

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

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

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

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

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

    何时使用多线程呢?

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

    区别:

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

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

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

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

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

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

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

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

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

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

    应用场景:

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

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

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

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

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

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/lbzhu/p/10062010.html
Copyright © 2011-2022 走看看