目录
🐶6.1 并发与并行
🐶6.2 串行与并行
1. 基本概念
2. 举个🌰
3. 适用场景
🐶6.3 线程与进程
1. 基本概念
2. 进程与线程的区别
3. 线程调度:
🐶6.1 并发与并行
-
并行:指两个或多个事件在同一时刻发生(同时发生)。
-
并发:指两个或多个事件在同一个时间段内发生。
在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。
而在多个 CPU 系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU),实现多任务并行执行,即利用每个处理器来处理一个可以并发执行的程序,这样多个程序便可以同时执行。目前电脑市场上说的多核 CPU,便是多核处理器,核越多,并行处理的程序越多,能大大的提高电脑运行的效率。
注意:单核处理器的计算机肯定是不能并行的处理多个任务的,只能是多个任务在单个CPU上并发运行。同理, 线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。
🐶6.2 串行与并行
1. 基本概念
串行和并行是计算机领域中两个重要的概念。
串行是指在计算机中,任务按照顺序一个一个执行,每个任务执行完后才能执行下一个任务。
而并行是指多个任务同时进行,即多个任务在同一时刻进行,彼此之间相互独立。
2. 举个🌰
①假设有一个需要打印100份文件的任务,如果使用串行方式,就是打印一份文件,等打印完成后再打印下一份文件,这样需要耗费很长时间。而如果使用并行方式,可以同时启动多个打印机,每个打印机打印不同的文件,这样可以大大缩短打印时间。
②假设有一个需要将图片转换成PDF格式的任务,如果使用串行方式,就是一个一个转换,等一个转换任务完成后再进行下一个转换任务。而如果使用并行方式,可以同时启动多个转换任务,每个任务处理不同的图片,这样可以大大提高转换速度。
3. 适用场景
串行和并行都有各自适用的场景,下面列举一些常见的场景:
串行场景:
-
单核CPU执行任务,因为单核CPU只能处理一个任务,只能采用串行方式;
-
需要保证任务的顺序性,即必须先完成前一个任务才能进行下一个任务的场景,如编译代码时需要按照文件依赖关系依次编译;
-
任务之间存在依赖关系,后一个任务需要使用前一个任务的输出结果作为输入,如数据处理任务。
并行场景:
-
多核CPU执行任务,因为多核CPU可以同时处理多个任务,可以采用并行方式;
-
需要加速任务的执行速度,如图像处理、视频编码、数据挖掘等计算密集型任务;
-
任务之间不存在依赖关系,可以独立执行,如多个用户同时访问网站的请求处理。
总之,串行和并行各有优缺点,需要根据具体场景选择合适的方式。
🐶6.3 线程与进程
1. 基本概念
-
进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
-
线程:进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
进程
线程
2. 进程与线程的区别
-
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
-
线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小的多。
**注意:**下面内容为了解知识点
1:因为一个进程中的多个线程是并发运行的,那么从微观角度看也是有先后顺序的,哪个线程执行完全取决于 CPU 的调度,程序员是干涉不了的。而这也就造成的多线程的随机性。
2:Java 程序的进程里面至少包含两个线程,主进程也就是 main()方法线程,另外一个是垃圾回收机制线程。每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。
3:由于创建一个线程的开销比创建一个进程的开销小的多,那么我们在开发多任务运行的时候,通常考虑创建多线程,而不是创建多进程。
3. 线程调度:
计算机通常只有一个CPU时,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指令。所谓多进程并发运行,从宏观上看,其实是各个进程轮流获得CPU的使用权,分别执行各自的任务。那么,在可运行池中,会有多个线程处于就绪状态等到CPU,JVM就负责了线程的调度。JVM采用的是抢占式调度,没有采用分时调度,因此可以能造成多线程执行结果的的随机性。