zoukankan      html  css  js  c++  java
  • [01] 进程和线程


    1、进程和线程是什么

    在理解进程和线程之前,必须要知道的一个基本事实就是,单个CPU一次只能运行一个任务。我们所知道的多任务其实是因为CPU太快太快太快了,它不断在多个任务之间切换执行,以至于在我们看来他就是同时在执行多个任务,实则不然。

    那么进程和线程是什么?

    假设现在有这样的程序代码A和B,执行程序代码所需要的资源如RAM/显卡/GPS等(除了CPU),也即是程序代码的运行资源环境,我们暂且称之为程序的上下文。于是A和B在执行的时候:
    • CPU先加载程序A的上下文,然后执行A,保存程序A的上下文
    • 调入下一个要执行的程序B的上下文,执行B,保存B的上下文
    • ...

    A的粒度实际上还显得太大,因为在其中还有代码片段a1,a2... 程序代码B同理。那么在执行A时,实际上是执行a1,a2,a3等等的过程,这里的代码片段a1/a2/a3,粒度更小,它们的上下文资源环境也都是共享的,即A程序代码的上下文。

    于是进程和线程就来了,它们都是CPU工作时间段的利用,不过粒度大小不同
    • 这里的A/B就是进程
    • a1/a2/a3或b1/b2/b3就是线程

    那么表象看来是什么呢?打开windows的任务管理器,你就可以看到很多个进程:
     
    进程就是一个可执行的程序的一次运行过程,它是系统进行资源分配和调度的一个独立单位。如我们打开QQ(TIM版),就是开了一个进程,在这个进程里,我们传输文字,开了一个线程;传输语音,又开了一个线程。线程是程序中的一个执行流,它是属于进程的, 每个线程都有自己专有的寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数

     
    所以,进程和线程的联系大概如下:
    • 一个线程只能属于一个进程,但是一个进程可以拥有多个线程
    • 系统资源分配给进程,同一进程中所有线程共享该进程的所有资源
    • 线程是指进程内的一个执行单元,也是进程内的可调度实体

    在参考链接中,有一篇文章极其形象和容易理解,是阮一峰老师的《进程与线程的一个简单解释》,强烈强烈强烈推荐大家阅读了。

    2、多线程

    多线程,是指程序中包含多个执行流,即一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

    优势:
    • Java支持编写多线程的程序
    • 多线程可以同时并发执行多个任务
    • 多线程最大限度地降低CPU的限制时间,从而提高CPU的利用率

    缺点:
    • 线程同样占用内存,线程越多占用内存也越多
    • 多线程需要协调和管理,共享资源会相互影响

    任何一个Java程序至少有一个线程,即主线程(执行main方法),它是产生其他线程子线程的线程,通常最后结束,因为要执行其他子线程的关闭工作。

    3、参考链接


  • 相关阅读:
    P4318 完全平方数 [二分答案+容斥+莫比乌斯函数]
    P2522 [HAOI2011]Problem b
    莫比乌斯反演学习笔记
    UVALive646 Deranged Exams [容斥+排列组合]
    HDU5514 Frogs [容斥(II)]
    P2567 [SCOI2010]幸运数字 [容斥+有技巧的搜索]
    微信api退款操作
    类中或者是程序集中,根据虚拟路径获取绝对路径
    加载程序集中内嵌资源
    .NET Framework 框架简述01
  • 原文地址:https://www.cnblogs.com/deng-cc/p/8250593.html
Copyright © 2011-2022 走看看