进程和线程的区别(经典)

目录

进程和线程

进程的概念:

线程的概念:

进程和线程的区别

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

图解

多进程和多线程的区别

1,多进程的概念

多进程的优缺点

 2,多线程的概念

多线程的优点

Java中的多线程


进程和线程

进程的概念:

进程是操作系统对一个正在运行的程序的一种抽象, 可以这么说 , 进程可以看作是一个程序的一次运行过程, 在操作系统里面, 进程又是操作系统进行资源分配的基本单位.

线程的概念:

线程是什么?  一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 具体的概念和线程差不多 , 但是可以把线程看作是 轻量级进程

[ 创建线程比创建进程要更快 ,  销毁线程比销毁进程要更快 , 调度线程比调度进程要更快 ]

进程和线程的区别

1. 进程是系统进行资源分配和调度的一个独立单位,线程是程序执行的最小单位。 2. 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。 3. 由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。 4. 线程的创建、切换及终止效率更高。

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

图解

 一个进程可以有多个线程,多个线程共享进程的堆和方法区(JDK 1.8 之后的元空间)资源。但是每个线程有自己的程序计数器、虚拟机栈和本地方法栈**。

(1) 程序计数器为什么是私有的?

首先明确程序计数器的作用:

字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制。如:顺序执行、选择、循环、异常处理。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程运行到哪了。
需要注意的是:如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。

所以,程序计数器私有主要是为了线程切换后能够恢复到正确的执行位置。

(2) 虚拟机栈和本地方法栈为什么是私有的?

虚拟机栈:每个Java 方法在执行的同时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至完成的过程,就对应一个帧栈在 Java 虚拟机中入栈和出栈的过程。
本地方法栈:和虚拟机的作用非常相似。区别是:虚拟机为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 native 方法服务。在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。

(3) 堆和方法区

堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用来存放新创建的对象(所有的对象都在这里分配内存);方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。

多进程和多线程的区别

多进程:操作系统中同时运行的多个程序

多线程:在同一个进程中同时运行的多个任务 

1,多进程的概念

 我们现在所使用的计算机的操作系统都是多任务的OS,每个独立执行的任务就是一个进Ctrl+Alt+. 打开任务管理器,如下图,它们每个都是一个进程。

 操作系统如何管理这些进程呢?
​ OS将时间划分为多个时间片,(非常短,纳秒/微秒级),每个时间片内将CPU分配给某一个任务,时间片结束,CPU将自动回收,再分配给另外的任务。从外部看来,所有任务是同时在执行。但是在CPU上,如果是单核CPU,任务是按照串行依次运行;如果是多核CPU,多个进程任务可以并行。
 

多进程的优缺点

  • 多进程的优点
    • 可以同时运行多个任务
    • 程序因IO堵塞时,可以释放CPU,让CPU为其他程序服务
    • 当系统有多个CPU时,可以为多个程序同时服务
  • 多进程的缺点
    • 太笨重,不好管理,不好切换。

 2,多线程的概念

一个程序可以包括多个子任务,可串/并行,每个子任务可以称为一个线程。

多线程的优点

  • 线程共享数据:这些线程都属于同一个程序中,只是不同的子模块,因此,这些线程之间可以共享一部分数据。
  • 线程通讯更高效
  • 线程更轻量级,更容易切换
  • 多个线程更容易管理

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

Java中的多线程


Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等

在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。

Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程
 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值