1.1 线程和进程
计算机发展初期进程既是资源分配也是调度的最小单位,那时候没有线程的概念,但是由于CPU性能越来越好,后来为了不浪费cpu资源,才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。多个线程可以共享进程中的绝大部分资源(内存等)。(超线程也是为了充分利用CPU资源而诞生)
定义:进程是OS操作系统资源分配的基本单位,而线程是CPU调度和执行的基本单位(我理解为资源调度的基本单位);
关系:进程是线程的容器,不存在没有线程的进程,所以线程也被称为轻量级进程。
内存分配:系统会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存,线程组之间共享所属进程的资源。
进程拥有自己的资源空间,每启动一个进程,系统就会为它分配地址空间和其他资源;而线程与CPU资源分配无关,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,栈等),进程的其他资源多个线程共享。(服务器中我们的JVM就是一个进程,里面可以创建很多线程)
资源共享和资源同步:进程拥有各自独立的地址空间,资源,所以共享复杂,需要用IPC(进程间通信),同步简单;线程共享所属进程的资源,共享简单,但同步复杂,要通过加锁等措施。
进程占用内存多,切换复杂,CPU利用率低; 线程占用内存少,切换简单,CPU利用率高
相互影响: 因为进程拥有各自独立的地址空间和资源,因此不会相互影响;线程共享所属进程的资源,所以一个线程挂掉可能会导致整个进程挂掉。
1.2 超线程技术
物理CPU:硬件层面的实际CPU 逻辑CPU:支持超线程的机器逻辑CPU为物理CPU的2倍,不支持超线程的机器逻辑CPU没用意义,和物理CPU数量一样。
超线程是英特尔研发的一种技术。此技术实现了在一个实体CPU中,提供两个逻辑线程。超线程的目的,是提升处理器的逻辑线程,进而充分发挥CPU的资源。
超线程技术把处理器内部的两个逻辑内核模拟成两个物理芯片,让单个处理器就能同时运行两个线程,实现并行计算。超线程技术可以充分利用空闲CPU资源。但是当两个线程同时需要CPU内相同的某个资源时,没抢到资源的线程必须暂时挂起,直到另一个线程将该资源释放以后才能继续。因此,超线程的性能并不等于两个CPU的性能。
1.3 协程
协程:协程不是进程,也不是线程,它是一个特殊的函数——可以在某个地方挂起,并且可以重新在挂起处继续运行。现在的java多线程可以充分利用多核资源,但是协程本质是一个函数,从函数层面在一个线程下创建多个协程,当一个协程阻塞时(依赖异步回调模式)去执行另一个协程,不需要切换CPU,因为使用的都是当前线程,具体实现方式我还没有研究。大佬们可以给我讲讲,在此谢过。个人感觉就是会有轮询任务一样,执行阻塞直接其他任务。