(java)进程和线程的联系和区别

目录

进程 

1.进程具有独立性

————  虚拟地址空间

线程

 为什么要引入多个线程?

 多线程注意点

⁜⁜总结:线程和进程的区别和联系⁜⁜ 


 

进程 

1.进程具有独立性

首先介绍一下

————  虚拟地址空间

在这之前还要了解一下 —— “物理内存”

在早期的操作系统中,程序运行时分配的内存,就是 “物理内存”。

这个物理内存简单理解,就可以看成是一个宿舍楼,宿舍楼里有很多房间,每个房间占一个字节,且每个房间都有编号,这个编号就是“内存地址”。

那现在分配内存就直接从物理内存上分配,但是这时候就会出现问题

(java)进程和线程的联系和区别_第1张图片

而操作系统需要给进程提供一个稳定的运行环境 ,上述的肯定不行。

所以操作系统就引入了 “ 虚拟地址空间 ” 的概念,  不直接分配物理内存了,而是分配一块虚拟的内存空间。操作系统对于内存又进行了一层抽象,如下图。

(java)进程和线程的联系和区别_第2张图片

正是这样的机制,才带来了进程的独立性 。

进程是 资源分配 的基本单位。

(一个系统中可以有很多的进程,每个进程,都有自己的资源)

线程

在Java这样的生态中,不是很鼓励 多进程编程,更鼓励使用 多线程编程 

 为什么要引入多个线程?

为了实现 并发编程  ———— 当前的时代是一个 多核CPU的时代。

虽然多程 实现 并发编程,也是很不错的,但是,多程编程模式 太重了,效率不高,不管是创建,销毁,还是调度一个进程,消耗时间都比较多, 

总的来说,就是多进程 开销比较大,效率比较低。 (进程的开销主要是消耗在了申请资源上,进程是资源分配的基本单位

为了解决上述问题,我们就引入了 “线程(Thread)”。(也叫 “轻量级进程”)

创建,销毁,还是调度一个线程,都比进程要快。

但是线程是不能独立存在的,他必须依附于线程,进程包含线程 。

进程可以包含一个或多个线程。 也就是说,一个进程,最开始至少要包含一个线程,这个线程负责完成 执行代码的工作,也可以根据需要 创建更多的线程,来实现 "并发编程" 的效果。

每个线程都可以独立执行一些代码。 

(java)进程和线程的联系和区别_第3张图片

实际情况,一个进程里有多个线程,而每个线程 ,都是可以独立进行调度的 ,每个线程也都有状态,优先级,上下文,记账信息......

一个进程可能使用一个PCB 或 多个PCB表示,每个PCB 对应到一个线程

上述结构决定了线程的特点

  1. 每个线程都可以 独立 在CPU上调度执行
  2. 同一个进程里的多个线程,共用同一份 内存空间 和 文件资源

所以创建线程的时候 不需要重新 申请资源 ,直接 复用 之前已经给 进程 分配好的资源。

这样就省去了 资源分配的开销,于是创建效率就高了。

画图捋一遍

(java)进程和线程的联系和区别_第4张图片

得出 线程 是 调度执行 的基本单位。 

(一个进程中,可以有很多的线程,每一个 线程 都能 独立调度执行,共享 内存/硬盘 资源)

上述对于 多进程 多线程 的描述还是比较抽象的,那举一个生活上的例子 。

(java)进程和线程的联系和区别_第5张图片

假如,就是现在有个院子,院子里有条生产线,现在产品销量比较好,老板想扩大一下规模,想多搞一条生产线,那现在就是有两个方案。  

方案一: 

(java)进程和线程的联系和区别_第6张图片

在搞一个院子,那就有两条生产线了,但是再找一个院子,成本比较高。

方案二 :

 (java)进程和线程的联系和区别_第7张图片

在同一个院子里再搞一条生产线,是独立的,各自都能生产,但是这两个生产线共用一个院子,一组工人,一套物流体系,这样就节约了成本 还 提高了生产力 (资本家呀~)

方案一就使用了 多进程的方式 方案二就使用了 多线程的方式。

 多线程注意点

  1. 当到了一定程度时,再进一步增加线程数目时,效率无法进一步提升,反而会因为要调度     的线程数目太多,时调度的开销更大,反而会降低了效率。
  2. 当线程数目多了,可能就会产生一定的冲突,称为 "线程不安全问题" 。
  3. 如果一个线程抛出异常,没有被妥善处理(catch),就容易把整个进程都搞崩溃,那其他线程也就都没了。

⁜⁜总结:线程和进程的区别和联系⁜⁜ 

  1. 进程 可以包含一个或多个 线程
  2. 进程和线程都是用来实现 “并发编程” 场景的,但是线程比进程更轻量,更高效
  3. 在同一个进程里的线程,共用同一份资源(内存 和 硬盘),省去了申请资源的开销
  4. 进程具有独立性,一个进程挂了,不会影响到其他进程;同一个 进程 里的 线程,是可能会相互影响的 (线程安全问题 + 线程出现异常)
  5. 进程是资源分配的基本单位,线程是调度执行的基本单位。

╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯ 

你可能感兴趣的:(Java,java,开发语言)