进程与线程

作者: Jeff_9021 | 来源:发表于2020-06-10 19:03 被阅读0次

一、进程与线程

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念竞争计算机系统资源的基本单位,它包括独立的地址空间,资源以及1个或多个线程。

线程:是进程的一个执行单元,是进程内部调度实体,可以看成是轻量级的进程,是CPU调度和分派的基本单位。

一个程序至少一个进程,一个进程至少一个线程。比如在Windows系统中,一个运行的xx.exe就是一个进程。

区别

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

优缺点:

线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

多进程

1. 多进程优点

每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

通过增加CPU,就可以容易扩充性能;

可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

2. 多进程缺点

逻辑控制复杂,需要和主程序交互;

需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算

多进程调度开销比较大;

多线程

1. 多线程的优点

无需跨进程边界;

程序逻辑和控制方式简单;

所有线程可以直接共享内存和变量等;

线程方式消耗的总资源比进程方式好;

2. 多线程缺点

每个线程与主程序共用地址空间,受限于2GB地址空间;

线程之间的同步和加锁控制比较麻烦;

一个线程的崩溃可能影响到整个程序的稳定性;

到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;

线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU。

何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

举个例子,多线程下载软件,可以同时运行多个线程,但是通过程序运行的结果发现,每一次结果都不一致。 因为多线程存在一个特性:随机性。造成的原因:CPU在瞬间不断切换去处理各个线程而导致的,可以理解成多个线程在抢CPU资源。

多线程提高CPU使用率

多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。

从 JVM 角度说进程和线程之间的关系(重要)

从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器虚拟机栈本地方法栈

堆区:

1.存储的全部是对象,每个对象都du包含一个与之对应的class的信息。(class的目的是得到操作指令)

2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

栈区:

1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:

1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

进程和线程的详细介绍

与超线程CPU在逻辑上模拟双核不同(双核四线程,双核是物理CPU,即可以理解为有二个CPU,而四线程是逻辑),多核CPU每个核心都可以独立执行一个线程,是真正意义的多个物理CPU。

如果你的程序的线程数少于CPU的核心数,且系统此时没有其他进程同时运行,那么这个程序的每个线程会享有一个CPU,当同时运行的线程数多于CPU核心数时,CPU会采用一定的调度算法每隔一段时间就将这些线程调入或调出CPU,以确保每个线程都能分享一部分CPU时间,实现多线程并发。

CPU超线程

相关文章

  • iOS_进程与线程(多进程与多线程)

    iOS_进程与线程(多进程与多线程)

  • Java 线程相关

    目录1.并行与并发2.进程与线程---- 2.1 进程---- 2.2 线程---- 2.3 进程与线程的区别--...

  • 并发编程之进程与线程

    并发编程之进程与线程 2.1 线程与进程 2.1.1 进程 2.1.2 线程 2.1.3 二者对比 2.2 并行与...

  • 进程与线程、线程池

    进程与线程的相关总结进程与线程的简单解释进程: 基本的资源分配资源线程: 最小调度单元 线程安全 线程安全是多线程...

  • 详解iOS面试:进程与线程

    进程与线程 进程 = 资源管理 + 线程, 进程是资源分配单位,线程是 CPU 调度单位 以前没有线程的时候,进程...

  • Python多线程与多进程

    内容简述: 线程与进程的相关概念1、程序,进程,线程,多进程,多线程2、线程的生命周期3、并行与并发,同步与异步4...

  • OpenMP笔记

    进程与线程 进程:进程是正在运行的程序实例线程:线程是进程中实际运作单位,一个进程可以并行多个线程 进程包含如下程...

  • java面试3

    1. 进程与线程的区别? 进程和线程的关系: 进程与线程的区别: 2.struts2和springMVC的区别? ...

  • 22.iOS底层学习之多线程原理

    本篇提纲:1、线程与进程2、多线程3、多线程相关面试题4、线程安全问题5、线程与runloop的关系 线程与进程 ...

  • GO学习笔记(18) - 并发编程(1) - 理解gorouti

    目录 进程、线程与协程 并发模模型介绍 GO并发编程介绍 进程、线程与协程 进程和线程 进程是程序在操作系统中的一...

网友评论

    本文标题:进程与线程

    本文链接:https://www.haomeiwen.com/subject/atpptktx.html