目录
进程
1.进程具有独立性
———— 虚拟地址空间
线程
为什么要引入多个线程?
多线程注意点
⁜⁜总结:线程和进程的区别和联系⁜⁜
进程
1.进程具有独立性
首先介绍一下
———— 虚拟地址空间
在这之前还要了解一下 —— “物理内存”
在早期的操作系统中,程序运行时分配的内存,就是 “物理内存”。
这个物理内存简单理解,就可以看成是一个宿舍楼,宿舍楼里有很多房间,每个房间占一个字节,且每个房间都有编号,这个编号就是“内存地址”。
那现在分配内存就直接从物理内存上分配,但是这时候就会出现问题
而操作系统需要给进程提供一个稳定的运行环境 ,上述的肯定不行。
所以操作系统就引入了 “ 虚拟地址空间 ” 的概念, 不直接分配物理内存了,而是分配一块虚拟的内存空间。操作系统对于内存又进行了一层抽象,如下图。
正是这样的机制,才带来了进程的独立性 。
进程是 资源分配 的基本单位。
(一个系统中可以有很多的进程,每个进程,都有自己的资源)
线程
在Java这样的生态中,不是很鼓励 多进程编程,更鼓励使用 多线程编程
为什么要引入多个线程?
为了实现 并发编程 ———— 当前的时代是一个 多核CPU的时代。
虽然多进程 实现 并发编程,也是很不错的,但是,多进程编程模式 太重了,效率不高,不管是创建,销毁,还是调度一个进程,消耗时间都比较多,
总的来说,就是多进程 开销比较大,效率比较低。 (进程的开销主要是消耗在了申请资源上,进程是资源分配的基本单位)
为了解决上述问题,我们就引入了 “线程(Thread)”。(也叫 “轻量级进程”)
创建,销毁,还是调度一个线程,都比进程要快。
但是线程是不能独立存在的,他必须依附于线程,进程包含线程 。
进程可以包含一个或多个线程。 也就是说,一个进程,最开始至少要包含一个线程,这个线程负责完成 执行代码的工作,也可以根据需要 创建更多的线程,来实现 "并发编程" 的效果。
每个线程都可以独立执行一些代码。
实际情况,一个进程里有多个线程,而每个线程 ,都是可以独立进行调度的 ,每个线程也都有状态,优先级,上下文,记账信息......
一个进程可能使用一个PCB 或 多个PCB表示,每个PCB 对应到一个线程
上述结构决定了线程的特点
- 每个线程都可以 独立 在CPU上调度执行。
- 同一个进程里的多个线程,共用同一份 内存空间 和 文件资源。
所以创建线程的时候 不需要重新 申请资源 ,直接 复用 之前已经给 进程 分配好的资源。
这样就省去了 资源分配的开销,于是创建效率就高了。
画图捋一遍
得出 线程 是 调度执行 的基本单位。
(一个进程中,可以有很多的线程,每一个 线程 都能 独立调度执行,共享 内存/硬盘 资源)
上述对于 多进程 和 多线程 的描述还是比较抽象的,那举一个生活上的例子 。
假如,就是现在有个院子,院子里有条生产线,现在产品销量比较好,老板想扩大一下规模,想多搞一条生产线,那现在就是有两个方案。
方案一:
在搞一个院子,那就有两条生产线了,但是再找一个院子,成本比较高。
方案二 :
在同一个院子里再搞一条生产线,是独立的,各自都能生产,但是这两个生产线共用一个院子,一组工人,一套物流体系,这样就节约了成本 还 提高了生产力 (资本家呀~)
那方案一就使用了 多进程的方式 ,方案二就使用了 多线程的方式。
多线程注意点
- 当到了一定程度时,再进一步增加线程数目时,效率无法进一步提升,反而会因为要调度 的线程数目太多,时调度的开销更大,反而会降低了效率。
- 当线程数目多了,可能就会产生一定的冲突,称为 "线程不安全问题" 。
- 如果一个线程抛出异常,没有被妥善处理(catch),就容易把整个进程都搞崩溃,那其他线程也就都没了。
⁜⁜总结:线程和进程的区别和联系⁜⁜
- 进程 可以包含一个或多个 线程
- 进程和线程都是用来实现 “并发编程” 场景的,但是线程比进程更轻量,更高效
- 在同一个进程里的线程,共用同一份资源(内存 和 硬盘),省去了申请资源的开销
- 进程具有独立性,一个进程挂了,不会影响到其他进程;同一个 进程 里的 线程,是可能会相互影响的 (线程安全问题 + 线程出现异常)
- 进程是资源分配的基本单位,线程是调度执行的基本单位。
╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯完╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯